From 120296beafd109b80a7a8d97a8b3479360674f9b Mon Sep 17 00:00:00 2001 From: XForYouX Date: Fri, 22 Mar 2024 03:50:23 +0100 Subject: [PATCH 001/165] Add 32:9 For Android 32:9 For Android Fix Issue Aspce Ratio --- src/android/app/src/main/res/values/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index a2487f4f11..5331f2b419 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -601,6 +601,7 @@ Force 4:3 Force 21:9 Force 16:10 + Force 32:9 Stretch to window From 52ed4ef9aada7cce7e3687ea2e4b5f66cc2ea53d Mon Sep 17 00:00:00 2001 From: XForYouX Date: Fri, 22 Mar 2024 03:52:54 +0100 Subject: [PATCH 002/165] Add 32:9 For Android Add 32:9 For Android Fix Issue Aspec Ratio --- src/android/app/src/main/res/values/arrays.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 1bd6455b4c..0500bb2a4f 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -142,6 +142,7 @@ @string/ratio_force_four_three @string/ratio_force_twenty_one_nine @string/ratio_force_sixteen_ten + @string/ratio_thirty_two_nine @string/ratio_stretch @@ -151,6 +152,7 @@ 2 3 4 + 5 From 286902ac8a092e5477828ae1ab94b728c347cbbf Mon Sep 17 00:00:00 2001 From: MattTheTekie Date: Fri, 22 Mar 2024 13:35:34 +0100 Subject: [PATCH 003/165] Correct README --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index eeb0acf0a3..c50c7bceba 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ It is written in C++ with portability in mind, and we're actively working on bui Building | Support | License | - Pipelines + Pipelines

## Status @@ -46,22 +46,22 @@ This project is completely free and open source, and anyone can contribute to he Most of the development happens on GitLab. For development discussion, please join us on [Discord](https://discord.gg/suyu). -If you want to contribute, please take a look at the [Contributor's Guide](https://gitlab.com/suyu-emu/suyu/-/wikis/Contributing) and [Developer Information](https://gitlab.com/suyu-emu/suyu/-/wikis/Developer-Information). +If you want to contribute, please take a look at the [Contributor's Guide](https://git.suyu.dev/suyu/suyu/wiki/Contributing) and [Developer Information](https://git.suyu.dev/suyu/suyu/wiki/Developer-Information). You can also contact any of the developers on Discord to learn more about the current state of suyu. ## Downloads -* __Windows__: [Releases](https://gitlab.com/suyu-emu/suyu/-/releases) -* __Linux__: [Releases](https://gitlab.com/suyu-emu/suyu/-/releases) -* __macOS__: [Releases](https://gitlab.com/suyu-emu/suyu/-/releases) -* __Android__: [Releases](https://gitlab.com/suyu-emu/suyu/-/releases) +* __Windows__: [Releases](https://git.suyu.dev/suyu/suyu/releases) +* __Linux__: [Releases](https://git.suyu.dev/suyu/suyu/releases) +* __macOS__: [Releases](https://git.suyu.dev/suyu/suyu/releases) +* __Android__: [Releases](https://git.suyu.dev/suyu/suyu/releases) -We have official builds [here.](https://gitlab.com/suyu-emu/suyu/-/releases) If any website or person is claiming to have a build for suyu, take that with a grain of salt. +We have official builds [here.](https://git.suyu.dev/suyu/suyu/releases) If any website or person is claiming to have a build for suyu, take that with a grain of salt. ## Building -* __Windows__: [Wiki page](https://gitlab.com/suyu-emu/suyu/-/wikis/Building-for-Windows) -* __Linux__: [Wiki page](https://gitlab.com/suyu-emu/suyu/-/wikis/Building-for-Linux) +* __Windows__: [Wiki page](https://git.suyu.dev/suyu/suyu/wiki/Building-for-Windows) +* __Linux__: [Wiki page](https://git.suyu.dev/suyu/suyu/wiki/Building-for-Linux) From a742ec467cc00f1f9ed2fcf8ced98edf8c367cfd Mon Sep 17 00:00:00 2001 From: zqpvr01 Date: Fri, 22 Mar 2024 21:29:52 +0100 Subject: [PATCH 004/165] Update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c50c7bceba..1c3c5f5803 100644 --- a/README.md +++ b/README.md @@ -60,8 +60,10 @@ We have official builds [here.](https://git.suyu.dev/suyu/suyu/releases) If any ## Building -* __Windows__: [Wiki page](https://git.suyu.dev/suyu/suyu/wiki/Building-for-Windows) -* __Linux__: [Wiki page](https://git.suyu.dev/suyu/suyu/wiki/Building-for-Linux) +* __Windows__: [Windows Build](https://git.suyu.dev/suyu/suyu/wiki/Building-For-Windows) +* __Linux__: [Linux Build](https://git.suyu.dev/suyu/suyu/wiki/Building-For-Linux) +* __Android__: [Android Build](https://git.suyu.dev/suyu/suyu/wiki/Building-For-Android) +* __MacOS__: [MacOS Build](https://git.suyu.dev/suyu/suyu/wiki/Building-for-macOS) From c7d2f08de8bb51e323e95211f4553872b565b432 Mon Sep 17 00:00:00 2001 From: Fijxu Date: Fri, 22 Mar 2024 17:40:20 -0300 Subject: [PATCH 005/165] chore: Disable Windows and Mac CI jobs. --- .forgejo/workflows/ci.yml | 43 ++++---- .forgejo/workflows/verify.yml | 188 ++++++++++++++++++---------------- 2 files changed, 121 insertions(+), 110 deletions(-) diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml index 25ef1f0789..6be69600d9 100644 --- a/.forgejo/workflows/ci.yml +++ b/.forgejo/workflows/ci.yml @@ -1,33 +1,38 @@ # SPDX-FileCopyrightText: 2021 yuzu Emulator Project +# SPDX-FileCopyrightText: 2024 suyu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later -name: yuzu-ci +# Actions Documentation: https://forgejo.org/docs/next/user/actions/#list-of-tasks-in-a-repository + +name: suyu-ci on: push: - branches: [ master ] + branches: [ "*" ] tags: [ "*" ] pull_request: - branches: [ master ] + branches: [ "dev" ] jobs: - transifex: - runs-on: ubuntu-latest - container: yuzuemu/build-environments:linux-transifex - if: ${{ github.repository == 'yuzu-emu/yuzu' && !github.head_ref }} - steps: - - uses: actions/checkout@v3 - with: - submodules: recursive - fetch-depth: 0 - - name: Update Translation - run: ./.ci/scripts/transifex/docker.sh - env: - TX_TOKEN: ${{ secrets.TRANSIFEX_API_TOKEN }} +# We don't have transifex for now. +# transifex: +# runs-on: ubuntu-latest +# container: fijxu/build-environments:linux-transifex +# if: ${{ GITHUB_REPOSITORY == 'suyu/suyu' && !GITHUB_HEAD_REF }} +# steps: +# - uses: https://code.forgejo.org/actions/checkout@v3 +# with: +# submodules: recursive +# fetch-depth: 0 +# - name: Update Translation +# run: ./.ci/scripts/transifex/docker.sh +# env: +# TX_TOKEN: ${{ secrets.TRANSIFEX_API_TOKEN }} reuse: runs-on: ubuntu-latest - if: ${{ github.repository == 'yuzu-emu/yuzu' }} + if: ${{ github.repository == 'suyu/suyu' }} steps: - - uses: actions/checkout@v3 - - uses: fsfe/reuse-action@v1 + - uses: https://code.forgejo.org/actions/checkout@v3 + - uses: https://github.com/fsfe/reuse-action@v1 + diff --git a/.forgejo/workflows/verify.yml b/.forgejo/workflows/verify.yml index a9e28eefd0..26f19586e8 100644 --- a/.forgejo/workflows/verify.yml +++ b/.forgejo/workflows/verify.yml @@ -1,11 +1,16 @@ # SPDX-FileCopyrightText: 2022 yuzu Emulator Project +# SPDX-FileCopyrightText: 2024 suyu Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later -name: 'yuzu verify' +# Actions Documentation: https://forgejo.org/docs/next/user/actions/#list-of-tasks-in-a-repository + +name: 'suyu verify' on: pull_request: - branches: [ master ] + branches: [ "dev" ] + push: + branches: [ "dev" ] env: PR_NUMBER: pr${{ github.event.number }} @@ -14,17 +19,17 @@ jobs: name: 'verify format' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: https://code.forgejo.org/actions/checkout@v3 with: submodules: false - name: set up JDK 17 - uses: actions/setup-java@v3 + uses: https://github.com/actions/setup-java@v3 with: java-version: '17' distribution: 'temurin' - name: 'Verify Formatting' run: bash -ex ./.ci/scripts/format/script.sh - build: + build-linux: name: 'test build' needs: format runs-on: ubuntu-latest @@ -39,15 +44,15 @@ jobs: - type: windows image: linux-mingw container: - image: yuzuemu/build-environments:${{ matrix.image }} + image: fijxu/build-environments:${{ matrix.image }} options: -u 1001 steps: - - uses: actions/checkout@v3 + - uses: https://code.forgejo.org/actions/checkout@v3 with: submodules: recursive fetch-depth: 0 - name: Set up cache - uses: actions/cache@v3 + uses: https://code.forgejo.org/actions/cache@v3 id: ccache-restore with: path: ~/.ccache @@ -66,102 +71,102 @@ jobs: env: NO_SOURCE_PACK: "YES" - name: Upload - uses: actions/upload-artifact@v3 + uses: https://code.forgejo.org/actions/upload-artifact@v3 with: name: ${{ matrix.type }} path: artifacts/ - build-mac: - name: 'test build (macos)' - needs: format - runs-on: macos-14 - steps: - - uses: actions/checkout@v3 - with: - submodules: recursive - fetch-depth: 0 - - name: Install dependencies - run: | - brew install autoconf automake boost ccache ffmpeg fmt glslang hidapi libtool libusb lz4 ninja nlohmann-json openssl pkg-config qt@5 sdl2 speexdsp zlib zlib zstd - - name: Build - run: | - mkdir build - cd build - export Qt5_DIR="$(brew --prefix qt@5)/lib/cmake" - cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DSUYU_USE_BUNDLED_VCPKG=OFF -DSUYU_TESTS=OFF -DENABLE_WEB_SERVICE=OFF -DENABLE_LIBUSB=OFF - ninja - build-msvc: - name: 'test build (windows, msvc)' - needs: format - runs-on: windows-2022 - steps: - - uses: actions/checkout@v3 - with: - submodules: recursive - fetch-depth: 0 - - name: Set up cache - uses: actions/cache@v3 - with: - path: ~/.buildcache - key: ${{ runner.os }}-msvc-${{ github.sha }} - restore-keys: | - ${{ runner.os }}-msvc- - - name: Install dependencies - shell: pwsh - run: | - $ErrorActionPreference = "Stop" - $BuildCacheVer = "v0.28.4" - $File = "buildcache-windows.zip" - $Uri = "https://github.com/mbitsnbites/buildcache/releases/download/$BuildCacheVer/$File" - $WebClient = New-Object System.Net.WebClient - $WebClient.DownloadFile($Uri, $File) - 7z x $File - $CurrentDir = Convert-Path . - echo "$CurrentDir/buildcache/bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - - name: Install Vulkan SDK - shell: pwsh - run: .\.ci\scripts\windows\install-vulkan-sdk.ps1 - - name: Set up MSVC - uses: ilammy/msvc-dev-cmd@v1 - - name: Configure - env: - CC: cl.exe - CXX: cl.exe - run: | - glslangValidator --version - mkdir build - cmake . -B build -GNinja -DCMAKE_TOOLCHAIN_FILE="CMakeModules/MSVCCache.cmake" -DUSE_CCACHE=ON -DSUYU_USE_BUNDLED_QT=1 -DSUYU_USE_BUNDLED_SDL2=1 -DSUYU_USE_QT_WEB_ENGINE=ON -DENABLE_COMPATIBILITY_LIST_DOWNLOAD=ON -DSUYU_ENABLE_COMPATIBILITY_REPORTING=ON -DUSE_DISCORD_PRESENCE=ON -DENABLE_QT_TRANSLATION=ON -DCMAKE_BUILD_TYPE=Release -DGIT_BRANCH=pr-verify -DSUYU_CRASH_DUMPS=ON - - name: Build - run: cmake --build build - - name: Cache Summary - run: buildcache -s - - name: Pack - shell: pwsh - run: .\.ci\scripts\windows\upload.ps1 - - name: Upload - uses: actions/upload-artifact@v3 - with: - name: msvc - path: artifacts/ - - name: Upload EXE - uses: actions/upload-artifact@v3 - with: - name: ${{ env.INDIVIDUAL_EXE }} - path: ${{ env.INDIVIDUAL_EXE }} + # build-mac: + # name: 'test build (macos)' + # needs: format + # runs-on: macos-14 + # steps: + # - uses: https://code.forgejo.org/actions/checkout@v3 + # with: + # submodules: recursive + # fetch-depth: 0 + # - name: Install dependencies + # run: | + # brew install autoconf automake boost ccache ffmpeg fmt glslang hidapi libtool libusb lz4 ninja nlohmann-json openssl pkg-config qt@5 sdl2 speexdsp zlib zlib zstd + # - name: Build + # run: | + # mkdir build + # cd build + # export Qt5_DIR="$(brew --prefix qt@5)/lib/cmake" + # cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DSUYU_USE_BUNDLED_VCPKG=OFF -DSUYU_TESTS=OFF -DENABLE_WEB_SERVICE=OFF -DENABLE_LIBUSB=OFF + # ninja + # build-msvc: + # name: 'test build (windows, msvc)' + # needs: format + # runs-on: windows-2022 + # steps: + # - uses: https://code.forgejo.org/actions/checkout@v3 + # with: + # submodules: recursive + # fetch-depth: 0 + # - name: Set up cache + # uses: https://code.forgejo.org/actions/cache@v3 + # with: + # path: ~/.buildcache + # key: ${{ runner.os }}-msvc-${{ github.sha }} + # restore-keys: | + # ${{ runner.os }}-msvc- + # - name: Install dependencies + # shell: pwsh + # run: | + # $ErrorActionPreference = "Stop" + # $BuildCacheVer = "v0.28.4" + # $File = "buildcache-windows.zip" + # $Uri = "https://github.com/mbitsnbites/buildcache/releases/download/$BuildCacheVer/$File" + # $WebClient = New-Object System.Net.WebClient + # $WebClient.DownloadFile($Uri, $File) + # 7z x $File + # $CurrentDir = Convert-Path . + # echo "$CurrentDir/buildcache/bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + # - name: Install Vulkan SDK + # shell: pwsh + # run: .\.ci\scripts\windows\install-vulkan-sdk.ps1 + # - name: Set up MSVC + # uses: https://github.com/ilammy/msvc-dev-cmd@v1 + # - name: Configure + # env: + # CC: cl.exe + # CXX: cl.exe + # run: | + # glslangValidator --version + # mkdir build + # cmake . -B build -GNinja -DCMAKE_TOOLCHAIN_FILE="CMakeModules/MSVCCache.cmake" -DUSE_CCACHE=ON -DSUYU_USE_BUNDLED_QT=1 -DSUYU_USE_BUNDLED_SDL2=1 -DSUYU_USE_QT_WEB_ENGINE=ON -DENABLE_COMPATIBILITY_LIST_DOWNLOAD=ON -DSUYU_ENABLE_COMPATIBILITY_REPORTING=ON -DUSE_DISCORD_PRESENCE=ON -DENABLE_QT_TRANSLATION=ON -DCMAKE_BUILD_TYPE=Release -DGIT_BRANCH=pr-verify -DSUYU_CRASH_DUMPS=ON + # - name: Build + # run: cmake --build build + # - name: Cache Summary + # run: buildcache -s + # - name: Pack + # shell: pwsh + # run: .\.ci\scripts\windows\upload.ps1 + # - name: Upload + # uses: https://code.forgejo.org/actions/upload-artifact@v3 + # with: + # name: msvc + # path: artifacts/ + # - name: Upload EXE + # uses: https://code.forgejo.org/actions/upload-artifact@v3 + # with: + # name: ${{ env.INDIVIDUAL_EXE }} + # path: ${{ env.INDIVIDUAL_EXE }} android: runs-on: ubuntu-latest needs: format steps: - - uses: actions/checkout@v3 + - uses: https://code.forgejo.org/actions/checkout@v3 with: submodules: recursive fetch-depth: 0 - name: set up JDK 17 - uses: actions/setup-java@v3 + uses: https://github.com/actions/setup-java@v3 with: java-version: '17' distribution: 'temurin' - name: Set up cache - uses: actions/cache@v3 + uses: https://code.forgejo.org/actions/cache@v3 with: path: | ~/.gradle/caches @@ -171,7 +176,7 @@ jobs: restore-keys: | ${{ runner.os }}-android- - name: Query tag name - uses: olegtarasov/get-tag@v2.1.2 + uses: https://github.com/olegtarasov/get-tag@v2.1.2 id: tagName - name: Install dependencies run: | @@ -186,7 +191,8 @@ jobs: ANDROID_KEYSTORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASS }} run: ./.ci/scripts/android/upload.sh - name: Upload - uses: actions/upload-artifact@v3 + uses: https://code.forgejo.org/actions/upload-artifact@v3 with: name: android path: artifacts/ + From e509698a9a303fd305964fdc7c9fba10586c289b Mon Sep 17 00:00:00 2001 From: Fijxu Date: Fri, 22 Mar 2024 22:41:59 -0300 Subject: [PATCH 006/165] ci: Linux builds ready to use. --- .forgejo/workflows/ci.yml | 3 +-- .forgejo/workflows/codespell.yml | 9 +++++++- .forgejo/workflows/verify.yml | 22 ++++++++++++-------- README.md | 4 ++-- src/video_core/vulkan_common/vulkan_device.h | 2 +- 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml index 6be69600d9..143ad8982e 100644 --- a/.forgejo/workflows/ci.yml +++ b/.forgejo/workflows/ci.yml @@ -8,13 +8,12 @@ name: suyu-ci on: push: - branches: [ "*" ] + branches: [ "dev" ] tags: [ "*" ] pull_request: branches: [ "dev" ] jobs: -# We don't have transifex for now. # transifex: # runs-on: ubuntu-latest # container: fijxu/build-environments:linux-transifex diff --git a/.forgejo/workflows/codespell.yml b/.forgejo/workflows/codespell.yml index 76fb7ef48c..bf6d35d1e8 100644 --- a/.forgejo/workflows/codespell.yml +++ b/.forgejo/workflows/codespell.yml @@ -9,7 +9,13 @@ # Actions Documentation: https://forgejo.org/docs/next/user/actions/#list-of-tasks-in-a-repository name: codespell -on: pull_request +on: + push: + branches: [ "*" ] + tags: [ "*" ] + pull_request: + branches: [ "*" ] + permissions: {} jobs: codespell: @@ -20,3 +26,4 @@ jobs: with: persist-credentials: false - uses: https://github.com/codespell-project/actions-codespell@master + diff --git a/.forgejo/workflows/verify.yml b/.forgejo/workflows/verify.yml index 26f19586e8..e379168033 100644 --- a/.forgejo/workflows/verify.yml +++ b/.forgejo/workflows/verify.yml @@ -13,20 +13,24 @@ on: branches: [ "dev" ] env: PR_NUMBER: pr${{ github.event.number }} + CCACHE_DIR: '.ccache' + jobs: format: - name: 'verify format' + name: 'Verify Format' runs-on: ubuntu-latest + container: + image: fijxu/build-environments:linux-clang-format steps: - uses: https://code.forgejo.org/actions/checkout@v3 with: submodules: false - - name: set up JDK 17 - uses: https://github.com/actions/setup-java@v3 - with: - java-version: '17' - distribution: 'temurin' + # - name: set up JDK 17 + # uses: https://github.com/actions/setup-java@v3 + # with: + # java-version: '17' + # distribution: 'temurin' - name: 'Verify Formatting' run: bash -ex ./.ci/scripts/format/script.sh build-linux: @@ -55,13 +59,13 @@ jobs: uses: https://code.forgejo.org/actions/cache@v3 id: ccache-restore with: - path: ~/.ccache + path: .ccache key: ${{ runner.os }}-${{ matrix.type }}-${{ github.sha }} restore-keys: | ${{ runner.os }}-${{ matrix.type }}- - name: Create ccache directory if: steps.ccache-restore.outputs.cache-hit != 'true' - run: mkdir -p ~/.ccache + run: mkdir -p .ccache - name: Build run: ./.ci/scripts/${{ matrix.type }}/docker.sh env: @@ -171,7 +175,7 @@ jobs: path: | ~/.gradle/caches ~/.gradle/wrapper - ~/.ccache + .ccache key: ${{ runner.os }}-android-${{ github.sha }} restore-keys: | ${{ runner.os }}-android- diff --git a/README.md b/README.md index 1c3c5f5803..0f6657592a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ **Note**: We do not support or condone piracy in any form. In order to use suyu, you'll need keys from your real Switch system, and games which you have legally obtained and paid for. We do not intend to make money or profit from this project. @@ -74,4 +74,4 @@ If you have any questions, don't hesitate to ask us on [Discord](https://discord ## License -suyu is licensed under the free and open-source GPL v3 license. +suyu is licensed under the free and open-source GPL-3.0-or-later license. diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index 79f62b9241..15dc7b789c 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h @@ -702,7 +702,7 @@ public: return properties.driver.driverID == VK_DRIVER_ID_NVIDIA_PROPRIETARY; } - /// Checks if we are runing MolvenVK. + /// Checks if we are running MolvenVK. bool IsMoltenVK() const noexcept { return properties.driver.driverID == VK_DRIVER_ID_MOLTENVK; } From 42f3dd309e8d89aef74344c5a66d0d1c7d7789a4 Mon Sep 17 00:00:00 2001 From: Exverge Date: Fri, 22 Mar 2024 12:05:03 +0100 Subject: [PATCH 007/165] Update .gitmodules --- .gitmodules | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.gitmodules b/.gitmodules index 318fa81c66..d9fbaf3971 100644 --- a/.gitmodules +++ b/.gitmodules @@ -9,22 +9,22 @@ url = https://github.com/mozilla/cubeb.git [submodule "dynarmic"] path = externals/dynarmic - url = https://gitlab.com/suyu-emu/dynarmic.git + url = https://git.suyu.dev/suyu/dynarmic.git [submodule "libusb"] path = externals/libusb/libusb url = https://github.com/libusb/libusb.git [submodule "discord-rpc"] path = externals/discord-rpc - url = https://gitlab.com/suyu-emu/discord-rpc.git + url = https://git.suyu.dev/suyu/discord-rpc.git [submodule "Vulkan-Headers"] path = externals/Vulkan-Headers url = https://github.com/KhronosGroup/Vulkan-Headers.git [submodule "sirit"] path = externals/sirit - url = https://gitlab.com/suyu-emu/sirit.git + url = https://git.suyu.dev/suyu/sirit.git [submodule "mbedtls"] path = externals/mbedtls - url = https://gitlab.com/suyu-emu/mbedtls.git + url = https://git.suyu.dev/suyu/mbedtls.git [submodule "xbyak"] path = externals/xbyak url = https://github.com/herumi/xbyak.git @@ -57,7 +57,7 @@ url = https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git [submodule "breakpad"] path = externals/breakpad - url = https://gitlab.com/suyu-emu/breakpad.git + url = https://git.suyu.dev/suyu/breakpad.git [submodule "simpleini"] path = externals/simpleini url = https://github.com/brofield/simpleini.git From 1ed34b1e471eb375f679788caba75465803e2f75 Mon Sep 17 00:00:00 2001 From: RadsammyT Date: Thu, 21 Mar 2024 23:52:32 -0400 Subject: [PATCH 008/165] suyu_cmd: allow launching of applets by supplying FrontendAppletParameters as an arg Based off of a patch i saved before I nuked my local copy of the suyu repo from gitlab and replaced it with the one local-hosted --- .../am/service/library_applet_creator.cpp | 142 +++++++++--------- .../am/service/library_applet_creator.h | 2 + src/suyu_cmd/suyu.cpp | 83 ++++++++-- 3 files changed, 140 insertions(+), 87 deletions(-) diff --git a/src/core/hle/service/am/service/library_applet_creator.cpp b/src/core/hle/service/am/service/library_applet_creator.cpp index 3ffb03bc97..4048cb8704 100644 --- a/src/core/hle/service/am/service/library_applet_creator.cpp +++ b/src/core/hle/service/am/service/library_applet_creator.cpp @@ -47,6 +47,75 @@ bool ShouldCreateGuestApplet(AppletId applet_id) { return true; } +std::shared_ptr CreateGuestApplet(Core::System& system, + WindowSystem& window_system, + std::shared_ptr caller_applet, + AppletId applet_id, + LibraryAppletMode mode) { + const auto program_id = static_cast(Service::AM::AppletIdToProgramId(applet_id)); + if (program_id == 0) { + // Unknown applet + return {}; + } + + // TODO: enable other versions of applets + enum : u8 { + Firmware1400 = 14, + Firmware1500 = 15, + Firmware1600 = 16, + Firmware1700 = 17, + }; + + auto process = CreateProcess(system, program_id, Firmware1400, Firmware1700); + if (!process) { + // Couldn't initialize the guest process + return {}; + } + + const auto applet = std::make_shared(system, std::move(process), false); + applet->program_id = program_id; + applet->applet_id = applet_id; + applet->type = AppletType::LibraryApplet; + applet->library_applet_mode = mode; + applet->window_visible = mode != LibraryAppletMode::AllForegroundInitiallyHidden; + + auto broker = std::make_shared(system); + applet->caller_applet = caller_applet; + applet->caller_applet_broker = broker; + caller_applet->child_applets.push_back(applet); + + window_system.TrackApplet(applet, false); + + return std::make_shared(system, broker, applet); +} + +std::shared_ptr CreateFrontendApplet(Core::System& system, + WindowSystem& window_system, + std::shared_ptr caller_applet, + AppletId applet_id, + LibraryAppletMode mode) { + const auto program_id = static_cast(Service::AM::AppletIdToProgramId(applet_id)); + + auto process = std::make_unique(system); + auto applet = std::make_shared(system, std::move(process), false); + applet->program_id = program_id; + applet->applet_id = applet_id; + applet->type = AppletType::LibraryApplet; + applet->library_applet_mode = mode; + + auto storage = std::make_shared(system); + applet->caller_applet = caller_applet; + applet->caller_applet_broker = storage; + applet->frontend = system.GetFrontendAppletHolder().GetApplet(applet, applet_id, mode); + caller_applet->child_applets.push_back(applet); + + window_system.TrackApplet(applet, false); + + return std::make_shared(system, storage, applet); +} + +} // namespace + AppletProgramId AppletIdToProgramId(AppletId applet_id) { switch (applet_id) { case AppletId::OverlayDisplay: @@ -94,79 +163,10 @@ AppletProgramId AppletIdToProgramId(AppletId applet_id) { } } -std::shared_ptr CreateGuestApplet(Core::System& system, - WindowSystem& window_system, - std::shared_ptr caller_applet, - AppletId applet_id, - LibraryAppletMode mode) { - const auto program_id = static_cast(AppletIdToProgramId(applet_id)); - if (program_id == 0) { - // Unknown applet - return {}; - } - - // TODO: enable other versions of applets - enum : u8 { - Firmware1400 = 14, - Firmware1500 = 15, - Firmware1600 = 16, - Firmware1700 = 17, - }; - - auto process = CreateProcess(system, program_id, Firmware1400, Firmware1700); - if (!process) { - // Couldn't initialize the guest process - return {}; - } - - const auto applet = std::make_shared(system, std::move(process), false); - applet->program_id = program_id; - applet->applet_id = applet_id; - applet->type = AppletType::LibraryApplet; - applet->library_applet_mode = mode; - applet->window_visible = mode != LibraryAppletMode::AllForegroundInitiallyHidden; - - auto broker = std::make_shared(system); - applet->caller_applet = caller_applet; - applet->caller_applet_broker = broker; - caller_applet->child_applets.push_back(applet); - - window_system.TrackApplet(applet, false); - - return std::make_shared(system, broker, applet); -} - -std::shared_ptr CreateFrontendApplet(Core::System& system, - WindowSystem& window_system, - std::shared_ptr caller_applet, - AppletId applet_id, - LibraryAppletMode mode) { - const auto program_id = static_cast(AppletIdToProgramId(applet_id)); - - auto process = std::make_unique(system); - auto applet = std::make_shared(system, std::move(process), false); - applet->program_id = program_id; - applet->applet_id = applet_id; - applet->type = AppletType::LibraryApplet; - applet->library_applet_mode = mode; - - auto storage = std::make_shared(system); - applet->caller_applet = caller_applet; - applet->caller_applet_broker = storage; - applet->frontend = system.GetFrontendAppletHolder().GetApplet(applet, applet_id, mode); - caller_applet->child_applets.push_back(applet); - - window_system.TrackApplet(applet, false); - - return std::make_shared(system, storage, applet); -} - -} // namespace - ILibraryAppletCreator::ILibraryAppletCreator(Core::System& system_, std::shared_ptr applet, WindowSystem& window_system) - : ServiceFramework{system_, "ILibraryAppletCreator"}, - m_window_system{window_system}, m_applet{std::move(applet)} { + : ServiceFramework{system_, "ILibraryAppletCreator"}, m_window_system{window_system}, + m_applet{std::move(applet)} { static const FunctionInfo functions[] = { {0, D<&ILibraryAppletCreator::CreateLibraryApplet>, "CreateLibraryApplet"}, {1, nullptr, "TerminateAllLibraryApplets"}, diff --git a/src/core/hle/service/am/service/library_applet_creator.h b/src/core/hle/service/am/service/library_applet_creator.h index a10a769828..80ea6bd1af 100644 --- a/src/core/hle/service/am/service/library_applet_creator.h +++ b/src/core/hle/service/am/service/library_applet_creator.h @@ -35,4 +35,6 @@ private: const std::shared_ptr m_applet; }; +AppletProgramId AppletIdToProgramId(AppletId applet_id); + } // namespace Service::AM diff --git a/src/suyu_cmd/suyu.cpp b/src/suyu_cmd/suyu.cpp index f559c74f5b..5458b0793b 100644 --- a/src/suyu_cmd/suyu.cpp +++ b/src/suyu_cmd/suyu.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -23,9 +24,12 @@ #include "core/core_timing.h" #include "core/cpu_manager.h" #include "core/crypto/key_manager.h" +#include "core/file_sys/content_archive.h" +#include "core/file_sys/nca_metadata.h" #include "core/file_sys/registered_cache.h" #include "core/file_sys/vfs/vfs_real.h" #include "core/hle/service/am/applet_manager.h" +#include "core/hle/service/am/service/library_applet_creator.h" #include "core/hle/service/filesystem/filesystem.h" #include "core/loader/loader.h" #include "frontend_common/config.h" @@ -67,17 +71,23 @@ __declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1; #endif static void PrintHelp(const char* argv0) { - std::cout << "Usage: " << argv0 - << " [options] \n" - "-c, --config Load the specified configuration file\n" - "-f, --fullscreen Start in fullscreen mode\n" - "-g, --game File path of the game to load\n" - "-h, --help Display this help and exit\n" - "-m, --multiplayer=nick:password@address:port" - " Nickname, password, address and port for multiplayer\n" - "-p, --program Pass following string as arguments to executable\n" - "-u, --user Select a specific user profile from 0 to 7\n" - "-v, --version Output version information and exit\n"; + std::cout + << "Usage: " << argv0 + << " [options] \n" + "-c, --config Load the specified configuration file\n" + "-f, --fullscreen Start in fullscreen mode\n" + "-g, --game File path of the game to load\n" + "-h, --help Display this help and exit\n" + "-m, --multiplayer=nick:password@address:port" + " Nickname, password, address and port for multiplayer\n" + "-p, --program Pass following string as arguments to executable\n" + "-u, --user Select a specific user profile from 0 to 7\n" + "-v, --version Output version information and exit\n" + "-l, " + "--applet-params=" + "\"program_id,applet_id,applet_type,launch_type,prog_index,prev_prog_index\"\n" + " Numerical parameters for launching an applet. If applet_id\n" + " is 0, then the provided game will launch, if any.\n"; } static void PrintVersion() { @@ -212,6 +222,7 @@ int main(int argc, char** argv) { bool use_multiplayer = false; bool fullscreen = false; + Service::AM::FrontendAppletParameters load_parameters{}; std::string nickname{}; std::string password{}; std::string address{}; @@ -223,6 +234,7 @@ int main(int argc, char** argv) { {"fullscreen", no_argument, 0, 'f'}, {"help", no_argument, 0, 'h'}, {"game", required_argument, 0, 'g'}, + {"applet-params", required_argument, 0, 'l'}, {"multiplayer", required_argument, 0, 'm'}, {"program", optional_argument, 0, 'p'}, {"user", required_argument, 0, 'u'}, @@ -232,7 +244,7 @@ int main(int argc, char** argv) { }; while (optind < argc) { - int arg = getopt_long(argc, argv, "g:fhvp::c:u:", long_options, &option_index); + int arg = getopt_long(argc, argv, "g:fhvp::c:u:l:", long_options, &option_index); if (arg != -1) { switch (static_cast(arg)) { case 'c': @@ -250,6 +262,27 @@ int main(int argc, char** argv) { filepath = str_arg; break; } + case 'l': { + std::string str_arg(optarg); + str_arg.append(",0"); // FALLBACK: if string is partially completed ("1234,3") + // this will set all those unset to 0. otherwise we get + // all 3s. + std::stringstream stream(str_arg); + std::string sub; + std::getline(stream, sub, ','); + load_parameters.program_id = std::stoull(sub); + std::getline(stream, sub, ','); + load_parameters.applet_id = static_cast(std::stoul(sub)); + std::getline(stream, sub, ','); + load_parameters.applet_type = static_cast(std::stoi(sub)); + std::getline(stream, sub, ','); + load_parameters.launch_type = static_cast(std::stoi(sub)); + std::getline(stream, sub, ','); + load_parameters.program_index = std::stoi(sub); + std::getline(stream, sub, ','); + load_parameters.previous_program_index = std::stoi(sub); + break; + } case 'm': { use_multiplayer = true; const std::string str_arg(optarg); @@ -331,7 +364,7 @@ int main(int argc, char** argv) { Common::ConfigureNvidiaEnvironmentFlags(); - if (filepath.empty()) { + if (filepath.empty() && !static_cast(load_parameters.applet_id)) { LOG_CRITICAL(Frontend, "Failed to load ROM: No ROM specified"); return -1; } @@ -367,9 +400,27 @@ int main(int argc, char** argv) { system.GetFileSystemController().CreateFactories(*system.GetFilesystem()); system.GetUserChannel().clear(); - Service::AM::FrontendAppletParameters load_parameters{ - .applet_id = Service::AM::AppletId::Application, - }; + if (static_cast(load_parameters.applet_id)) { + // code below based off of suyu/main.cpp : GMainWindow::OnHomeMenu() + Service::AM::AppletProgramId applet_prog_id = + Service::AM::AppletIdToProgramId(load_parameters.applet_id); + auto sysnand = system.GetFileSystemController().GetSystemNANDContents(); + if (!sysnand) { + LOG_CRITICAL(Frontend, "Failed to load applet: Firmware not installed."); + return -1; + } + + auto user_applet_nca = sysnand->GetEntry(static_cast(applet_prog_id), + FileSys::ContentRecordType::Program); + if (!user_applet_nca) { + LOG_CRITICAL(Frontend, "Failed to load applet: applet cannot be found."); + return -1; + } + if (filepath.empty()) + filepath = user_applet_nca->GetFullPath(); + } else { + load_parameters.applet_id = Service::AM::AppletId::Application; + } const Core::SystemResultStatus load_result{system.Load(*emu_window, filepath, load_parameters)}; switch (load_result) { From 259e65287f92f543204a692a3b0e847641175dcd Mon Sep 17 00:00:00 2001 From: Exverge Date: Sat, 23 Mar 2024 00:24:42 -0400 Subject: [PATCH 009/165] Fix typo in encryption keys --- src/suyu/main.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index 0d07c8d6d0..e7354e8fa5 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -1755,8 +1755,8 @@ bool GMainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPa if (!ContentManager::AreKeysPresent()) { QMessageBox::warning(this, tr("Derivation Components Missing"), tr("Encryption keys are missing. " - "In order to use this emulator" - "you need to provide your own encryption keys" + "In order to use this emulator, " + "you need to provide your own encryption keys " "in order to play them.")); return false; } @@ -4630,8 +4630,8 @@ void GMainWindow::OnCheckFirmwareDecryption() { if (!ContentManager::AreKeysPresent()) { QMessageBox::warning(this, tr("Derivation Components Missing"), tr("Encryption keys are missing. " - "In order to use this emulator" - "you need to provide your own encryption keys" + "In order to use this emulator, " + "you need to provide your own encryption keys " "in order to play them.")); } From f9c3b8dc758ae6c1baef3a36daaec151d22ebb36 Mon Sep 17 00:00:00 2001 From: RadsammyT Date: Sat, 23 Mar 2024 00:27:27 -0400 Subject: [PATCH 010/165] PR#3 review: -l's arg is now optional --- src/suyu_cmd/suyu.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/suyu_cmd/suyu.cpp b/src/suyu_cmd/suyu.cpp index 5458b0793b..c0757d0821 100644 --- a/src/suyu_cmd/suyu.cpp +++ b/src/suyu_cmd/suyu.cpp @@ -234,7 +234,7 @@ int main(int argc, char** argv) { {"fullscreen", no_argument, 0, 'f'}, {"help", no_argument, 0, 'h'}, {"game", required_argument, 0, 'g'}, - {"applet-params", required_argument, 0, 'l'}, + {"applet-params", optional_argument, 0, 'l'}, {"multiplayer", required_argument, 0, 'm'}, {"program", optional_argument, 0, 'p'}, {"user", required_argument, 0, 'u'}, @@ -244,7 +244,7 @@ int main(int argc, char** argv) { }; while (optind < argc) { - int arg = getopt_long(argc, argv, "g:fhvp::c:u:l:", long_options, &option_index); + int arg = getopt_long(argc, argv, "g:fhvp::c:u:l::", long_options, &option_index); if (arg != -1) { switch (static_cast(arg)) { case 'c': From caa93cda4838404b5b6612689a0c4b212b54ee63 Mon Sep 17 00:00:00 2001 From: RadsammyT Date: Sat, 23 Mar 2024 00:51:40 -0400 Subject: [PATCH 011/165] PR#3 review: (hopefully) unfuck formatting changes squash: re-deanonymize AppletIdToProgramId() --- .../hle/service/am/service/library_applet_creator.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/core/hle/service/am/service/library_applet_creator.cpp b/src/core/hle/service/am/service/library_applet_creator.cpp index 4048cb8704..b4c95a8ff3 100644 --- a/src/core/hle/service/am/service/library_applet_creator.cpp +++ b/src/core/hle/service/am/service/library_applet_creator.cpp @@ -52,7 +52,7 @@ std::shared_ptr CreateGuestApplet(Core::System& system, std::shared_ptr caller_applet, AppletId applet_id, LibraryAppletMode mode) { - const auto program_id = static_cast(Service::AM::AppletIdToProgramId(applet_id)); + const auto program_id = static_cast(AppletIdToProgramId(applet_id)); if (program_id == 0) { // Unknown applet return {}; @@ -94,7 +94,7 @@ std::shared_ptr CreateFrontendApplet(Core::System& syste std::shared_ptr caller_applet, AppletId applet_id, LibraryAppletMode mode) { - const auto program_id = static_cast(Service::AM::AppletIdToProgramId(applet_id)); + const auto program_id = static_cast(AppletIdToProgramId(applet_id)); auto process = std::make_unique(system); auto applet = std::make_shared(system, std::move(process), false); @@ -163,10 +163,11 @@ AppletProgramId AppletIdToProgramId(AppletId applet_id) { } } + ILibraryAppletCreator::ILibraryAppletCreator(Core::System& system_, std::shared_ptr applet, WindowSystem& window_system) - : ServiceFramework{system_, "ILibraryAppletCreator"}, m_window_system{window_system}, - m_applet{std::move(applet)} { + : ServiceFramework{system_, "ILibraryAppletCreator"}, + m_window_system{window_system}, m_applet{std::move(applet)} { static const FunctionInfo functions[] = { {0, D<&ILibraryAppletCreator::CreateLibraryApplet>, "CreateLibraryApplet"}, {1, nullptr, "TerminateAllLibraryApplets"}, From 18ba0f1345daf6ca66e314b1f70250c3e10bb8df Mon Sep 17 00:00:00 2001 From: Crimson-Hawk Date: Sat, 23 Mar 2024 19:20:40 +0800 Subject: [PATCH 012/165] Revert "Merge branch 'XForYouX-dev' into dev" this broke android build This reverts commit 16841915fd0dcf7d72f8be66318ae67c01b61717, reversing changes made to c7d2f08de8bb51e323e95211f4553872b565b432. --- src/android/app/src/main/res/values/arrays.xml | 2 -- src/android/app/src/main/res/values/strings.xml | 1 - 2 files changed, 3 deletions(-) diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 0500bb2a4f..1bd6455b4c 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -142,7 +142,6 @@ @string/ratio_force_four_three @string/ratio_force_twenty_one_nine @string/ratio_force_sixteen_ten - @string/ratio_thirty_two_nine @string/ratio_stretch @@ -152,7 +151,6 @@ 2 3 4 - 5 diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 5331f2b419..a2487f4f11 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -601,7 +601,6 @@ Force 4:3 Force 21:9 Force 16:10 - Force 32:9 Stretch to window From 15ca12c0ec644867b1e6b797a4ba02e4035c7a75 Mon Sep 17 00:00:00 2001 From: nullequal Date: Sat, 23 Mar 2024 16:31:28 +0100 Subject: [PATCH 013/165] Allow NRO files to skip FW and keys' presence checks (#11) doing an old suggestion from the now-deleted "emulator-suggestions" channel on the discord Co-authored-by: nullequal Co-committed-by: nullequal --- src/suyu/main.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index e7354e8fa5..b1a3211823 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -1747,18 +1747,21 @@ void GMainWindow::AllowOSSleep() { } bool GMainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletParameters params) { - if (!CheckFirmwarePresence()) { - QMessageBox::critical(this, tr("Component Missing"), tr("Missing Firmware.")); - return false; - } + if (Loader::IdentifyType(Core::GetGameFileFromPath(vfs, filename.toStdString())) != + Loader::FileType::NRO) { + if (!CheckFirmwarePresence()) { + QMessageBox::critical(this, tr("Component Missing"), tr("Missing Firmware.")); + return false; + } - if (!ContentManager::AreKeysPresent()) { - QMessageBox::warning(this, tr("Derivation Components Missing"), - tr("Encryption keys are missing. " - "In order to use this emulator, " - "you need to provide your own encryption keys " - "in order to play them.")); - return false; + if (!ContentManager::AreKeysPresent()) { + QMessageBox::warning(this, tr("Derivation Components Missing"), + tr("Encryption keys are missing. " + "In order to use this emulator, " + "you need to provide your own encryption keys " + "in order to play them.")); + return false; + } } // Shutdown previous session if the emu thread is still active... From c6d34f6d77e100e6d73176e5855d50f6dc104340 Mon Sep 17 00:00:00 2001 From: Exverge Date: Sat, 23 Mar 2024 12:23:00 -0400 Subject: [PATCH 014/165] fix: compile errors from #11 --- src/suyu/main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index b1a3211823..0d6189a8e9 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -12,6 +12,7 @@ #include #include "core/hle/service/am/applet_manager.h" #include "core/loader/nca.h" +#include "core/loader/nro.h" #include "core/tools/renderdoc.h" #ifdef __APPLE__ @@ -1747,7 +1748,7 @@ void GMainWindow::AllowOSSleep() { } bool GMainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletParameters params) { - if (Loader::IdentifyType(Core::GetGameFileFromPath(vfs, filename.toStdString())) != + if (Loader::AppLoader_NRO::IdentifyType(Core::GetGameFileFromPath(vfs, filename.toStdString())) != Loader::FileType::NRO) { if (!CheckFirmwarePresence()) { QMessageBox::critical(this, tr("Component Missing"), tr("Missing Firmware.")); From bce23c24e03e1a2212c6acff68b55f338eb1c923 Mon Sep 17 00:00:00 2001 From: RadsammyT Date: Sat, 23 Mar 2024 14:51:33 -0400 Subject: [PATCH 015/165] PR#3 review: fix -l arg breaking because optarg goes NULL when encountering an optional argument, so I have to do this instead to get the argument. See case 'p'. --- src/suyu_cmd/suyu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/suyu_cmd/suyu.cpp b/src/suyu_cmd/suyu.cpp index c0757d0821..1a5714950d 100644 --- a/src/suyu_cmd/suyu.cpp +++ b/src/suyu_cmd/suyu.cpp @@ -263,7 +263,7 @@ int main(int argc, char** argv) { break; } case 'l': { - std::string str_arg(optarg); + std::string str_arg(argv[optind++]); str_arg.append(",0"); // FALLBACK: if string is partially completed ("1234,3") // this will set all those unset to 0. otherwise we get // all 3s. From 649a90ff402ac91c819543950950dc32ad615081 Mon Sep 17 00:00:00 2001 From: Fijxu Date: Sat, 23 Mar 2024 16:13:40 -0300 Subject: [PATCH 016/165] ci: Use different runner label for Codespell and Format Verification --- .forgejo/workflows/ci.yml | 3 +- .forgejo/workflows/codespell.yml | 2 +- .../ISSUE_TEMPLATE/blank_issue_template.yml | 10 +++ .gitea/ISSUE_TEMPLATE/bug_report.yml | 64 +++++++++++++++++++ .gitea/ISSUE_TEMPLATE/config.yml | 5 ++ .gitea/ISSUE_TEMPLATE/feature_request.yml | 28 ++++++++ src/suyu/main.cpp | 6 +- 7 files changed, 113 insertions(+), 5 deletions(-) create mode 100644 .gitea/ISSUE_TEMPLATE/blank_issue_template.yml create mode 100644 .gitea/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .gitea/ISSUE_TEMPLATE/config.yml create mode 100644 .gitea/ISSUE_TEMPLATE/feature_request.yml diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml index 143ad8982e..39bbbdf2c6 100644 --- a/.forgejo/workflows/ci.yml +++ b/.forgejo/workflows/ci.yml @@ -29,7 +29,8 @@ jobs: # TX_TOKEN: ${{ secrets.TRANSIFEX_API_TOKEN }} reuse: - runs-on: ubuntu-latest + name: Check REUSE Specification + runs-on: verify if: ${{ github.repository == 'suyu/suyu' }} steps: - uses: https://code.forgejo.org/actions/checkout@v3 diff --git a/.forgejo/workflows/codespell.yml b/.forgejo/workflows/codespell.yml index bf6d35d1e8..d711137d3a 100644 --- a/.forgejo/workflows/codespell.yml +++ b/.forgejo/workflows/codespell.yml @@ -20,7 +20,7 @@ permissions: {} jobs: codespell: name: Check for spelling errors - runs-on: ubuntu-latest + runs-on: verify steps: - uses: https://code.forgejo.org/actions/checkout@v3 with: diff --git a/.gitea/ISSUE_TEMPLATE/blank_issue_template.yml b/.gitea/ISSUE_TEMPLATE/blank_issue_template.yml new file mode 100644 index 0000000000..49b7f38228 --- /dev/null +++ b/.gitea/ISSUE_TEMPLATE/blank_issue_template.yml @@ -0,0 +1,10 @@ +name: New Issue (Developers Only) +description: A blank issue template for developers only. If you are not a developer, do not use this issue template. Your issue WILL BE CLOSED if you do not use the appropriate issue template. +body: + - type: markdown + attributes: + value: | + **If you are not a developer, do not use this issue template. Your issue WILL BE CLOSED if you do not use the appropriate issue template.** + - type: textarea + attributes: + label: "Issue" diff --git a/.gitea/ISSUE_TEMPLATE/bug_report.yml b/.gitea/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000000..041a4ff3bf --- /dev/null +++ b/.gitea/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,64 @@ +name: Bug Report +description: File a bug report +body: + - type: markdown + attributes: + value: Tech support does not belong here. You should only file an issue here if you think you have experienced an actual bug with suyu. + - type: checkboxes + attributes: + label: Is there an existing issue for this? + description: Please search to see if an issue already exists for the bug you encountered. + options: + - label: I have searched the existing issues + required: true + - type: input + attributes: + label: Affected Commit or Release + description: List the affected commits that this issue applies to. + placeholder: Mainline 1234 / Early Access 1234 + validations: + required: true + - type: textarea + id: issue-desc + attributes: + label: Description of Issue + description: A brief description of the issue encountered along with any images and/or videos. + validations: + required: true + - type: textarea + id: expected-behavior + attributes: + label: Expected Behavior + description: A brief description of how it is expected to work along with any images and/or videos. + validations: + required: true + - type: textarea + id: reproduction-steps + attributes: + label: Reproduction Steps + description: A brief explanation of how to reproduce this issue. If possible, provide a save file to aid in reproducing the issue. + validations: + required: true + - type: textarea + id: log + attributes: + label: Log File + description: A log file will help our developers to better diagnose and fix the issue. Instructions can be found [here](https://suyu.dev/help/reference/log-files). + validations: + required: true + - type: textarea + id: system-config + attributes: + label: System Configuration + placeholder: | + CPU: Intel i5-10400 / AMD Ryzen 5 3600 + GPU/Driver: NVIDIA GeForce GTX 1060 (Driver 512.95) + RAM: 16GB DDR4-3200 + OS: Windows 11 22H2 (Build 22621.819) + value: | + CPU: + GPU/Driver: + RAM: + OS: + validations: + required: true diff --git a/.gitea/ISSUE_TEMPLATE/config.yml b/.gitea/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..0be63fdb7a --- /dev/null +++ b/.gitea/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: suyu Discord + url: https://discord.com/invite/suyu + about: If you are experiencing an issue with suyu, and you need tech support, or if you have a general question, try asking in the official suyu Discord linked here. Piracy is not allowed. diff --git a/.gitea/ISSUE_TEMPLATE/feature_request.yml b/.gitea/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000000..c0c27fc0a6 --- /dev/null +++ b/.gitea/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,28 @@ +name: Feature Request +description: File a feature request +labels: "enhancement" +body: + - type: markdown + attributes: + value: Tech support does not belong here. You should only file an issue here if you are requesting a feature you believe would make suyu better. + - type: checkboxes + attributes: + label: Is there an existing issue for this? + description: Please search to see if an issue already exists for the feature you are requesting. + options: + - label: I have searched the existing issues + required: true + - type: textarea + id: what-feature + attributes: + label: What feature are you suggesting? + description: A brief description of the requested feature. + validations: + required: true + - type: textarea + id: why-feature + attributes: + label: Why would this feature be useful? + description: A brief description of why this feature would make suyu better. + validations: + required: true diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index 0d6189a8e9..19148fcfc3 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -1748,8 +1748,8 @@ void GMainWindow::AllowOSSleep() { } bool GMainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletParameters params) { - if (Loader::AppLoader_NRO::IdentifyType(Core::GetGameFileFromPath(vfs, filename.toStdString())) != - Loader::FileType::NRO) { + if (Loader::AppLoader_NRO::IdentifyType( + Core::GetGameFileFromPath(vfs, filename.toStdString())) != Loader::FileType::NRO) { if (!CheckFirmwarePresence()) { QMessageBox::critical(this, tr("Component Missing"), tr("Missing Firmware.")); return false; @@ -1757,7 +1757,7 @@ bool GMainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPa if (!ContentManager::AreKeysPresent()) { QMessageBox::warning(this, tr("Derivation Components Missing"), - tr("Encryption keys are missing. " + tr("Encryption keys are missing. " "In order to use this emulator, " "you need to provide your own encryption keys " "in order to play them.")); From ede4f2d8f40488b03f2096a96b311e1a4ac77c08 Mon Sep 17 00:00:00 2001 From: RadsammyT Date: Sat, 23 Mar 2024 16:39:48 -0400 Subject: [PATCH 017/165] PR#3 review: remove from --help + formatting changes ran clang-format on suyu_cmd/suyu.cpp and removed one blank line on library_applet_accessor.cpp so formatting CI doesn't complain --- .../am/service/library_applet_creator.cpp | 1 - src/suyu_cmd/suyu.cpp | 34 +++++++++---------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/core/hle/service/am/service/library_applet_creator.cpp b/src/core/hle/service/am/service/library_applet_creator.cpp index b4c95a8ff3..c2d9b43639 100644 --- a/src/core/hle/service/am/service/library_applet_creator.cpp +++ b/src/core/hle/service/am/service/library_applet_creator.cpp @@ -163,7 +163,6 @@ AppletProgramId AppletIdToProgramId(AppletId applet_id) { } } - ILibraryAppletCreator::ILibraryAppletCreator(Core::System& system_, std::shared_ptr applet, WindowSystem& window_system) : ServiceFramework{system_, "ILibraryAppletCreator"}, diff --git a/src/suyu_cmd/suyu.cpp b/src/suyu_cmd/suyu.cpp index 1a5714950d..a820e896da 100644 --- a/src/suyu_cmd/suyu.cpp +++ b/src/suyu_cmd/suyu.cpp @@ -71,23 +71,23 @@ __declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1; #endif static void PrintHelp(const char* argv0) { - std::cout - << "Usage: " << argv0 - << " [options] \n" - "-c, --config Load the specified configuration file\n" - "-f, --fullscreen Start in fullscreen mode\n" - "-g, --game File path of the game to load\n" - "-h, --help Display this help and exit\n" - "-m, --multiplayer=nick:password@address:port" - " Nickname, password, address and port for multiplayer\n" - "-p, --program Pass following string as arguments to executable\n" - "-u, --user Select a specific user profile from 0 to 7\n" - "-v, --version Output version information and exit\n" - "-l, " - "--applet-params=" - "\"program_id,applet_id,applet_type,launch_type,prog_index,prev_prog_index\"\n" - " Numerical parameters for launching an applet. If applet_id\n" - " is 0, then the provided game will launch, if any.\n"; + std::cout << "Usage: " << argv0 + << " [options]\n" + "-c, --config Load the specified configuration file\n" + "-f, --fullscreen Start in fullscreen mode\n" + "-g, --game File path of the game to load\n" + "-h, --help Display this help and exit\n" + "-m, --multiplayer=nick:password@address:port" + " Nickname, password, address and port for multiplayer\n" + "-p, --program Pass following string as arguments to executable\n" + "-u, --user Select a specific user profile from 0 to 7\n" + "-v, --version Output version information and exit\n" + "-l, " + "--applet-params=" + "\"program_id,applet_id,applet_type,launch_type,prog_index,prev_prog_index\"\n" + " Numerical parameters for launching an applet. If no\n" + " game is provided, then the applet will launch off of\n" + " the applet_id.\n"; } static void PrintVersion() { From f9f4622b288d12400b56850351d903d49348c1fd Mon Sep 17 00:00:00 2001 From: Fijxu Date: Sat, 23 Mar 2024 17:57:35 -0300 Subject: [PATCH 018/165] ci: Container options in verify.yml negaetes the options in the runner configuration --- .forgejo/workflows/verify.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.forgejo/workflows/verify.yml b/.forgejo/workflows/verify.yml index e379168033..f175fd08f6 100644 --- a/.forgejo/workflows/verify.yml +++ b/.forgejo/workflows/verify.yml @@ -49,7 +49,8 @@ jobs: image: linux-mingw container: image: fijxu/build-environments:${{ matrix.image }} - options: -u 1001 + # User 1001 doesn't exists on the images. + # options: -u 1001 steps: - uses: https://code.forgejo.org/actions/checkout@v3 with: From a7fd09e27f25dc6bb9e5cf7677243ad079a3ce0d Mon Sep 17 00:00:00 2001 From: Fijxu Date: Sat, 23 Mar 2024 17:57:35 -0300 Subject: [PATCH 019/165] ci: Container options in verify.yml negaetes the options in the runner configuration --- .forgejo/workflows/verify.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.forgejo/workflows/verify.yml b/.forgejo/workflows/verify.yml index e379168033..d55df43ea2 100644 --- a/.forgejo/workflows/verify.yml +++ b/.forgejo/workflows/verify.yml @@ -20,8 +20,7 @@ jobs: format: name: 'Verify Format' runs-on: ubuntu-latest - container: - image: fijxu/build-environments:linux-clang-format + container: fijxu/build-environments:linux-clang-format steps: - uses: https://code.forgejo.org/actions/checkout@v3 with: @@ -47,9 +46,9 @@ jobs: image: linux-fresh - type: windows image: linux-mingw - container: - image: fijxu/build-environments:${{ matrix.image }} - options: -u 1001 + container: fijxu/build-environments:${{ matrix.image }} + # User 1001 doesn't exists on the images. + # options: -u 1001 steps: - uses: https://code.forgejo.org/actions/checkout@v3 with: From 82e47a196ece3d99e9f281fd80071664d6749659 Mon Sep 17 00:00:00 2001 From: Exverge Date: Sat, 23 Mar 2024 18:45:38 -0400 Subject: [PATCH 020/165] Fix GPL copyright notice in Android [skip ci] I'll add the relevant "2024 suyu Emulator" notices soon --- src/android/.gitignore | 2 +- src/android/app/build.gradle.kts | 2 +- src/android/app/proguard-rules.pro | 2 +- .../app/src/main/java/org/suyu/suyu_emu/NativeLibrary.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/SuyuApplication.kt | 2 +- .../main/java/org/suyu/suyu_emu/activities/EmulationActivity.kt | 2 +- .../src/main/java/org/suyu/suyu_emu/adapters/AddonAdapter.kt | 2 +- .../src/main/java/org/suyu/suyu_emu/adapters/AppletAdapter.kt | 2 +- .../org/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt | 2 +- .../src/main/java/org/suyu/suyu_emu/adapters/DriverAdapter.kt | 2 +- .../src/main/java/org/suyu/suyu_emu/adapters/FolderAdapter.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/adapters/GameAdapter.kt | 2 +- .../java/org/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt | 2 +- .../main/java/org/suyu/suyu_emu/adapters/HomeSettingAdapter.kt | 2 +- .../main/java/org/suyu/suyu_emu/adapters/InstallableAdapter.kt | 2 +- .../src/main/java/org/suyu/suyu_emu/adapters/LicenseAdapter.kt | 2 +- .../src/main/java/org/suyu/suyu_emu/adapters/SetupAdapter.kt | 2 +- .../suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt | 2 +- .../main/java/org/suyu/suyu_emu/features/DocumentProvider.kt | 2 +- .../suyu_emu/features/settings/model/AbstractBooleanSetting.kt | 2 +- .../suyu_emu/features/settings/model/AbstractByteSetting.kt | 2 +- .../suyu_emu/features/settings/model/AbstractFloatSetting.kt | 2 +- .../suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt | 2 +- .../suyu_emu/features/settings/model/AbstractLongSetting.kt | 2 +- .../suyu/suyu_emu/features/settings/model/AbstractSetting.kt | 2 +- .../suyu_emu/features/settings/model/AbstractShortSetting.kt | 2 +- .../suyu_emu/features/settings/model/AbstractStringSetting.kt | 2 +- .../org/suyu/suyu_emu/features/settings/model/BooleanSetting.kt | 2 +- .../org/suyu/suyu_emu/features/settings/model/ByteSetting.kt | 2 +- .../org/suyu/suyu_emu/features/settings/model/FloatSetting.kt | 2 +- .../org/suyu/suyu_emu/features/settings/model/IntSetting.kt | 2 +- .../org/suyu/suyu_emu/features/settings/model/LongSetting.kt | 2 +- .../java/org/suyu/suyu_emu/features/settings/model/Settings.kt | 2 +- .../org/suyu/suyu_emu/features/settings/model/ShortSetting.kt | 2 +- .../org/suyu/suyu_emu/features/settings/model/StringSetting.kt | 2 +- .../suyu_emu/features/settings/model/view/DateTimeSetting.kt | 2 +- .../suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt | 2 +- .../features/settings/model/view/IntSingleChoiceSetting.kt | 2 +- .../suyu_emu/features/settings/model/view/RunnableSetting.kt | 2 +- .../suyu/suyu_emu/features/settings/model/view/SettingsItem.kt | 2 +- .../features/settings/model/view/SingleChoiceSetting.kt | 2 +- .../suyu/suyu_emu/features/settings/model/view/SliderSetting.kt | 2 +- .../features/settings/model/view/StringSingleChoiceSetting.kt | 2 +- .../suyu_emu/features/settings/model/view/SubmenuSetting.kt | 2 +- .../suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt | 2 +- .../org/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt | 2 +- .../org/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt | 2 +- .../suyu_emu/features/settings/ui/SettingsDialogFragment.kt | 2 +- .../org/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt | 2 +- .../suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt | 2 +- .../suyu_emu/features/settings/ui/SettingsSearchFragment.kt | 2 +- .../org/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt | 2 +- .../features/settings/ui/viewholder/DateTimeViewHolder.kt | 2 +- .../features/settings/ui/viewholder/HeaderViewHolder.kt | 2 +- .../features/settings/ui/viewholder/RunnableViewHolder.kt | 2 +- .../features/settings/ui/viewholder/SettingViewHolder.kt | 2 +- .../features/settings/ui/viewholder/SingleChoiceViewHolder.kt | 2 +- .../features/settings/ui/viewholder/SliderViewHolder.kt | 2 +- .../features/settings/ui/viewholder/SubmenuViewHolder.kt | 2 +- .../features/settings/ui/viewholder/SwitchSettingViewHolder.kt | 2 +- .../org/suyu/suyu_emu/features/settings/utils/SettingsFile.kt | 2 +- .../src/main/java/org/suyu/suyu_emu/fragments/AboutFragment.kt | 2 +- .../org/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt | 2 +- .../src/main/java/org/suyu/suyu_emu/fragments/AddonsFragment.kt | 2 +- .../java/org/suyu/suyu_emu/fragments/AppletLauncherFragment.kt | 2 +- .../suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt | 2 +- .../suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt | 2 +- .../java/org/suyu/suyu_emu/fragments/DriverManagerFragment.kt | 2 +- .../org/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt | 2 +- .../java/org/suyu/suyu_emu/fragments/EarlyAccessFragment.kt | 2 +- .../main/java/org/suyu/suyu_emu/fragments/EmulationFragment.kt | 2 +- .../suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt | 2 +- .../java/org/suyu/suyu_emu/fragments/GameFoldersFragment.kt | 2 +- .../main/java/org/suyu/suyu_emu/fragments/GameInfoFragment.kt | 2 +- .../java/org/suyu/suyu_emu/fragments/GamePropertiesFragment.kt | 2 +- .../java/org/suyu/suyu_emu/fragments/HomeSettingsFragment.kt | 2 +- .../java/org/suyu/suyu_emu/fragments/InstallableFragment.kt | 2 +- .../org/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt | 2 +- .../suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt | 2 +- .../main/java/org/suyu/suyu_emu/fragments/LicensesFragment.kt | 2 +- .../java/org/suyu/suyu_emu/fragments/MessageDialogFragment.kt | 2 +- .../suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt | 2 +- .../java/org/suyu/suyu_emu/fragments/ProgressDialogFragment.kt | 2 +- .../org/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt | 2 +- .../src/main/java/org/suyu/suyu_emu/fragments/SearchFragment.kt | 2 +- .../src/main/java/org/suyu/suyu_emu/fragments/SetupFragment.kt | 2 +- .../org/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt | 2 +- .../java/org/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/model/AddonViewModel.kt | 2 +- src/android/app/src/main/java/org/suyu/suyu_emu/model/Applet.kt | 2 +- .../src/main/java/org/suyu/suyu_emu/model/DriverViewModel.kt | 2 +- .../src/main/java/org/suyu/suyu_emu/model/EmulationViewModel.kt | 2 +- src/android/app/src/main/java/org/suyu/suyu_emu/model/Game.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/model/GameDir.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/model/GameProperties.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/model/GamesViewModel.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/model/HomeSetting.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/model/HomeViewModel.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/model/Installable.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/model/License.kt | 2 +- .../main/java/org/suyu/suyu_emu/model/MessageDialogViewModel.kt | 2 +- .../main/java/org/suyu/suyu_emu/model/MinimalDocumentFile.kt | 2 +- src/android/app/src/main/java/org/suyu/suyu_emu/model/Patch.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/model/SetupPage.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/model/TaskViewModel.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlay.kt | 2 +- .../org/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt | 2 +- .../java/org/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt | 2 +- .../org/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt | 2 +- .../main/java/org/suyu/suyu_emu/overlay/model/OverlayControl.kt | 2 +- .../java/org/suyu/suyu_emu/overlay/model/OverlayControlData.kt | 2 +- .../org/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt | 2 +- .../main/java/org/suyu/suyu_emu/overlay/model/OverlayLayout.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/ui/GamesFragment.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/ui/main/MainActivity.kt | 2 +- .../src/main/java/org/suyu/suyu_emu/ui/main/ThemeProvider.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/utils/AddonUtil.kt | 2 +- .../java/org/suyu/suyu_emu/utils/DirectoryInitialization.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/utils/DocumentsTree.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/utils/FileUtil.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/utils/GameHelper.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/utils/GameIconUtils.kt | 2 +- .../src/main/java/org/suyu/suyu_emu/utils/GpuDriverHelper.kt | 2 +- .../src/main/java/org/suyu/suyu_emu/utils/GpuDriverMetadata.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/utils/InputHandler.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/utils/InsetsHelper.kt | 2 +- src/android/app/src/main/java/org/suyu/suyu_emu/utils/Log.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/utils/MemoryUtil.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/utils/NativeConfig.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/utils/NfcReader.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/utils/PreferenceUtil.kt | 2 +- .../src/main/java/org/suyu/suyu_emu/utils/SerializableHelper.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/utils/ThemeHelper.kt | 2 +- .../app/src/main/java/org/suyu/suyu_emu/utils/ViewUtils.kt | 2 +- .../main/java/org/suyu/suyu_emu/views/FixedRatioSurfaceView.kt | 2 +- src/android/app/src/main/jni/CMakeLists.txt | 2 +- src/android/app/src/main/jni/android_config.cpp | 2 +- src/android/app/src/main/jni/android_config.h | 2 +- src/android/app/src/main/jni/android_settings.cpp | 2 +- src/android/app/src/main/jni/android_settings.h | 2 +- src/android/app/src/main/jni/emu_window/emu_window.cpp | 2 +- src/android/app/src/main/jni/emu_window/emu_window.h | 2 +- src/android/app/src/main/jni/native_config.cpp | 2 +- src/android/app/src/main/jni/native_log.cpp | 2 +- src/android/build.gradle.kts | 2 +- src/android/gradle.properties | 2 +- src/android/gradlew | 2 +- src/android/settings.gradle.kts | 2 +- 148 files changed, 148 insertions(+), 148 deletions(-) diff --git a/src/android/.gitignore b/src/android/.gitignore index ef140fad38..ff7121acd1 100644 --- a/src/android/.gitignore +++ b/src/android/.gitignore @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2023 suyu Emulator Project +# SPDX-FileCopyrightText: 2023 yuzu Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later # Built application files diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts index cdc8cd9c6b..78f8cc3488 100644 --- a/src/android/app/build.gradle.kts +++ b/src/android/app/build.gradle.kts @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later import android.annotation.SuppressLint diff --git a/src/android/app/proguard-rules.pro b/src/android/app/proguard-rules.pro index 8d853a1d3b..691e08fd03 100644 --- a/src/android/app/proguard-rules.pro +++ b/src/android/app/proguard-rules.pro @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2023 suyu Emulator Project +# SPDX-FileCopyrightText: 2023 yuzu Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later # To get usable stack traces diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/NativeLibrary.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/NativeLibrary.kt index 6484a733f7..071737e686 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/NativeLibrary.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/NativeLibrary.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/SuyuApplication.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/SuyuApplication.kt index 27c9265956..845e39d6d5 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/SuyuApplication.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/SuyuApplication.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/activities/EmulationActivity.kt index 8c5686c1d2..6aa35fb7ab 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/activities/EmulationActivity.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.activities diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AddonAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AddonAdapter.kt index 01dc2e02e4..ae483115e9 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AddonAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AddonAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AppletAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AppletAdapter.kt index ab4651afe5..73c43a6d2c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AppletAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AppletAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt index 42d5d98b02..188b3ae464 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/DriverAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/DriverAdapter.kt index cfd5c13590..4c8e53abbd 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/DriverAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/DriverAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/FolderAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/FolderAdapter.kt index 30762b765e..dfe332586d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/FolderAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/FolderAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GameAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GameAdapter.kt index bf58a1499f..6a87c8852c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GameAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GameAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt index 8286711df5..1d3916b43f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/HomeSettingAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/HomeSettingAdapter.kt index 2544ea1571..973e0b457d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/HomeSettingAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/HomeSettingAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/InstallableAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/InstallableAdapter.kt index 22063447d9..fbd420aaae 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/InstallableAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/InstallableAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/LicenseAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/LicenseAdapter.kt index 5ddd98cda3..5358cd6067 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/LicenseAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/LicenseAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/SetupAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/SetupAdapter.kt index c6b96cb2f9..2dcd5cfc64 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/SetupAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/SetupAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt index 548a1bf947..80df698230 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.disk_shader_cache diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/DocumentProvider.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/DocumentProvider.kt index 47497520c0..3e434cdd66 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/DocumentProvider.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/DocumentProvider.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: MPL-2.0 diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt index a110cb6a55..8266e3dbd1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt index 13a4076c32..6ef8255341 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt index 2af7b8d3a2..5437a65ade 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt index 625cf78dc1..1d979d153d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt index 54b29dd62a..22e94c10b8 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractSetting.kt index 201be29a2e..f4cf067e65 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt index 559123c1d7..4488802269 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt index 9342e5cf1e..3afb1bc3a1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/BooleanSetting.kt index 1157ca5677..2e36e82b9a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/BooleanSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ByteSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ByteSetting.kt index 6c9c9d1c5a..9a3f966697 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ByteSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ByteSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/FloatSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/FloatSetting.kt index 0dc40e45b4..6d266cb5c8 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/FloatSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/FloatSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/IntSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/IntSetting.kt index 9aa5be3d77..bf62df3c28 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/IntSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/IntSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/LongSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/LongSetting.kt index 41e8451772..01f2e580ae 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/LongSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/LongSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/Settings.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/Settings.kt index 24cd36563e..2352c3824f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/Settings.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/Settings.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ShortSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ShortSetting.kt index 523b0347f1..45614501c3 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ShortSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ShortSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/StringSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/StringSetting.kt index 90fe4abf40..3f40fedcce 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/StringSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/StringSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt index e54cd679ef..7ed6a721af 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt index 91221326ed..da9b34e9be 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt index 9d7d04cf3f..ba43799254 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt index 900c44116c..b48e0ee4d1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt index a956c734aa..8aa8a477de 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt index a153bfaf4e..4d0edda0ff 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt index af34dfdef8..45471a64e8 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt index eb18f191e7..2a35a1b425 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt index a5e9f8556f..e381af10a3 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt index 534e6ef8aa..f7d4b73f91 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt index 753e196acd..aaa621a1da 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt index dd69c2ed59..6693e16096 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt index 748b845ade..8d22dc1d55 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt index 0d0acda788..8e7896780a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt index 0f53c83fe5..876725a35e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt index d29d81e34d..bab4765b5a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt index 06d4163d05..e99dec076d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt index 3e0881a2e2..a996f044f9 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt index 21b0e53984..7b9c8303d4 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt index 30fee8900a..f210925fd2 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt index 4477cac416..93b0967462 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt index 813eb1ceaf..f8b891c94a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt index 0f6e65e669..160dc33b75 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt index c4aa3f9634..3701f0f46e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt index b48a2ed457..93e50f381b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/utils/SettingsFile.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/utils/SettingsFile.kt index 5004bb204f..3c05c2c219 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/utils/SettingsFile.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/utils/SettingsFile.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AboutFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AboutFragment.kt index 17744a6344..66b4fd5604 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AboutFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AboutFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt index 1181223b66..bfc06a31c9 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddonsFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddonsFragment.kt index e33d050dc9..825b0869de 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddonsFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddonsFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AppletLauncherFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AppletLauncherFragment.kt index 573abc8a73..138e5074af 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AppletLauncherFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AppletLauncherFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt index 312c88a859..dce2c8ca1f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt index c701f18486..5bbf751a3a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriverManagerFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriverManagerFragment.kt index 3aa5415adf..812037563b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriverManagerFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriverManagerFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt index 0cf93e21fd..993eb015d7 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EarlyAccessFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EarlyAccessFragment.kt index cf4b114591..7eebf77159 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EarlyAccessFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EarlyAccessFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EmulationFragment.kt index 33a7ecc398..62fbcaf629 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EmulationFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt index f8b26b7fbe..e65f0f5e6c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFoldersFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFoldersFragment.kt index fca1345053..7b9ccce0a1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFoldersFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFoldersFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameInfoFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameInfoFragment.kt index bf075b24ef..16901fead4 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameInfoFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameInfoFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GamePropertiesFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GamePropertiesFragment.kt index e05e105eb8..e56b186d06 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GamePropertiesFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GamePropertiesFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/HomeSettingsFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/HomeSettingsFragment.kt index ed8d2131b2..790ca7a54b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/HomeSettingsFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/HomeSettingsFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/InstallableFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/InstallableFragment.kt index 07c917ba19..4a4dd11f4f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/InstallableFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/InstallableFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt index 7e6c028fa4..4cc4f62407 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt index 8ba5890824..76e34b62da 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicensesFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicensesFragment.kt index 213cb96800..b5709d624e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicensesFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicensesFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/MessageDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/MessageDialogFragment.kt index 5957645c76..ed80521354 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/MessageDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/MessageDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt index 82e00237b4..c384584b19 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ProgressDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ProgressDialogFragment.kt index 45f7f1206e..c1221f383c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ProgressDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ProgressDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt index 97b2f646c8..24f9f6a10a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SearchFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SearchFragment.kt index 5200c4e88c..54155bdc43 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SearchFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SearchFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupFragment.kt index 0576b2e9b5..fdbdb20b65 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt index ad6a8492a8..a508ebfd33 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt index 855eb592b6..6d37cf4f8b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.layout diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/AddonViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/AddonViewModel.kt index dc1fed395c..e67611631e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/AddonViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/AddonViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Applet.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Applet.kt index 3b3b33643b..af22fd0bc4 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Applet.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Applet.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/DriverViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/DriverViewModel.kt index 252c981d0d..7009d453ae 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/DriverViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/DriverViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/EmulationViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/EmulationViewModel.kt index 3b73ccdc5e..3d6e744e93 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/EmulationViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/EmulationViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Game.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Game.kt index 819c14da43..039ce3d302 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Game.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Game.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameDir.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameDir.kt index e794ed82ac..b3f7a8d14a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameDir.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameDir.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameProperties.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameProperties.kt index f5f951ee73..abeee8f73b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameProperties.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameProperties.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GamesViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/GamesViewModel.kt index 8e63812732..f5a1e55256 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GamesViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/GamesViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeSetting.kt index c603f6fecf..114e4a89ad 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeViewModel.kt index e9a1b03c9c..6cfbb725c8 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Installable.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Installable.kt index 3f57dd7ad0..6b15d54afe 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Installable.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Installable.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/License.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/License.kt index 630ff8dc26..735b07ee65 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/License.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/License.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/MessageDialogViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/MessageDialogViewModel.kt index db3406da76..1f51bb3a06 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/MessageDialogViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/MessageDialogViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/MinimalDocumentFile.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/MinimalDocumentFile.kt index 6f985268f0..176c6f3b71 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/MinimalDocumentFile.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/MinimalDocumentFile.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Patch.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Patch.kt index 5849a6a366..6e9d09d1be 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Patch.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Patch.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/SetupPage.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/SetupPage.kt index cccba01214..0316009d6c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/SetupPage.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/SetupPage.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/TaskViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/TaskViewModel.kt index f97a339872..e4d635ff4f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/TaskViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/TaskViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlay.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlay.kt index aedc494dfb..76e33bef37 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlay.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlay.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt index a9e49f6ad0..0ba7205e58 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt index c2d41119a8..6f24f5c1da 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt index 6244d54197..e6f8b5d21a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControl.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControl.kt index 8293a57982..605f63ff79 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControl.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControl.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlData.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlData.kt index 00e7cd20ed..7559bcfe2d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlData.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlData.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt index c4e0a9a65b..0df2e4ff8b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayLayout.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayLayout.kt index 3b1cbaa092..1eb0105352 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayLayout.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayLayout.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/GamesFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/ui/GamesFragment.kt index 45d22dcd20..b37aa23850 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/GamesFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/ui/GamesFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/MainActivity.kt index 90fccd4acc..ea5ba39a32 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/MainActivity.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.ui.main diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/ThemeProvider.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/ThemeProvider.kt index 2e282779b2..3ba6c5cd16 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/ThemeProvider.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/ThemeProvider.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.ui.main diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/AddonUtil.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/AddonUtil.kt index 6822a68868..adc4228bc0 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/AddonUtil.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/AddonUtil.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DirectoryInitialization.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DirectoryInitialization.kt index e316a64b37..451757fea3 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DirectoryInitialization.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DirectoryInitialization.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DocumentsTree.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DocumentsTree.kt index c6485ba518..8269cbc238 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DocumentsTree.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DocumentsTree.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/FileUtil.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/FileUtil.kt index b1c4dae838..61a40992a8 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/FileUtil.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/FileUtil.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameHelper.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameHelper.kt index 7564475258..4800c5cb4e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameHelper.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameHelper.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameIconUtils.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameIconUtils.kt index 1ec58284e1..692030c218 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameIconUtils.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameIconUtils.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverHelper.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverHelper.kt index ec250fc079..28486d32de 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverHelper.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverHelper.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverMetadata.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverMetadata.kt index 8da7ec8f7d..c12e49d2cd 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverMetadata.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverMetadata.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InputHandler.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InputHandler.kt index c65b7bd297..90afcea9aa 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InputHandler.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InputHandler.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InsetsHelper.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InsetsHelper.kt index 974c6c5d62..d5621f42cc 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InsetsHelper.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InsetsHelper.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/Log.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/Log.kt index f74a4fa521..794f03629d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/Log.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/Log.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/MemoryUtil.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/MemoryUtil.kt index 32826edaea..3617b0dc54 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/MemoryUtil.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/MemoryUtil.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NativeConfig.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NativeConfig.kt index 5be827a08b..248b02515c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NativeConfig.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NativeConfig.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NfcReader.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NfcReader.kt index 61c3fb3c84..2a8045202c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NfcReader.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NfcReader.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/PreferenceUtil.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/PreferenceUtil.kt index 226d9bcfd7..ad8fd59211 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/PreferenceUtil.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/PreferenceUtil.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/SerializableHelper.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/SerializableHelper.kt index 9489ac48d5..71438c2866 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/SerializableHelper.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/SerializableHelper.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ThemeHelper.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ThemeHelper.kt index 3f91773178..2c0b3ea2ed 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ThemeHelper.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ThemeHelper.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ViewUtils.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ViewUtils.kt index cc7c1ab26d..b81e146673 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ViewUtils.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ViewUtils.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/views/FixedRatioSurfaceView.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/views/FixedRatioSurfaceView.kt index bc5346a026..7d4708ce12 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/views/FixedRatioSurfaceView.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/views/FixedRatioSurfaceView.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.views diff --git a/src/android/app/src/main/jni/CMakeLists.txt b/src/android/app/src/main/jni/CMakeLists.txt index 59349991bc..bcfec06a5f 100644 --- a/src/android/app/src/main/jni/CMakeLists.txt +++ b/src/android/app/src/main/jni/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2023 suyu Emulator Project +# SPDX-FileCopyrightText: 2023 yuzu Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later add_library(suyu-android SHARED diff --git a/src/android/app/src/main/jni/android_config.cpp b/src/android/app/src/main/jni/android_config.cpp index c32eb0fc17..a79a64afbb 100644 --- a/src/android/app/src/main/jni/android_config.cpp +++ b/src/android/app/src/main/jni/android_config.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/android/app/src/main/jni/android_config.h b/src/android/app/src/main/jni/android_config.h index 8f69b03567..28ef5d0a8e 100644 --- a/src/android/app/src/main/jni/android_config.h +++ b/src/android/app/src/main/jni/android_config.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/android/app/src/main/jni/android_settings.cpp b/src/android/app/src/main/jni/android_settings.cpp index 6a54bb61d8..16023a6b05 100644 --- a/src/android/app/src/main/jni/android_settings.cpp +++ b/src/android/app/src/main/jni/android_settings.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "android_settings.h" diff --git a/src/android/app/src/main/jni/android_settings.h b/src/android/app/src/main/jni/android_settings.h index 16ba078f80..00baf86a9b 100644 --- a/src/android/app/src/main/jni/android_settings.h +++ b/src/android/app/src/main/jni/android_settings.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/android/app/src/main/jni/emu_window/emu_window.cpp b/src/android/app/src/main/jni/emu_window/emu_window.cpp index a98f7891ca..06db553691 100644 --- a/src/android/app/src/main/jni/emu_window/emu_window.cpp +++ b/src/android/app/src/main/jni/emu_window/emu_window.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include diff --git a/src/android/app/src/main/jni/emu_window/emu_window.h b/src/android/app/src/main/jni/emu_window/emu_window.h index 23643984d7..d7b5fc6dac 100644 --- a/src/android/app/src/main/jni/emu_window/emu_window.h +++ b/src/android/app/src/main/jni/emu_window/emu_window.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once diff --git a/src/android/app/src/main/jni/native_config.cpp b/src/android/app/src/main/jni/native_config.cpp index e36fd9d7c3..88282657f1 100644 --- a/src/android/app/src/main/jni/native_config.cpp +++ b/src/android/app/src/main/jni/native_config.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/android/app/src/main/jni/native_log.cpp b/src/android/app/src/main/jni/native_log.cpp index 66b8e4676e..e1f74d4701 100644 --- a/src/android/app/src/main/jni/native_log.cpp +++ b/src/android/app/src/main/jni/native_log.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/android/build.gradle.kts b/src/android/build.gradle.kts index c09cad5ecd..b77906ed6d 100644 --- a/src/android/build.gradle.kts +++ b/src/android/build.gradle.kts @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // Top-level build file where you can add configuration options common to all sub-projects/modules. diff --git a/src/android/gradle.properties b/src/android/gradle.properties index ce7554bc86..4fca1b5769 100644 --- a/src/android/gradle.properties +++ b/src/android/gradle.properties @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2023 suyu Emulator Project +# SPDX-FileCopyrightText: 2023 yuzu Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later # Project-wide Gradle settings. diff --git a/src/android/gradlew b/src/android/gradlew index b676545c57..afa1279664 100755 --- a/src/android/gradlew +++ b/src/android/gradlew @@ -1,6 +1,6 @@ #!/usr/bin/env sh -# SPDX-FileCopyrightText: 2023 suyu Emulator Project +# SPDX-FileCopyrightText: 2023 yuzu Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later ############################################################################## diff --git a/src/android/settings.gradle.kts b/src/android/settings.gradle.kts index d421a88537..af910b9068 100644 --- a/src/android/settings.gradle.kts +++ b/src/android/settings.gradle.kts @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later pluginManagement { From 4106a59d8f797dd7338e36c6fc650d220a02e1e7 Mon Sep 17 00:00:00 2001 From: Exverge Date: Sat, 23 Mar 2024 19:09:25 -0400 Subject: [PATCH 021/165] Add suyu copyright notice in files with modifications Would've been nice to know [skip ci] was on Forgejo >1.21 only --- src/android/app/build.gradle.kts | 2 +- src/android/app/src/main/AndroidManifest.xml | 2 +- .../java/org/suyu/suyu_emu/NativeLibrary.kt | 2 +- .../java/org/suyu/suyu_emu/SuyuApplication.kt | 2 +- .../suyu_emu/activities/EmulationActivity.kt | 2 +- .../suyu/suyu_emu/adapters/AddonAdapter.kt | 2 +- .../suyu/suyu_emu/adapters/AppletAdapter.kt | 2 +- .../adapters/CabinetLauncherDialogAdapter.kt | 2 +- .../suyu/suyu_emu/adapters/DriverAdapter.kt | 2 +- .../suyu/suyu_emu/adapters/FolderAdapter.kt | 2 +- .../org/suyu/suyu_emu/adapters/GameAdapter.kt | 2 +- .../adapters/GamePropertiesAdapter.kt | 2 +- .../suyu_emu/adapters/HomeSettingAdapter.kt | 2 +- .../suyu_emu/adapters/InstallableAdapter.kt | 2 +- .../suyu/suyu_emu/adapters/LicenseAdapter.kt | 2 +- .../suyu/suyu_emu/adapters/SetupAdapter.kt | 2 +- .../DiskShaderCacheProgress.kt | 2 +- .../suyu_emu/features/DocumentProvider.kt | 2 +- .../settings/model/AbstractBooleanSetting.kt | 2 +- .../settings/model/AbstractByteSetting.kt | 2 +- .../settings/model/AbstractFloatSetting.kt | 2 +- .../settings/model/AbstractIntSetting.kt | 2 +- .../settings/model/AbstractLongSetting.kt | 2 +- .../settings/model/AbstractSetting.kt | 2 +- .../settings/model/AbstractShortSetting.kt | 2 +- .../settings/model/AbstractStringSetting.kt | 2 +- .../features/settings/model/BooleanSetting.kt | 2 +- .../features/settings/model/ByteSetting.kt | 2 +- .../features/settings/model/FloatSetting.kt | 2 +- .../features/settings/model/IntSetting.kt | 2 +- .../features/settings/model/LongSetting.kt | 2 +- .../features/settings/model/Settings.kt | 2 +- .../features/settings/model/ShortSetting.kt | 2 +- .../features/settings/model/StringSetting.kt | 2 +- .../settings/model/view/DateTimeSetting.kt | 2 +- .../settings/model/view/HeaderSetting.kt | 2 +- .../model/view/IntSingleChoiceSetting.kt | 2 +- .../settings/model/view/RunnableSetting.kt | 2 +- .../settings/model/view/SettingsItem.kt | 2 +- .../model/view/SingleChoiceSetting.kt | 2 +- .../settings/model/view/SliderSetting.kt | 2 +- .../model/view/StringSingleChoiceSetting.kt | 2 +- .../settings/model/view/SubmenuSetting.kt | 2 +- .../settings/model/view/SwitchSetting.kt | 2 +- .../features/settings/ui/SettingsActivity.kt | 2 +- .../features/settings/ui/SettingsAdapter.kt | 2 +- .../settings/ui/SettingsDialogFragment.kt | 2 +- .../features/settings/ui/SettingsFragment.kt | 2 +- .../settings/ui/SettingsFragmentPresenter.kt | 2 +- .../settings/ui/SettingsSearchFragment.kt | 2 +- .../features/settings/ui/SettingsViewModel.kt | 2 +- .../ui/viewholder/DateTimeViewHolder.kt | 2 +- .../ui/viewholder/HeaderViewHolder.kt | 2 +- .../ui/viewholder/RunnableViewHolder.kt | 2 +- .../ui/viewholder/SettingViewHolder.kt | 2 +- .../ui/viewholder/SingleChoiceViewHolder.kt | 2 +- .../ui/viewholder/SliderViewHolder.kt | 2 +- .../ui/viewholder/SubmenuViewHolder.kt | 2 +- .../ui/viewholder/SwitchSettingViewHolder.kt | 2 +- .../features/settings/utils/SettingsFile.kt | 2 +- .../suyu/suyu_emu/fragments/AboutFragment.kt | 2 +- .../fragments/AddGameFolderDialogFragment.kt | 2 +- .../suyu/suyu_emu/fragments/AddonsFragment.kt | 2 +- .../fragments/AppletLauncherFragment.kt | 2 +- .../CabinetLauncherDialogFragment.kt | 2 +- .../ContentTypeSelectionDialogFragment.kt | 2 +- .../fragments/DriverManagerFragment.kt | 2 +- .../fragments/DriversLoadingDialogFragment.kt | 2 +- .../suyu_emu/fragments/EarlyAccessFragment.kt | 2 +- .../suyu_emu/fragments/EmulationFragment.kt | 2 +- .../GameFolderPropertiesDialogFragment.kt | 2 +- .../suyu_emu/fragments/GameFoldersFragment.kt | 2 +- .../suyu_emu/fragments/GameInfoFragment.kt | 2 +- .../fragments/GamePropertiesFragment.kt | 2 +- .../fragments/HomeSettingsFragment.kt | 2 +- .../suyu_emu/fragments/InstallableFragment.kt | 2 +- .../fragments/LaunchGameDialogFragment.kt | 2 +- .../LicenseBottomSheetDialogFragment.kt | 2 +- .../suyu_emu/fragments/LicensesFragment.kt | 2 +- .../fragments/MessageDialogFragment.kt | 2 +- .../PermissionDeniedDialogFragment.kt | 2 +- .../fragments/ProgressDialogFragment.kt | 2 +- .../fragments/ResetSettingsDialogFragment.kt | 2 +- .../suyu/suyu_emu/fragments/SearchFragment.kt | 2 +- .../suyu/suyu_emu/fragments/SetupFragment.kt | 2 +- .../fragments/SetupWarningDialogFragment.kt | 2 +- .../layout/AutofitGridLayoutManager.kt | 2 +- .../org/suyu/suyu_emu/model/AddonViewModel.kt | 2 +- .../java/org/suyu/suyu_emu/model/Applet.kt | 2 +- .../suyu/suyu_emu/model/DriverViewModel.kt | 2 +- .../suyu/suyu_emu/model/EmulationViewModel.kt | 2 +- .../main/java/org/suyu/suyu_emu/model/Game.kt | 2 +- .../java/org/suyu/suyu_emu/model/GameDir.kt | 2 +- .../org/suyu/suyu_emu/model/GameProperties.kt | 2 +- .../org/suyu/suyu_emu/model/GamesViewModel.kt | 2 +- .../org/suyu/suyu_emu/model/HomeSetting.kt | 2 +- .../org/suyu/suyu_emu/model/HomeViewModel.kt | 2 +- .../org/suyu/suyu_emu/model/Installable.kt | 2 +- .../java/org/suyu/suyu_emu/model/License.kt | 2 +- .../suyu_emu/model/MessageDialogViewModel.kt | 2 +- .../suyu_emu/model/MinimalDocumentFile.kt | 2 +- .../java/org/suyu/suyu_emu/model/Patch.kt | 2 +- .../java/org/suyu/suyu_emu/model/SetupPage.kt | 2 +- .../org/suyu/suyu_emu/model/TaskViewModel.kt | 2 +- .../org/suyu/suyu_emu/overlay/InputOverlay.kt | 2 +- .../overlay/InputOverlayDrawableButton.kt | 2 +- .../overlay/InputOverlayDrawableDpad.kt | 2 +- .../overlay/InputOverlayDrawableJoystick.kt | 2 +- .../suyu_emu/overlay/model/OverlayControl.kt | 2 +- .../overlay/model/OverlayControlData.kt | 2 +- .../overlay/model/OverlayControlDefault.kt | 2 +- .../suyu_emu/overlay/model/OverlayLayout.kt | 2 +- .../org/suyu/suyu_emu/ui/GamesFragment.kt | 2 +- .../org/suyu/suyu_emu/ui/main/MainActivity.kt | 2 +- .../suyu/suyu_emu/ui/main/ThemeProvider.kt | 2 +- .../java/org/suyu/suyu_emu/utils/AddonUtil.kt | 2 +- .../suyu_emu/utils/DirectoryInitialization.kt | 2 +- .../org/suyu/suyu_emu/utils/DocumentsTree.kt | 2 +- .../java/org/suyu/suyu_emu/utils/FileUtil.kt | 2 +- .../org/suyu/suyu_emu/utils/GameHelper.kt | 2 +- .../org/suyu/suyu_emu/utils/GameIconUtils.kt | 2 +- .../suyu/suyu_emu/utils/GpuDriverHelper.kt | 2 +- .../suyu/suyu_emu/utils/GpuDriverMetadata.kt | 2 +- .../org/suyu/suyu_emu/utils/InputHandler.kt | 2 +- .../org/suyu/suyu_emu/utils/InsetsHelper.kt | 2 +- .../main/java/org/suyu/suyu_emu/utils/Log.kt | 2 +- .../org/suyu/suyu_emu/utils/MemoryUtil.kt | 2 +- .../org/suyu/suyu_emu/utils/NativeConfig.kt | 2 +- .../java/org/suyu/suyu_emu/utils/NfcReader.kt | 2 +- .../org/suyu/suyu_emu/utils/PreferenceUtil.kt | 2 +- .../suyu/suyu_emu/utils/SerializableHelper.kt | 2 +- .../org/suyu/suyu_emu/utils/ThemeHelper.kt | 2 +- .../java/org/suyu/suyu_emu/utils/ViewUtils.kt | 2 +- .../suyu_emu/views/FixedRatioSurfaceView.kt | 2 +- .../app/src/main/jni/game_metadata.cpp | 2 +- src/android/app/src/main/jni/native.h | 2 +- src/android/gradlew | 19 ++++++++++++++++--- src/android/gradlew.bat | 19 ++++++++++++++++--- 138 files changed, 168 insertions(+), 142 deletions(-) diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts index 78f8cc3488..5fc1e8093f 100644 --- a/src/android/app/build.gradle.kts +++ b/src/android/app/build.gradle.kts @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later import android.annotation.SuppressLint diff --git a/src/android/app/src/main/AndroidManifest.xml b/src/android/app/src/main/AndroidManifest.xml index 02d08c00be..ab23f2cacb 100644 --- a/src/android/app/src/main/AndroidManifest.xml +++ b/src/android/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/NativeLibrary.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/NativeLibrary.kt index 071737e686..02357cac5e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/NativeLibrary.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/NativeLibrary.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/SuyuApplication.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/SuyuApplication.kt index 845e39d6d5..3117baad28 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/SuyuApplication.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/SuyuApplication.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/activities/EmulationActivity.kt index 6aa35fb7ab..16e3e54ee8 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/activities/EmulationActivity.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.activities diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AddonAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AddonAdapter.kt index ae483115e9..f5eef33d82 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AddonAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AddonAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AppletAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AppletAdapter.kt index 73c43a6d2c..ecd40b69ec 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AppletAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AppletAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt index 188b3ae464..216000dc1d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/DriverAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/DriverAdapter.kt index 4c8e53abbd..c6731ce03b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/DriverAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/DriverAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/FolderAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/FolderAdapter.kt index dfe332586d..3b346c6143 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/FolderAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/FolderAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GameAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GameAdapter.kt index 6a87c8852c..0a3fdc128d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GameAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GameAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt index 1d3916b43f..8999b2a1e0 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/HomeSettingAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/HomeSettingAdapter.kt index 973e0b457d..91db100ce9 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/HomeSettingAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/HomeSettingAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/InstallableAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/InstallableAdapter.kt index fbd420aaae..026f0ca91c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/InstallableAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/InstallableAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/LicenseAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/LicenseAdapter.kt index 5358cd6067..eb78ed77be 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/LicenseAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/LicenseAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/SetupAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/SetupAdapter.kt index 2dcd5cfc64..60ba78f598 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/SetupAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/SetupAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt index 80df698230..441e22a73e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.disk_shader_cache diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/DocumentProvider.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/DocumentProvider.kt index 3e434cdd66..8abbf0f465 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/DocumentProvider.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/DocumentProvider.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: MPL-2.0 diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt index 8266e3dbd1..2c0c6288b0 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt index 6ef8255341..bb16eecd39 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt index 5437a65ade..9a4f11dc80 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt index 1d979d153d..378201a210 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt index 22e94c10b8..4ef2096d62 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractSetting.kt index f4cf067e65..000742d818 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt index 4488802269..6d99eacdc9 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt index 3afb1bc3a1..eedf8524c6 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/BooleanSetting.kt index 2e36e82b9a..e006bcb668 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/BooleanSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ByteSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ByteSetting.kt index 9a3f966697..a2573358ee 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ByteSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ByteSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/FloatSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/FloatSetting.kt index 6d266cb5c8..ed1b43e3d1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/FloatSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/FloatSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/IntSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/IntSetting.kt index bf62df3c28..23364489a0 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/IntSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/IntSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/LongSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/LongSetting.kt index 01f2e580ae..753f764f6d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/LongSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/LongSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/Settings.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/Settings.kt index 2352c3824f..3b2852039a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/Settings.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/Settings.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ShortSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ShortSetting.kt index 45614501c3..cef5445372 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ShortSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ShortSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/StringSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/StringSetting.kt index 3f40fedcce..04db614f4f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/StringSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/StringSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt index 7ed6a721af..1d30e77e82 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt index da9b34e9be..2b7100150e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt index ba43799254..6c5422b9fe 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt index b48e0ee4d1..695db7920c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt index 8aa8a477de..991bfc45be 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt index 4d0edda0ff..5368b956ed 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt index 45471a64e8..6efb7ce128 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt index 2a35a1b425..70513552dd 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt index e381af10a3..ccd601d300 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt index f7d4b73f91..aa3a7bffba 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt index aaa621a1da..7b41a394e7 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt index 6693e16096..857baf7e1e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt index 8d22dc1d55..80b1a76a45 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt index 8e7896780a..f3bea85b44 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt index 876725a35e..81666c8d31 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt index bab4765b5a..60eceda27d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt index e99dec076d..b58ed726c0 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt index a996f044f9..2e365d240d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt index 7b9c8303d4..d59d18d954 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt index f210925fd2..0d7955a616 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt index 93b0967462..f8de9466b7 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt index f8b891c94a..dd6acf5282 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt index 160dc33b75..e02bc1d1f5 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt index 3701f0f46e..d92e875c13 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt index 93e50f381b..38e032a907 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/utils/SettingsFile.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/utils/SettingsFile.kt index 3c05c2c219..1180315c14 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/utils/SettingsFile.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/utils/SettingsFile.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AboutFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AboutFragment.kt index 66b4fd5604..3c20c65a07 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AboutFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AboutFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt index bfc06a31c9..8d90b6d9d7 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddonsFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddonsFragment.kt index 825b0869de..5c421ac73d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddonsFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddonsFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AppletLauncherFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AppletLauncherFragment.kt index 138e5074af..4ff1d4fc7d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AppletLauncherFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AppletLauncherFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt index dce2c8ca1f..00eecb473f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt index 5bbf751a3a..9d84685ad8 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriverManagerFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriverManagerFragment.kt index 812037563b..def088ddbc 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriverManagerFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriverManagerFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt index 993eb015d7..60e88ff9e4 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EarlyAccessFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EarlyAccessFragment.kt index 7eebf77159..73940a62a3 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EarlyAccessFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EarlyAccessFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EmulationFragment.kt index 62fbcaf629..38fc7c732e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EmulationFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt index e65f0f5e6c..eec06d7f53 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFoldersFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFoldersFragment.kt index 7b9ccce0a1..7851048189 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFoldersFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFoldersFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameInfoFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameInfoFragment.kt index 16901fead4..967f6fa88a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameInfoFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameInfoFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GamePropertiesFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GamePropertiesFragment.kt index e56b186d06..944c0097c3 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GamePropertiesFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GamePropertiesFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/HomeSettingsFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/HomeSettingsFragment.kt index 790ca7a54b..9cfa0e14c9 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/HomeSettingsFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/HomeSettingsFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/InstallableFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/InstallableFragment.kt index 4a4dd11f4f..eb366790c3 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/InstallableFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/InstallableFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt index 4cc4f62407..e3c768b512 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt index 76e34b62da..e7404e3a41 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicensesFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicensesFragment.kt index b5709d624e..4cc85dd345 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicensesFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicensesFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/MessageDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/MessageDialogFragment.kt index ed80521354..903d1b0c32 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/MessageDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/MessageDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt index c384584b19..399a518a84 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ProgressDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ProgressDialogFragment.kt index c1221f383c..9661c103cd 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ProgressDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ProgressDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt index 24f9f6a10a..39f059832a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SearchFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SearchFragment.kt index 54155bdc43..61f6c047d1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SearchFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SearchFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupFragment.kt index fdbdb20b65..2dff315296 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt index a508ebfd33..d5fcd3450b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt index 6d37cf4f8b..9f042af16e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.layout diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/AddonViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/AddonViewModel.kt index e67611631e..de468d2917 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/AddonViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/AddonViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Applet.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Applet.kt index af22fd0bc4..80f21f1231 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Applet.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Applet.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/DriverViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/DriverViewModel.kt index 7009d453ae..011bddbac3 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/DriverViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/DriverViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/EmulationViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/EmulationViewModel.kt index 3d6e744e93..80d4f6bc26 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/EmulationViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/EmulationViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Game.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Game.kt index 039ce3d302..79a2d48150 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Game.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Game.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameDir.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameDir.kt index b3f7a8d14a..1c8ab3c6ac 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameDir.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameDir.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameProperties.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameProperties.kt index abeee8f73b..890efa6c0b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameProperties.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameProperties.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GamesViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/GamesViewModel.kt index f5a1e55256..4ed058ede9 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GamesViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/GamesViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeSetting.kt index 114e4a89ad..572c66c265 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeViewModel.kt index 6cfbb725c8..73b5e57f53 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Installable.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Installable.kt index 6b15d54afe..0efde9722c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Installable.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Installable.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/License.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/License.kt index 735b07ee65..9dcd8d06aa 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/License.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/License.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/MessageDialogViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/MessageDialogViewModel.kt index 1f51bb3a06..3ac4647dcc 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/MessageDialogViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/MessageDialogViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/MinimalDocumentFile.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/MinimalDocumentFile.kt index 176c6f3b71..ebf8fe2033 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/MinimalDocumentFile.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/MinimalDocumentFile.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Patch.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Patch.kt index 6e9d09d1be..9288533786 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Patch.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Patch.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/SetupPage.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/SetupPage.kt index 0316009d6c..41b9ad0505 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/SetupPage.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/SetupPage.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/TaskViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/TaskViewModel.kt index e4d635ff4f..6b888b8e34 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/TaskViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/TaskViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlay.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlay.kt index 76e33bef37..590d3c3021 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlay.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlay.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt index 0ba7205e58..73e42ee1b0 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt index 6f24f5c1da..d325990993 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt index e6f8b5d21a..adeb1580ed 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControl.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControl.kt index 605f63ff79..f64c89fa08 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControl.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControl.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlData.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlData.kt index 7559bcfe2d..f3758eb81e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlData.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlData.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt index 0df2e4ff8b..713cba8a00 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayLayout.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayLayout.kt index 1eb0105352..4ae6d680a5 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayLayout.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayLayout.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/GamesFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/ui/GamesFragment.kt index b37aa23850..521ee2320a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/GamesFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/ui/GamesFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/MainActivity.kt index ea5ba39a32..a71153572b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/MainActivity.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.ui.main diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/ThemeProvider.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/ThemeProvider.kt index 3ba6c5cd16..f295bc425c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/ThemeProvider.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/ThemeProvider.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.ui.main diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/AddonUtil.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/AddonUtil.kt index adc4228bc0..e6e1e0e758 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/AddonUtil.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/AddonUtil.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DirectoryInitialization.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DirectoryInitialization.kt index 451757fea3..136d114b2d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DirectoryInitialization.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DirectoryInitialization.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DocumentsTree.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DocumentsTree.kt index 8269cbc238..d705a2bb4c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DocumentsTree.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DocumentsTree.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/FileUtil.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/FileUtil.kt index 61a40992a8..a29220dd5d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/FileUtil.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/FileUtil.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameHelper.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameHelper.kt index 4800c5cb4e..9dd7d3d59e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameHelper.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameHelper.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameIconUtils.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameIconUtils.kt index 692030c218..22a0eb4cef 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameIconUtils.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameIconUtils.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverHelper.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverHelper.kt index 28486d32de..024dd8c5a2 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverHelper.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverHelper.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverMetadata.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverMetadata.kt index c12e49d2cd..488b45355e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverMetadata.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverMetadata.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InputHandler.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InputHandler.kt index 90afcea9aa..f4a2b5a109 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InputHandler.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InputHandler.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InsetsHelper.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InsetsHelper.kt index d5621f42cc..9292349aa5 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InsetsHelper.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InsetsHelper.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/Log.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/Log.kt index 794f03629d..7d327d2011 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/Log.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/Log.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/MemoryUtil.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/MemoryUtil.kt index 3617b0dc54..624e04e1f0 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/MemoryUtil.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/MemoryUtil.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NativeConfig.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NativeConfig.kt index 248b02515c..6de5ac5a48 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NativeConfig.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NativeConfig.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NfcReader.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NfcReader.kt index 2a8045202c..dbf48be612 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NfcReader.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NfcReader.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/PreferenceUtil.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/PreferenceUtil.kt index ad8fd59211..99a82d8e2b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/PreferenceUtil.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/PreferenceUtil.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/SerializableHelper.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/SerializableHelper.kt index 71438c2866..1d9c2d635f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/SerializableHelper.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/SerializableHelper.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ThemeHelper.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ThemeHelper.kt index 2c0b3ea2ed..9be635dfc7 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ThemeHelper.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ThemeHelper.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ViewUtils.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ViewUtils.kt index b81e146673..fc7efb1643 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ViewUtils.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ViewUtils.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/views/FixedRatioSurfaceView.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/views/FixedRatioSurfaceView.kt index 7d4708ce12..227adea4a1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/views/FixedRatioSurfaceView.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/views/FixedRatioSurfaceView.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.views diff --git a/src/android/app/src/main/jni/game_metadata.cpp b/src/android/app/src/main/jni/game_metadata.cpp index c9f3ed50f6..451727bcfc 100644 --- a/src/android/app/src/main/jni/game_metadata.cpp +++ b/src/android/app/src/main/jni/game_metadata.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/android/android_common.h" diff --git a/src/android/app/src/main/jni/native.h b/src/android/app/src/main/jni/native.h index e03002e641..318af963b6 100644 --- a/src/android/app/src/main/jni/native.h +++ b/src/android/app/src/main/jni/native.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/android/gradlew b/src/android/gradlew index afa1279664..f1f3ed3a4e 100755 --- a/src/android/gradlew +++ b/src/android/gradlew @@ -1,7 +1,20 @@ -#!/usr/bin/env sh +#!/bin/sh -# SPDX-FileCopyrightText: 2023 yuzu Emulator Project -# SPDX-License-Identifier: GPL-3.0-or-later +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ############################################################################## ## diff --git a/src/android/gradlew.bat b/src/android/gradlew.bat index 3aa3a7669c..fec6cb2bdd 100644 --- a/src/android/gradlew.bat +++ b/src/android/gradlew.bat @@ -1,7 +1,20 @@ -@rem SPDX-FileCopyrightText: 2023 suyu Emulator Project -@rem SPDX-License-Identifier: GPL-3.0-or-later +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows From c1a173132489a99594e754497e181093691924d6 Mon Sep 17 00:00:00 2001 From: Exverge Date: Sat, 23 Mar 2024 19:11:30 -0400 Subject: [PATCH 022/165] Revert "Add suyu copyright notice in files with modifications" --- src/android/app/build.gradle.kts | 2 +- src/android/app/src/main/AndroidManifest.xml | 2 +- .../java/org/suyu/suyu_emu/NativeLibrary.kt | 2 +- .../java/org/suyu/suyu_emu/SuyuApplication.kt | 2 +- .../suyu_emu/activities/EmulationActivity.kt | 2 +- .../suyu/suyu_emu/adapters/AddonAdapter.kt | 2 +- .../suyu/suyu_emu/adapters/AppletAdapter.kt | 2 +- .../adapters/CabinetLauncherDialogAdapter.kt | 2 +- .../suyu/suyu_emu/adapters/DriverAdapter.kt | 2 +- .../suyu/suyu_emu/adapters/FolderAdapter.kt | 2 +- .../org/suyu/suyu_emu/adapters/GameAdapter.kt | 2 +- .../adapters/GamePropertiesAdapter.kt | 2 +- .../suyu_emu/adapters/HomeSettingAdapter.kt | 2 +- .../suyu_emu/adapters/InstallableAdapter.kt | 2 +- .../suyu/suyu_emu/adapters/LicenseAdapter.kt | 2 +- .../suyu/suyu_emu/adapters/SetupAdapter.kt | 2 +- .../DiskShaderCacheProgress.kt | 2 +- .../suyu_emu/features/DocumentProvider.kt | 2 +- .../settings/model/AbstractBooleanSetting.kt | 2 +- .../settings/model/AbstractByteSetting.kt | 2 +- .../settings/model/AbstractFloatSetting.kt | 2 +- .../settings/model/AbstractIntSetting.kt | 2 +- .../settings/model/AbstractLongSetting.kt | 2 +- .../settings/model/AbstractSetting.kt | 2 +- .../settings/model/AbstractShortSetting.kt | 2 +- .../settings/model/AbstractStringSetting.kt | 2 +- .../features/settings/model/BooleanSetting.kt | 2 +- .../features/settings/model/ByteSetting.kt | 2 +- .../features/settings/model/FloatSetting.kt | 2 +- .../features/settings/model/IntSetting.kt | 2 +- .../features/settings/model/LongSetting.kt | 2 +- .../features/settings/model/Settings.kt | 2 +- .../features/settings/model/ShortSetting.kt | 2 +- .../features/settings/model/StringSetting.kt | 2 +- .../settings/model/view/DateTimeSetting.kt | 2 +- .../settings/model/view/HeaderSetting.kt | 2 +- .../model/view/IntSingleChoiceSetting.kt | 2 +- .../settings/model/view/RunnableSetting.kt | 2 +- .../settings/model/view/SettingsItem.kt | 2 +- .../model/view/SingleChoiceSetting.kt | 2 +- .../settings/model/view/SliderSetting.kt | 2 +- .../model/view/StringSingleChoiceSetting.kt | 2 +- .../settings/model/view/SubmenuSetting.kt | 2 +- .../settings/model/view/SwitchSetting.kt | 2 +- .../features/settings/ui/SettingsActivity.kt | 2 +- .../features/settings/ui/SettingsAdapter.kt | 2 +- .../settings/ui/SettingsDialogFragment.kt | 2 +- .../features/settings/ui/SettingsFragment.kt | 2 +- .../settings/ui/SettingsFragmentPresenter.kt | 2 +- .../settings/ui/SettingsSearchFragment.kt | 2 +- .../features/settings/ui/SettingsViewModel.kt | 2 +- .../ui/viewholder/DateTimeViewHolder.kt | 2 +- .../ui/viewholder/HeaderViewHolder.kt | 2 +- .../ui/viewholder/RunnableViewHolder.kt | 2 +- .../ui/viewholder/SettingViewHolder.kt | 2 +- .../ui/viewholder/SingleChoiceViewHolder.kt | 2 +- .../ui/viewholder/SliderViewHolder.kt | 2 +- .../ui/viewholder/SubmenuViewHolder.kt | 2 +- .../ui/viewholder/SwitchSettingViewHolder.kt | 2 +- .../features/settings/utils/SettingsFile.kt | 2 +- .../suyu/suyu_emu/fragments/AboutFragment.kt | 2 +- .../fragments/AddGameFolderDialogFragment.kt | 2 +- .../suyu/suyu_emu/fragments/AddonsFragment.kt | 2 +- .../fragments/AppletLauncherFragment.kt | 2 +- .../CabinetLauncherDialogFragment.kt | 2 +- .../ContentTypeSelectionDialogFragment.kt | 2 +- .../fragments/DriverManagerFragment.kt | 2 +- .../fragments/DriversLoadingDialogFragment.kt | 2 +- .../suyu_emu/fragments/EarlyAccessFragment.kt | 2 +- .../suyu_emu/fragments/EmulationFragment.kt | 2 +- .../GameFolderPropertiesDialogFragment.kt | 2 +- .../suyu_emu/fragments/GameFoldersFragment.kt | 2 +- .../suyu_emu/fragments/GameInfoFragment.kt | 2 +- .../fragments/GamePropertiesFragment.kt | 2 +- .../fragments/HomeSettingsFragment.kt | 2 +- .../suyu_emu/fragments/InstallableFragment.kt | 2 +- .../fragments/LaunchGameDialogFragment.kt | 2 +- .../LicenseBottomSheetDialogFragment.kt | 2 +- .../suyu_emu/fragments/LicensesFragment.kt | 2 +- .../fragments/MessageDialogFragment.kt | 2 +- .../PermissionDeniedDialogFragment.kt | 2 +- .../fragments/ProgressDialogFragment.kt | 2 +- .../fragments/ResetSettingsDialogFragment.kt | 2 +- .../suyu/suyu_emu/fragments/SearchFragment.kt | 2 +- .../suyu/suyu_emu/fragments/SetupFragment.kt | 2 +- .../fragments/SetupWarningDialogFragment.kt | 2 +- .../layout/AutofitGridLayoutManager.kt | 2 +- .../org/suyu/suyu_emu/model/AddonViewModel.kt | 2 +- .../java/org/suyu/suyu_emu/model/Applet.kt | 2 +- .../suyu/suyu_emu/model/DriverViewModel.kt | 2 +- .../suyu/suyu_emu/model/EmulationViewModel.kt | 2 +- .../main/java/org/suyu/suyu_emu/model/Game.kt | 2 +- .../java/org/suyu/suyu_emu/model/GameDir.kt | 2 +- .../org/suyu/suyu_emu/model/GameProperties.kt | 2 +- .../org/suyu/suyu_emu/model/GamesViewModel.kt | 2 +- .../org/suyu/suyu_emu/model/HomeSetting.kt | 2 +- .../org/suyu/suyu_emu/model/HomeViewModel.kt | 2 +- .../org/suyu/suyu_emu/model/Installable.kt | 2 +- .../java/org/suyu/suyu_emu/model/License.kt | 2 +- .../suyu_emu/model/MessageDialogViewModel.kt | 2 +- .../suyu_emu/model/MinimalDocumentFile.kt | 2 +- .../java/org/suyu/suyu_emu/model/Patch.kt | 2 +- .../java/org/suyu/suyu_emu/model/SetupPage.kt | 2 +- .../org/suyu/suyu_emu/model/TaskViewModel.kt | 2 +- .../org/suyu/suyu_emu/overlay/InputOverlay.kt | 2 +- .../overlay/InputOverlayDrawableButton.kt | 2 +- .../overlay/InputOverlayDrawableDpad.kt | 2 +- .../overlay/InputOverlayDrawableJoystick.kt | 2 +- .../suyu_emu/overlay/model/OverlayControl.kt | 2 +- .../overlay/model/OverlayControlData.kt | 2 +- .../overlay/model/OverlayControlDefault.kt | 2 +- .../suyu_emu/overlay/model/OverlayLayout.kt | 2 +- .../org/suyu/suyu_emu/ui/GamesFragment.kt | 2 +- .../org/suyu/suyu_emu/ui/main/MainActivity.kt | 2 +- .../suyu/suyu_emu/ui/main/ThemeProvider.kt | 2 +- .../java/org/suyu/suyu_emu/utils/AddonUtil.kt | 2 +- .../suyu_emu/utils/DirectoryInitialization.kt | 2 +- .../org/suyu/suyu_emu/utils/DocumentsTree.kt | 2 +- .../java/org/suyu/suyu_emu/utils/FileUtil.kt | 2 +- .../org/suyu/suyu_emu/utils/GameHelper.kt | 2 +- .../org/suyu/suyu_emu/utils/GameIconUtils.kt | 2 +- .../suyu/suyu_emu/utils/GpuDriverHelper.kt | 2 +- .../suyu/suyu_emu/utils/GpuDriverMetadata.kt | 2 +- .../org/suyu/suyu_emu/utils/InputHandler.kt | 2 +- .../org/suyu/suyu_emu/utils/InsetsHelper.kt | 2 +- .../main/java/org/suyu/suyu_emu/utils/Log.kt | 2 +- .../org/suyu/suyu_emu/utils/MemoryUtil.kt | 2 +- .../org/suyu/suyu_emu/utils/NativeConfig.kt | 2 +- .../java/org/suyu/suyu_emu/utils/NfcReader.kt | 2 +- .../org/suyu/suyu_emu/utils/PreferenceUtil.kt | 2 +- .../suyu/suyu_emu/utils/SerializableHelper.kt | 2 +- .../org/suyu/suyu_emu/utils/ThemeHelper.kt | 2 +- .../java/org/suyu/suyu_emu/utils/ViewUtils.kt | 2 +- .../suyu_emu/views/FixedRatioSurfaceView.kt | 2 +- .../app/src/main/jni/game_metadata.cpp | 2 +- src/android/app/src/main/jni/native.h | 2 +- src/android/gradlew | 19 +++---------------- src/android/gradlew.bat | 19 +++---------------- 138 files changed, 142 insertions(+), 168 deletions(-) diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts index 5fc1e8093f..78f8cc3488 100644 --- a/src/android/app/build.gradle.kts +++ b/src/android/app/build.gradle.kts @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later import android.annotation.SuppressLint diff --git a/src/android/app/src/main/AndroidManifest.xml b/src/android/app/src/main/AndroidManifest.xml index ab23f2cacb..02d08c00be 100644 --- a/src/android/app/src/main/AndroidManifest.xml +++ b/src/android/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/NativeLibrary.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/NativeLibrary.kt index 02357cac5e..071737e686 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/NativeLibrary.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/NativeLibrary.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/SuyuApplication.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/SuyuApplication.kt index 3117baad28..845e39d6d5 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/SuyuApplication.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/SuyuApplication.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/activities/EmulationActivity.kt index 16e3e54ee8..6aa35fb7ab 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/activities/EmulationActivity.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.activities diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AddonAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AddonAdapter.kt index f5eef33d82..ae483115e9 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AddonAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AddonAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AppletAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AppletAdapter.kt index ecd40b69ec..73c43a6d2c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AppletAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AppletAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt index 216000dc1d..188b3ae464 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/DriverAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/DriverAdapter.kt index c6731ce03b..4c8e53abbd 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/DriverAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/DriverAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/FolderAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/FolderAdapter.kt index 3b346c6143..dfe332586d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/FolderAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/FolderAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GameAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GameAdapter.kt index 0a3fdc128d..6a87c8852c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GameAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GameAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt index 8999b2a1e0..1d3916b43f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/HomeSettingAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/HomeSettingAdapter.kt index 91db100ce9..973e0b457d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/HomeSettingAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/HomeSettingAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/InstallableAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/InstallableAdapter.kt index 026f0ca91c..fbd420aaae 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/InstallableAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/InstallableAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/LicenseAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/LicenseAdapter.kt index eb78ed77be..5358cd6067 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/LicenseAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/LicenseAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/SetupAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/SetupAdapter.kt index 60ba78f598..2dcd5cfc64 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/SetupAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/SetupAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.adapters diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt index 441e22a73e..80df698230 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.disk_shader_cache diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/DocumentProvider.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/DocumentProvider.kt index 8abbf0f465..3e434cdd66 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/DocumentProvider.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/DocumentProvider.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: MPL-2.0 diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt index 2c0c6288b0..8266e3dbd1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt index bb16eecd39..6ef8255341 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt index 9a4f11dc80..5437a65ade 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt index 378201a210..1d979d153d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt index 4ef2096d62..22e94c10b8 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractSetting.kt index 000742d818..f4cf067e65 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt index 6d99eacdc9..4488802269 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt index eedf8524c6..3afb1bc3a1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/BooleanSetting.kt index e006bcb668..2e36e82b9a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/BooleanSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ByteSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ByteSetting.kt index a2573358ee..9a3f966697 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ByteSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ByteSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/FloatSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/FloatSetting.kt index ed1b43e3d1..6d266cb5c8 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/FloatSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/FloatSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/IntSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/IntSetting.kt index 23364489a0..bf62df3c28 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/IntSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/IntSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/LongSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/LongSetting.kt index 753f764f6d..01f2e580ae 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/LongSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/LongSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/Settings.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/Settings.kt index 3b2852039a..2352c3824f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/Settings.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/Settings.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ShortSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ShortSetting.kt index cef5445372..45614501c3 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ShortSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ShortSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/StringSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/StringSetting.kt index 04db614f4f..3f40fedcce 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/StringSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/StringSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt index 1d30e77e82..7ed6a721af 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt index 2b7100150e..da9b34e9be 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt index 6c5422b9fe..ba43799254 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt index 695db7920c..b48e0ee4d1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt index 991bfc45be..8aa8a477de 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt index 5368b956ed..4d0edda0ff 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt index 6efb7ce128..45471a64e8 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt index 70513552dd..2a35a1b425 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt index ccd601d300..e381af10a3 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt index aa3a7bffba..f7d4b73f91 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.model.view diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt index 7b41a394e7..aaa621a1da 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt index 857baf7e1e..6693e16096 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt index 80b1a76a45..8d22dc1d55 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt index f3bea85b44..8e7896780a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt index 81666c8d31..876725a35e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt index 60eceda27d..bab4765b5a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt index b58ed726c0..e99dec076d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt index 2e365d240d..a996f044f9 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt index d59d18d954..7b9c8303d4 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt index 0d7955a616..f210925fd2 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt index f8de9466b7..93b0967462 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt index dd6acf5282..f8b891c94a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt index e02bc1d1f5..160dc33b75 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt index d92e875c13..3701f0f46e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt index 38e032a907..93e50f381b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.ui.viewholder diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/utils/SettingsFile.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/utils/SettingsFile.kt index 1180315c14..3c05c2c219 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/utils/SettingsFile.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/utils/SettingsFile.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.features.settings.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AboutFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AboutFragment.kt index 3c20c65a07..66b4fd5604 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AboutFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AboutFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt index 8d90b6d9d7..bfc06a31c9 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddonsFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddonsFragment.kt index 5c421ac73d..825b0869de 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddonsFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddonsFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AppletLauncherFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AppletLauncherFragment.kt index 4ff1d4fc7d..138e5074af 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AppletLauncherFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AppletLauncherFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt index 00eecb473f..dce2c8ca1f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt index 9d84685ad8..5bbf751a3a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriverManagerFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriverManagerFragment.kt index def088ddbc..812037563b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriverManagerFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriverManagerFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt index 60e88ff9e4..993eb015d7 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EarlyAccessFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EarlyAccessFragment.kt index 73940a62a3..7eebf77159 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EarlyAccessFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EarlyAccessFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EmulationFragment.kt index 38fc7c732e..62fbcaf629 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EmulationFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt index eec06d7f53..e65f0f5e6c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFoldersFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFoldersFragment.kt index 7851048189..7b9ccce0a1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFoldersFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFoldersFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameInfoFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameInfoFragment.kt index 967f6fa88a..16901fead4 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameInfoFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameInfoFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GamePropertiesFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GamePropertiesFragment.kt index 944c0097c3..e56b186d06 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GamePropertiesFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GamePropertiesFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/HomeSettingsFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/HomeSettingsFragment.kt index 9cfa0e14c9..790ca7a54b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/HomeSettingsFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/HomeSettingsFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/InstallableFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/InstallableFragment.kt index eb366790c3..4a4dd11f4f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/InstallableFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/InstallableFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt index e3c768b512..4cc4f62407 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt index e7404e3a41..76e34b62da 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicensesFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicensesFragment.kt index 4cc85dd345..b5709d624e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicensesFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicensesFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/MessageDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/MessageDialogFragment.kt index 903d1b0c32..ed80521354 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/MessageDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/MessageDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt index 399a518a84..c384584b19 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ProgressDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ProgressDialogFragment.kt index 9661c103cd..c1221f383c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ProgressDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ProgressDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt index 39f059832a..24f9f6a10a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SearchFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SearchFragment.kt index 61f6c047d1..54155bdc43 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SearchFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SearchFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupFragment.kt index 2dff315296..fdbdb20b65 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt index d5fcd3450b..a508ebfd33 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.fragments diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt index 9f042af16e..6d37cf4f8b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.layout diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/AddonViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/AddonViewModel.kt index de468d2917..e67611631e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/AddonViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/AddonViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Applet.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Applet.kt index 80f21f1231..af22fd0bc4 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Applet.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Applet.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/DriverViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/DriverViewModel.kt index 011bddbac3..7009d453ae 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/DriverViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/DriverViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/EmulationViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/EmulationViewModel.kt index 80d4f6bc26..3d6e744e93 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/EmulationViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/EmulationViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Game.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Game.kt index 79a2d48150..039ce3d302 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Game.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Game.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameDir.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameDir.kt index 1c8ab3c6ac..b3f7a8d14a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameDir.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameDir.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameProperties.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameProperties.kt index 890efa6c0b..abeee8f73b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameProperties.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameProperties.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GamesViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/GamesViewModel.kt index 4ed058ede9..f5a1e55256 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GamesViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/GamesViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeSetting.kt index 572c66c265..114e4a89ad 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeSetting.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeViewModel.kt index 73b5e57f53..6cfbb725c8 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Installable.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Installable.kt index 0efde9722c..6b15d54afe 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Installable.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Installable.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/License.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/License.kt index 9dcd8d06aa..735b07ee65 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/License.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/License.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/MessageDialogViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/MessageDialogViewModel.kt index 3ac4647dcc..1f51bb3a06 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/MessageDialogViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/MessageDialogViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/MinimalDocumentFile.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/MinimalDocumentFile.kt index ebf8fe2033..176c6f3b71 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/MinimalDocumentFile.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/MinimalDocumentFile.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Patch.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Patch.kt index 9288533786..6e9d09d1be 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Patch.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Patch.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/SetupPage.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/SetupPage.kt index 41b9ad0505..0316009d6c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/SetupPage.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/SetupPage.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/TaskViewModel.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/TaskViewModel.kt index 6b888b8e34..e4d635ff4f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/TaskViewModel.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/TaskViewModel.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlay.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlay.kt index 590d3c3021..76e33bef37 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlay.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlay.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt index 73e42ee1b0..0ba7205e58 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt index d325990993..6f24f5c1da 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt index adeb1580ed..e6f8b5d21a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControl.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControl.kt index f64c89fa08..605f63ff79 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControl.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControl.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlData.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlData.kt index f3758eb81e..7559bcfe2d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlData.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlData.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt index 713cba8a00..0df2e4ff8b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayLayout.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayLayout.kt index 4ae6d680a5..1eb0105352 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayLayout.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayLayout.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.overlay.model diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/GamesFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/ui/GamesFragment.kt index 521ee2320a..b37aa23850 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/GamesFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/ui/GamesFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/MainActivity.kt index a71153572b..ea5ba39a32 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/MainActivity.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.ui.main diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/ThemeProvider.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/ThemeProvider.kt index f295bc425c..3ba6c5cd16 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/ThemeProvider.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/ThemeProvider.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.ui.main diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/AddonUtil.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/AddonUtil.kt index e6e1e0e758..adc4228bc0 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/AddonUtil.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/AddonUtil.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DirectoryInitialization.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DirectoryInitialization.kt index 136d114b2d..451757fea3 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DirectoryInitialization.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DirectoryInitialization.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DocumentsTree.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DocumentsTree.kt index d705a2bb4c..8269cbc238 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DocumentsTree.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DocumentsTree.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/FileUtil.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/FileUtil.kt index a29220dd5d..61a40992a8 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/FileUtil.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/FileUtil.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameHelper.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameHelper.kt index 9dd7d3d59e..4800c5cb4e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameHelper.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameHelper.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameIconUtils.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameIconUtils.kt index 22a0eb4cef..692030c218 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameIconUtils.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameIconUtils.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverHelper.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverHelper.kt index 024dd8c5a2..28486d32de 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverHelper.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverHelper.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverMetadata.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverMetadata.kt index 488b45355e..c12e49d2cd 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverMetadata.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverMetadata.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InputHandler.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InputHandler.kt index f4a2b5a109..90afcea9aa 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InputHandler.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InputHandler.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InsetsHelper.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InsetsHelper.kt index 9292349aa5..d5621f42cc 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InsetsHelper.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InsetsHelper.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/Log.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/Log.kt index 7d327d2011..794f03629d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/Log.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/Log.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/MemoryUtil.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/MemoryUtil.kt index 624e04e1f0..3617b0dc54 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/MemoryUtil.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/MemoryUtil.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NativeConfig.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NativeConfig.kt index 6de5ac5a48..248b02515c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NativeConfig.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NativeConfig.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NfcReader.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NfcReader.kt index dbf48be612..2a8045202c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NfcReader.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NfcReader.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/PreferenceUtil.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/PreferenceUtil.kt index 99a82d8e2b..ad8fd59211 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/PreferenceUtil.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/PreferenceUtil.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/SerializableHelper.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/SerializableHelper.kt index 1d9c2d635f..71438c2866 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/SerializableHelper.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/SerializableHelper.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ThemeHelper.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ThemeHelper.kt index 9be635dfc7..2c0b3ea2ed 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ThemeHelper.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ThemeHelper.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ViewUtils.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ViewUtils.kt index fc7efb1643..b81e146673 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ViewUtils.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ViewUtils.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/views/FixedRatioSurfaceView.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/views/FixedRatioSurfaceView.kt index 227adea4a1..7d4708ce12 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/views/FixedRatioSurfaceView.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/views/FixedRatioSurfaceView.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project 2023 yuzu Emulator Project 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.views diff --git a/src/android/app/src/main/jni/game_metadata.cpp b/src/android/app/src/main/jni/game_metadata.cpp index 451727bcfc..c9f3ed50f6 100644 --- a/src/android/app/src/main/jni/game_metadata.cpp +++ b/src/android/app/src/main/jni/game_metadata.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/android/android_common.h" diff --git a/src/android/app/src/main/jni/native.h b/src/android/app/src/main/jni/native.h index 318af963b6..e03002e641 100644 --- a/src/android/app/src/main/jni/native.h +++ b/src/android/app/src/main/jni/native.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/android/gradlew b/src/android/gradlew index f1f3ed3a4e..afa1279664 100755 --- a/src/android/gradlew +++ b/src/android/gradlew @@ -1,20 +1,7 @@ -#!/bin/sh +#!/usr/bin/env sh -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# +# SPDX-FileCopyrightText: 2023 yuzu Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later ############################################################################## ## diff --git a/src/android/gradlew.bat b/src/android/gradlew.bat index fec6cb2bdd..3aa3a7669c 100644 --- a/src/android/gradlew.bat +++ b/src/android/gradlew.bat @@ -1,20 +1,7 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem +@rem SPDX-FileCopyrightText: 2023 suyu Emulator Project +@rem SPDX-License-Identifier: GPL-3.0-or-later -@if "%DEBUG%"=="" @echo off +@if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows From 1648d189d3f2d4db870417c7e51d32e6d21d8c7e Mon Sep 17 00:00:00 2001 From: SylverDiscord51 Date: Sun, 24 Mar 2024 02:15:57 +0100 Subject: [PATCH 023/165] license-fix (#31) Co-authored-by: palfaiate Co-authored-by: SylverDiscord51 Co-committed-by: SylverDiscord51 --- .ci/scripts/clang/upload.sh | 2 +- .ci/scripts/linux/upload.sh | 2 +- .ci/scripts/windows/docker.sh | 2 +- .gitignore | 3 +++ CMakeLists.txt | 3 ++- CMakeModules/CopySuyuFFmpegDeps.cmake | 2 +- CMakeModules/CopySuyuQt5Deps.cmake | 3 ++- CMakeModules/CopySuyuSDLDeps.cmake | 3 ++- CMakeModules/DownloadExternals.cmake | 4 ++-- CMakeModules/FindLLVM.cmake | 1 + CMakeModules/GenerateSCMRev.cmake | 5 +++-- CONTRIBUTING.md | 3 ++- README.md | 3 ++- dist/72-suyu-input.rules | 2 +- dist/org.suyu_emu.suyu.desktop | 3 ++- dist/org.suyu_emu.suyu.metainfo.xml | 3 ++- dist/org.suyu_emu.suyu.xml | 3 ++- dist/qt_themes/default/default.qrc | 2 +- dist/suyu.manifest | 3 ++- externals/CMakeLists.txt | 2 +- hooks/pre-commit | 1 + src/CMakeLists.txt | 3 ++- .../java/org/suyu/suyu_emu/adapters/AbstractDiffAdapter.kt | 1 + .../java/org/suyu/suyu_emu/adapters/AbstractListAdapter.kt | 1 + .../suyu/suyu_emu/adapters/AbstractSingleSelectionList.kt | 1 + .../org/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard.kt | 2 +- .../suyu_emu/applets/keyboard/ui/KeyboardDialogFragment.kt | 2 +- .../java/org/suyu/suyu_emu/features/input/NativeInput.kt | 1 + .../java/org/suyu/suyu_emu/features/input/SuyuInputDevice.kt | 1 + .../java/org/suyu/suyu_emu/features/input/SuyuVibrator.kt | 1 + .../suyu/suyu_emu/features/input/model/AnalogDirection.kt | 1 + .../org/suyu/suyu_emu/features/input/model/ButtonName.kt | 1 + .../java/org/suyu/suyu_emu/features/input/model/InputType.kt | 1 + .../org/suyu/suyu_emu/features/input/model/NativeAnalog.kt | 1 + .../org/suyu/suyu_emu/features/input/model/NativeButton.kt | 1 + .../org/suyu/suyu_emu/features/input/model/NativeTrigger.kt | 1 + .../org/suyu/suyu_emu/features/input/model/NpadStyleIndex.kt | 1 + .../org/suyu/suyu_emu/features/input/model/PlayerInput.kt | 1 + .../features/settings/model/view/AnalogInputSetting.kt | 1 + .../features/settings/model/view/ButtonInputSetting.kt | 1 + .../features/settings/model/view/InputProfileSetting.kt | 1 + .../suyu_emu/features/settings/model/view/InputSetting.kt | 1 + .../features/settings/model/view/ModifierInputSetting.kt | 1 + .../features/settings/model/view/StringInputSetting.kt | 1 + .../suyu_emu/features/settings/ui/InputDialogFragment.kt | 1 + .../suyu_emu/features/settings/ui/InputProfileAdapter.kt | 1 + .../features/settings/ui/InputProfileDialogFragment.kt | 1 + .../features/settings/ui/NewInputProfileDialogFragment.kt | 1 + .../settings/ui/viewholder/InputProfileViewHolder.kt | 1 + .../features/settings/ui/viewholder/InputViewHolder.kt | 1 + .../features/settings/ui/viewholder/StringInputViewHolder.kt | 1 + .../org/suyu/suyu_emu/fragments/CoreErrorDialogFragment.kt | 1 + .../app/src/main/java/org/suyu/suyu_emu/model/Driver.kt | 1 + .../java/org/suyu/suyu_emu/model/GameVerificationResult.kt | 1 + .../src/main/java/org/suyu/suyu_emu/model/InstallResult.kt | 1 + .../app/src/main/java/org/suyu/suyu_emu/model/PatchType.kt | 1 + .../src/main/java/org/suyu/suyu_emu/model/SelectableItem.kt | 1 + .../src/main/java/org/suyu/suyu_emu/utils/GameMetadata.kt | 2 +- .../src/main/java/org/suyu/suyu_emu/utils/LifecycleUtils.kt | 1 + .../src/main/java/org/suyu/suyu_emu/utils/ParamPackage.kt | 1 + .../java/org/suyu/suyu_emu/viewholder/AbstractViewHolder.kt | 1 + src/android/app/src/main/jni/game_metadata.cpp | 2 +- src/android/app/src/main/jni/native.cpp | 2 +- src/android/app/src/main/jni/native.h | 2 +- src/android/app/src/main/jni/native_input.cpp | 3 ++- src/audio_core/sink/cubeb_sink.cpp | 2 +- src/audio_core/sink/sink_stream.cpp | 2 +- src/common/CMakeLists.txt | 3 ++- src/common/android/applets/software_keyboard.cpp | 2 +- src/common/android/id_cache.cpp | 2 +- src/common/android/id_cache.h | 2 +- src/common/assert.h | 2 +- src/common/common_funcs.h | 2 +- src/common/fs/fs_paths.h | 2 +- src/common/fs/path_util.cpp | 2 +- src/common/fs/path_util.h | 2 +- src/common/intrusive_list.h | 2 +- src/common/intrusive_red_black_tree.h | 2 +- src/common/logging/backend.cpp | 2 +- src/common/logging/types.h | 2 +- src/common/nvidia_flags.cpp | 2 +- src/common/scope_exit.h | 2 +- src/common/settings.cpp | 2 +- src/common/settings.h | 2 +- src/common/uuid.h | 2 +- src/common/x64/cpu_detect.cpp | 2 +- src/core/arm/arm_interface.h | 2 +- src/core/arm/nce/arm_nce.cpp | 2 +- src/core/arm/nce/patcher.cpp | 2 +- src/core/crypto/key_manager.cpp | 2 +- src/core/device_memory_manager.inc | 2 +- src/core/file_sys/bis_factory.cpp | 2 +- src/core/file_sys/fs_path.h | 2 +- .../fssystem/fssystem_aes_ctr_counter_extended_storage.h | 2 +- src/core/file_sys/fssystem/fssystem_aes_ctr_storage.h | 2 +- src/core/file_sys/fssystem/fssystem_aes_xts_storage.h | 2 +- .../file_sys/fssystem/fssystem_alignment_matching_storage.h | 2 +- src/core/file_sys/fssystem/fssystem_bucket_tree.h | 2 +- src/core/file_sys/fssystem/fssystem_compressed_storage.h | 2 +- .../fssystem_hierarchical_integrity_verification_storage.h | 2 +- .../file_sys/fssystem/fssystem_hierarchical_sha256_storage.h | 2 +- src/core/file_sys/fssystem/fssystem_indirect_storage.h | 2 +- .../fssystem/fssystem_integrity_verification_storage.h | 2 +- .../fssystem/fssystem_memory_resource_buffer_hold_storage.h | 2 +- .../file_sys/fssystem/fssystem_nca_file_system_driver.cpp | 2 +- src/core/file_sys/fssystem/fssystem_nca_file_system_driver.h | 2 +- src/core/file_sys/fssystem/fssystem_pooled_buffer.h | 2 +- src/core/file_sys/fssystem/fssystem_sparse_storage.h | 2 +- src/core/file_sys/fssystem/fssystem_switch_storage.h | 2 +- src/core/file_sys/registered_cache.cpp | 2 +- src/core/file_sys/registered_cache.h | 2 +- src/core/file_sys/vfs/vfs.h | 2 +- src/core/frontend/applets/software_keyboard.cpp | 2 +- src/core/hle/api_version.h | 2 +- src/core/hle/kernel/k_auto_object.h | 2 +- src/core/hle/kernel/k_auto_object_container.h | 2 +- src/core/hle/kernel/k_dynamic_resource_manager.h | 2 +- src/core/hle/kernel/k_dynamic_slab_heap.h | 2 +- src/core/hle/kernel/k_handle_table.h | 2 +- src/core/hle/kernel/k_memory_region.h | 2 +- src/core/hle/kernel/k_page_table_base.cpp | 2 +- src/core/hle/kernel/k_page_table_base.h | 2 +- src/core/hle/kernel/k_scheduler.h | 2 +- src/core/hle/kernel/k_slab_heap.h | 2 +- src/core/hle/kernel/k_spin_lock.h | 2 +- src/core/hle/kernel/physical_core.h | 2 +- src/core/hle/result.h | 2 +- src/core/hle/service/acc/acc.cpp | 2 +- src/core/hle/service/acc/profile_manager.cpp | 2 +- src/core/hle/service/am/frontend/applet_web_browser.cpp | 2 +- src/core/hle/service/caps/caps_manager.cpp | 2 +- src/core/hle/service/filesystem/filesystem.cpp | 2 +- src/core/hle/service/jit/jit_code_memory.h | 2 +- src/core/hle/service/ldn/lan_discovery.h | 2 +- src/core/hle/service/mii/mii_database_manager.cpp | 2 +- src/core/hle/service/nfc/common/amiibo_crypto.cpp | 2 +- src/core/hle/service/nfc/common/device.cpp | 2 +- src/core/hle/service/nifm/nifm.cpp | 2 +- src/core/hle/service/nvdrv/core/nvmap.cpp | 2 +- src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp | 2 +- src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h | 2 +- src/core/hle/service/nvdrv/devices/nvmap.cpp | 2 +- src/core/hle/service/ro/ro.cpp | 2 +- src/core/hle/service/set/system_settings_server.cpp | 2 +- src/core/hle/service/ssl/ssl_backend_schannel.cpp | 2 +- src/core/hle/service/ssl/ssl_backend_securetransport.cpp | 2 +- src/core/hle/service/vi/shared_buffer_manager.cpp | 2 +- src/core/internal_network/network.cpp | 2 +- src/core/internal_network/network.h | 2 +- src/core/internal_network/socket_proxy.cpp | 2 +- src/core/internal_network/sockets.h | 2 +- src/core/loader/kip.cpp | 2 +- src/core/loader/loader.h | 2 +- src/core/loader/nro.cpp | 2 +- src/core/loader/nso.cpp | 2 +- src/core/memory.cpp | 2 +- src/core/memory.h | 2 +- src/core/perf_stats.cpp | 2 +- src/core/reporter.cpp | 2 +- src/dedicated_room/CMakeLists.txt | 2 +- src/dedicated_room/suyu_room.cpp | 2 +- src/dedicated_room/suyu_room.rc | 2 +- src/frontend_common/config.cpp | 2 +- src/hid_core/frontend/emulated_console.h | 2 +- src/hid_core/frontend/emulated_controller.h | 2 +- src/hid_core/frontend/emulated_devices.h | 2 +- src/hid_core/hid_core.h | 2 +- src/input_common/drivers/android.cpp | 2 +- src/input_common/drivers/tas_input.cpp | 2 +- src/network/room.cpp | 2 +- src/network/room.h | 2 +- src/network/verify_user.h | 2 +- src/suyu/CMakeLists.txt | 2 +- src/suyu/about_dialog.cpp | 2 +- src/suyu/about_dialog.h | 2 +- src/suyu/applets/qt_amiibo_settings.cpp | 2 +- src/suyu/applets/qt_amiibo_settings.h | 2 +- src/suyu/applets/qt_controller.cpp | 2 +- src/suyu/applets/qt_controller.h | 2 +- src/suyu/applets/qt_error.cpp | 2 +- src/suyu/applets/qt_error.h | 2 +- src/suyu/applets/qt_profile_select.cpp | 2 +- src/suyu/applets/qt_profile_select.h | 2 +- src/suyu/applets/qt_software_keyboard.cpp | 2 +- src/suyu/applets/qt_software_keyboard.h | 2 +- src/suyu/applets/qt_web_browser.cpp | 2 +- src/suyu/applets/qt_web_browser.h | 2 +- src/suyu/applets/qt_web_browser_scripts.h | 2 +- src/suyu/bootmanager.cpp | 2 +- src/suyu/bootmanager.h | 2 +- src/suyu/breakpad.cpp | 2 +- src/suyu/configuration/configure_camera.cpp | 2 +- src/suyu/configuration/configure_camera.h | 2 +- src/suyu/configuration/configure_debug.cpp | 2 +- src/suyu/configuration/configure_filesystem.cpp | 2 +- src/suyu/configuration/configure_input_advanced.cpp | 2 +- src/suyu/configuration/configure_per_game_addons.cpp | 1 + src/suyu/configuration/configure_profile_manager.cpp | 2 +- src/suyu/configuration/configure_tas.cpp | 2 +- src/suyu/configuration/configure_ui.cpp | 2 +- src/suyu/configuration/configure_web.cpp | 2 +- src/suyu/configuration/input_profiles.cpp | 2 +- src/suyu/discord_impl.cpp | 2 +- src/suyu/game_list.cpp | 2 +- src/suyu/game_list.h | 2 +- src/suyu/game_list_worker.cpp | 2 +- src/suyu/loading_screen.cpp | 2 +- src/suyu/loading_screen.h | 2 +- src/suyu/main.cpp | 2 +- src/suyu/main.h | 2 +- src/suyu/multiplayer/direct_connect.cpp | 2 +- src/suyu/multiplayer/host_room.cpp | 2 +- src/suyu/multiplayer/lobby.cpp | 2 +- src/suyu/play_time_manager.cpp | 2 +- src/suyu/play_time_manager.h | 2 +- src/suyu/startup_checks.cpp | 2 +- src/suyu/startup_checks.h | 2 +- src/suyu/suyu.qrc | 2 +- src/suyu/suyu.rc | 2 +- src/suyu/uisettings.cpp | 2 +- src/suyu/uisettings.h | 2 +- src/suyu/vk_device_info.cpp | 2 +- src/suyu/vk_device_info.h | 2 +- src/suyu_cmd/CMakeLists.txt | 2 +- src/suyu_cmd/emu_window/emu_window_sdl2.cpp | 2 +- src/suyu_cmd/emu_window/emu_window_sdl2.h | 2 +- src/suyu_cmd/emu_window/emu_window_sdl2_gl.cpp | 2 +- src/suyu_cmd/emu_window/emu_window_sdl2_gl.h | 2 +- src/suyu_cmd/emu_window/emu_window_sdl2_null.cpp | 2 +- src/suyu_cmd/emu_window/emu_window_sdl2_null.h | 2 +- src/suyu_cmd/emu_window/emu_window_sdl2_vk.cpp | 2 +- src/suyu_cmd/emu_window/emu_window_sdl2_vk.h | 2 +- src/suyu_cmd/precompiled_headers.h | 2 +- src/suyu_cmd/sdl_config.cpp | 2 +- src/suyu_cmd/sdl_config.h | 2 +- src/suyu_cmd/suyu.cpp | 2 +- src/suyu_cmd/suyu.rc | 2 +- src/video_core/CMakeLists.txt | 2 +- src/video_core/host1x/ffmpeg/ffmpeg.cpp | 2 +- src/video_core/host1x/ffmpeg/ffmpeg.h | 2 +- src/video_core/host_shaders/fidelityfx_fsr.frag | 2 +- src/video_core/host_shaders/opengl_fidelityfx_fsr.frag | 2 +- src/video_core/host_shaders/opengl_present_scaleforce.frag | 2 +- .../host_shaders/vulkan_fidelityfx_fsr_easu_fp16.frag | 2 +- .../host_shaders/vulkan_fidelityfx_fsr_rcas_fp16.frag | 2 +- .../host_shaders/vulkan_present_scaleforce_fp16.frag | 2 +- src/video_core/macro/macro.cpp | 2 +- src/video_core/query_cache.h | 2 +- src/video_core/renderer_base.h | 2 +- src/video_core/renderer_opengl/gl_device.cpp | 2 +- src/video_core/renderer_opengl/gl_resource_manager.cpp | 2 +- src/video_core/renderer_opengl/gl_resource_manager.h | 2 +- src/video_core/renderer_opengl/gl_shader_cache.cpp | 2 +- src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | 2 +- src/video_core/renderer_vulkan/vk_texture_cache.cpp | 2 +- src/video_core/shader_cache.cpp | 2 +- src/video_core/shader_cache.h | 2 +- src/video_core/shader_environment.cpp | 2 +- src/video_core/texture_cache/texture_cache_base.h | 2 +- src/video_core/vulkan_common/nsight_aftermath_tracker.cpp | 2 +- src/video_core/vulkan_common/vulkan_device.cpp | 2 +- src/video_core/vulkan_common/vulkan_wrapper.cpp | 2 +- src/web_service/announce_room_json.h | 2 +- src/web_service/verify_login.h | 2 +- 264 files changed, 281 insertions(+), 226 deletions(-) diff --git a/.ci/scripts/clang/upload.sh b/.ci/scripts/clang/upload.sh index 3851693ec0..713f4d2103 100755 --- a/.ci/scripts/clang/upload.sh +++ b/.ci/scripts/clang/upload.sh @@ -1,6 +1,6 @@ #!/bin/bash -ex -# SPDX-FileCopyrightText: 2021 yuzu Emulator Project & 2024 suyu Emulator Project +# SPDX-FileCopyrightText: 2021 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later . .ci/scripts/common/pre-upload.sh diff --git a/.ci/scripts/linux/upload.sh b/.ci/scripts/linux/upload.sh index a88b018195..392106bcd2 100755 --- a/.ci/scripts/linux/upload.sh +++ b/.ci/scripts/linux/upload.sh @@ -1,6 +1,6 @@ #!/bin/bash -ex -# SPDX-FileCopyrightText: 2019 yuzu Emulator Project & 2024 suyu Emulator Project +# SPDX-FileCopyrightText: 2019 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later . .ci/scripts/common/pre-upload.sh diff --git a/.ci/scripts/windows/docker.sh b/.ci/scripts/windows/docker.sh index 446da7d3e5..70eadda41e 100755 --- a/.ci/scripts/windows/docker.sh +++ b/.ci/scripts/windows/docker.sh @@ -1,6 +1,6 @@ #!/bin/bash -ex -# SPDX-FileCopyrightText: 2019 yuzu Emulator Project & 2024 suyu Emulator Project +# SPDX-FileCopyrightText: 2019 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later set -e diff --git a/.gitignore b/.gitignore index 2bf2c86d8c..3fb4eca6ec 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,6 @@ Thumbs.db # Local Gitlab CI Runner .gitlab-ci-local/ + +# clangd compile_commands.json +compile_commands.json diff --git a/CMakeLists.txt b/CMakeLists.txt index b65adba582..7b4df91028 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,5 @@ -# SPDX-FileCopyrightText: 2018 yuzu Emulator Project & 2024 suyu Emulator Project +# SPDX-FileCopyrightText: 2018 yuzu Emulator Project +# SPDX-FileCopyrightText: 2024 suyu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later cmake_minimum_required(VERSION 3.22) diff --git a/CMakeModules/CopySuyuFFmpegDeps.cmake b/CMakeModules/CopySuyuFFmpegDeps.cmake index 69648407e6..88d9c44eaa 100644 --- a/CMakeModules/CopySuyuFFmpegDeps.cmake +++ b/CMakeModules/CopySuyuFFmpegDeps.cmake @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2020 yuzu Emulator Project & 2024 suyu Emulator Project +# SPDX-FileCopyrightText: 2020 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later function(copy_suyu_FFmpeg_deps target_dir) diff --git a/CMakeModules/CopySuyuQt5Deps.cmake b/CMakeModules/CopySuyuQt5Deps.cmake index 3be8815dd5..8274d25ee5 100644 --- a/CMakeModules/CopySuyuQt5Deps.cmake +++ b/CMakeModules/CopySuyuQt5Deps.cmake @@ -1,4 +1,5 @@ -# SPDX-FileCopyrightText: 2016 Citra Emulator Project & 2024 suyu Emulator Project +# SPDX-FileCopyrightText: 2016 Citra Emulator Project +# SPDX-FileCopyrightText: 2024 suyu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later function(copy_suyu_Qt5_deps target_dir) diff --git a/CMakeModules/CopySuyuSDLDeps.cmake b/CMakeModules/CopySuyuSDLDeps.cmake index 4938b30832..fbdfe8e6e0 100644 --- a/CMakeModules/CopySuyuSDLDeps.cmake +++ b/CMakeModules/CopySuyuSDLDeps.cmake @@ -1,4 +1,5 @@ -# SPDX-FileCopyrightText: 2016 Citra Emulator Project & 2024 suyu Emulator Project +# SPDX-FileCopyrightText: 2016 Citra Emulator Project +# SPDX-FileCopyrightText: 2024 suyu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later function(copy_suyu_SDL_deps target_dir) diff --git a/CMakeModules/DownloadExternals.cmake b/CMakeModules/DownloadExternals.cmake index 575a478a8e..2498773e61 100644 --- a/CMakeModules/DownloadExternals.cmake +++ b/CMakeModules/DownloadExternals.cmake @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2017 yuzu Emulator Project & 2024 suyu Emulator Project +# SPDX-FileCopyrightText: 2017 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later # This function downloads a binary library package from our external repo. @@ -7,7 +7,7 @@ # prefix_var: name of a variable which will be set with the path to the extracted contents function(download_bundled_external remote_path lib_name prefix_var) -set(package_base_url "https://gitlab.com/suyu-emu/") +set(package_base_url "https://git.suyu.dev/suyu") set(package_repo "no_platform") set(package_extension "no_platform") set(package_head "?ref_type=heads") diff --git a/CMakeModules/FindLLVM.cmake b/CMakeModules/FindLLVM.cmake index 216b5a79aa..c27bd44090 100644 --- a/CMakeModules/FindLLVM.cmake +++ b/CMakeModules/FindLLVM.cmake @@ -1,4 +1,5 @@ # SPDX-FileCopyrightText: 2023 Alexandre Bouvier +# SPDX-FileCopyrightText: 2024 suyu Emulator Project # # SPDX-License-Identifier: GPL-3.0-or-later diff --git a/CMakeModules/GenerateSCMRev.cmake b/CMakeModules/GenerateSCMRev.cmake index 229e3ff910..498412a444 100644 --- a/CMakeModules/GenerateSCMRev.cmake +++ b/CMakeModules/GenerateSCMRev.cmake @@ -1,4 +1,5 @@ -# SPDX-FileCopyrightText: 2019 yuzu Emulator Project & 2024 suyu Emulator Project +# SPDX-FileCopyrightText: 2019 yuzu Emulator Project +# SPDX-FileCopyrightText: 2024 suyu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later # Gets a UTC timestamp and sets the provided variable to it @@ -27,7 +28,7 @@ set(BUILD_VERSION "0") set(BUILD_ID ${DISPLAY_VERSION}) if (BUILD_REPOSITORY) # regex capture the string nightly or canary into CMAKE_MATCH_1 - string(REGEX MATCH "suyu-emu/suyu-?(.*)" OUTVAR ${BUILD_REPOSITORY}) + string(REGEX MATCH "suyu/suyu-?(.*)" OUTVAR ${BUILD_REPOSITORY}) if ("${CMAKE_MATCH_COUNT}" GREATER 0) # capitalize the first letter of each word in the repo name. string(REPLACE "-" ";" REPO_NAME_LIST ${CMAKE_MATCH_1}) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b9eee375ad..b2bb3f0c76 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,5 +1,6 @@ diff --git a/README.md b/README.md index 0f6657592a..d98f2b089e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ diff --git a/dist/72-suyu-input.rules b/dist/72-suyu-input.rules index 9b7e284e34..354bf38dba 100644 --- a/dist/72-suyu-input.rules +++ b/dist/72-suyu-input.rules @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2024 suyu Emulator Project +# SPDX-FileCopyrightText: 2023 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later # Allow systemd-logind to manage user access to hidraw with this file diff --git a/dist/org.suyu_emu.suyu.desktop b/dist/org.suyu_emu.suyu.desktop index 0f619d7e7e..26bc6dd6f1 100644 --- a/dist/org.suyu_emu.suyu.desktop +++ b/dist/org.suyu_emu.suyu.desktop @@ -1,4 +1,5 @@ -# SPDX-FileCopyrightText: 2018 yuzu Emulator Project & 2024 suyu Emulator Project +# SPDX-FileCopyrightText: 2018 yuzu Emulator Project +# SPDX-FileCopyrightText: 2024 suyu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later [Desktop Entry] diff --git a/dist/org.suyu_emu.suyu.metainfo.xml b/dist/org.suyu_emu.suyu.metainfo.xml index 74c72ad977..aeb2fecfbe 100644 --- a/dist/org.suyu_emu.suyu.metainfo.xml +++ b/dist/org.suyu_emu.suyu.metainfo.xml @@ -1,7 +1,8 @@ diff --git a/dist/org.suyu_emu.suyu.xml b/dist/org.suyu_emu.suyu.xml index c54c8bd8ec..9fafef671b 100644 --- a/dist/org.suyu_emu.suyu.xml +++ b/dist/org.suyu_emu.suyu.xml @@ -1,7 +1,8 @@ diff --git a/dist/qt_themes/default/default.qrc b/dist/qt_themes/default/default.qrc index 784b2b1657..4522865b4c 100644 --- a/dist/qt_themes/default/default.qrc +++ b/dist/qt_themes/default/default.qrc @@ -1,5 +1,5 @@ diff --git a/dist/suyu.manifest b/dist/suyu.manifest index 7467607c00..71bdd9f0c0 100644 --- a/dist/suyu.manifest +++ b/dist/suyu.manifest @@ -1,7 +1,8 @@ diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 7ce75c96e8..c44457f177 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2016 Citra Emulator Project & 2024 suyu Emulator Project +# SPDX-FileCopyrightText: 2016 Citra Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later # Dynarmic has cmake_minimum_required(3.12) and we may want to override diff --git a/hooks/pre-commit b/hooks/pre-commit index 0855bd565e..0739ea64cf 100755 --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -1,6 +1,7 @@ #!/bin/sh # SPDX-FileCopyrightText: 2015 Citra Emulator Project +# SPDX-FileCopyrightText: 2024 suyu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later # Enforce suyu's whitespace policy diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2c2d08aa02..20d3112f8a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,5 @@ -# SPDX-FileCopyrightText: 2018 yuzu Emulator Project & 2024 suyu Emulator Project +# SPDX-FileCopyrightText: 2018 yuzu Emulator Project +# SPDX-FileCopyrightText: 2024 suyu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later # Enable modules to include each other's files diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AbstractDiffAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AbstractDiffAdapter.kt index eeffbb09b2..e8ee0fe35a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AbstractDiffAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AbstractDiffAdapter.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AbstractListAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AbstractListAdapter.kt index 588bf9b470..5c5afb805f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AbstractListAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AbstractListAdapter.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AbstractSingleSelectionList.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AbstractSingleSelectionList.kt index ca96cc06cd..19df540454 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AbstractSingleSelectionList.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AbstractSingleSelectionList.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard.kt index 786fb5d936..8558858d9f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.applets.keyboard diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/applets/keyboard/ui/KeyboardDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/applets/keyboard/ui/KeyboardDialogFragment.kt index c89f7b035d..b80d9e0d04 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/applets/keyboard/ui/KeyboardDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/applets/keyboard/ui/KeyboardDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.applets.keyboard.ui diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/NativeInput.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/NativeInput.kt index 0edb7fc453..9639a614ac 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/NativeInput.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/NativeInput.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/SuyuInputDevice.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/SuyuInputDevice.kt index 6f9b1cd374..4e7fc4adf0 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/SuyuInputDevice.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/SuyuInputDevice.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/SuyuVibrator.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/SuyuVibrator.kt index d6e5baaf87..33cf4f5788 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/SuyuVibrator.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/SuyuVibrator.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/AnalogDirection.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/AnalogDirection.kt index 60b0f97658..ff4762c7d4 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/AnalogDirection.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/AnalogDirection.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/ButtonName.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/ButtonName.kt index b33a973665..c33e986cdb 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/ButtonName.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/ButtonName.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/InputType.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/InputType.kt index b33e3f3c2f..6d441f180a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/InputType.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/InputType.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeAnalog.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeAnalog.kt index 5ba3fe846f..cbddbadcc8 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeAnalog.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeAnalog.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeButton.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeButton.kt index 24ae9b8b70..c290cea7ca 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeButton.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeButton.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeTrigger.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeTrigger.kt index d25f6cb756..ac6583b28f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeTrigger.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeTrigger.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NpadStyleIndex.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NpadStyleIndex.kt index 3c6ed84318..7bad46d728 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NpadStyleIndex.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NpadStyleIndex.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/PlayerInput.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/PlayerInput.kt index b2f291017a..35e600dbd0 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/PlayerInput.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/PlayerInput.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/AnalogInputSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/AnalogInputSetting.kt index 2479306a4d..78103ba858 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/AnalogInputSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/AnalogInputSetting.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/ButtonInputSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/ButtonInputSetting.kt index 32bb6ef570..e586cedbb0 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/ButtonInputSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/ButtonInputSetting.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/InputProfileSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/InputProfileSetting.kt index abe1b5513d..461588354a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/InputProfileSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/InputProfileSetting.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/InputSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/InputSetting.kt index 0c45b1ca82..ac54cda377 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/InputSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/InputSetting.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/ModifierInputSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/ModifierInputSetting.kt index 3d64b5e785..4d1e2c6699 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/ModifierInputSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/ModifierInputSetting.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringInputSetting.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringInputSetting.kt index fa439e9ed7..f2dbeb2912 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringInputSetting.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringInputSetting.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputDialogFragment.kt index 4218344bb3..af7767af51 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputDialogFragment.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputProfileAdapter.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputProfileAdapter.kt index ad8db207b2..693cb77cbb 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputProfileAdapter.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputProfileAdapter.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputProfileDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputProfileDialogFragment.kt index b286e27445..55acee9eda 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputProfileDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputProfileDialogFragment.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/NewInputProfileDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/NewInputProfileDialogFragment.kt index 3dfefdf14f..e683caf190 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/NewInputProfileDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/NewInputProfileDialogFragment.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt index fe8811f6e8..72c27b668a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/InputViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/InputViewHolder.kt index a3fbd301bd..d66e4e7581 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/InputViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/InputViewHolder.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt index f20d4070d5..3acc7248cd 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CoreErrorDialogFragment.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CoreErrorDialogFragment.kt index 4247f19f91..16f3e8b08f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CoreErrorDialogFragment.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CoreErrorDialogFragment.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Driver.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Driver.kt index 849b88be4c..cf1f72bcc1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Driver.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/Driver.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameVerificationResult.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameVerificationResult.kt index 4c6968eb46..61c6014469 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameVerificationResult.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameVerificationResult.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/InstallResult.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/InstallResult.kt index e14c3d6fff..110da0f32b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/InstallResult.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/InstallResult.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/PatchType.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/PatchType.kt index 461af65a21..1880f876ec 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/PatchType.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/PatchType.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/SelectableItem.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/model/SelectableItem.kt index 700ceac33a..b8209e3f1d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/SelectableItem.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/model/SelectableItem.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameMetadata.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameMetadata.kt index 130f8010c1..d8f278e902 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameMetadata.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameMetadata.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later package org.suyu.suyu_emu.utils diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/LifecycleUtils.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/LifecycleUtils.kt index eb6d2241c9..e1b73c11d6 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/LifecycleUtils.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/LifecycleUtils.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ParamPackage.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ParamPackage.kt index c60df1752e..98a906c8e3 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ParamPackage.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ParamPackage.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/viewholder/AbstractViewHolder.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/viewholder/AbstractViewHolder.kt index f9c76b0493..ee149eae7d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/viewholder/AbstractViewHolder.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/viewholder/AbstractViewHolder.kt @@ -1,3 +1,4 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/android/app/src/main/jni/game_metadata.cpp b/src/android/app/src/main/jni/game_metadata.cpp index c9f3ed50f6..489f862978 100644 --- a/src/android/app/src/main/jni/game_metadata.cpp +++ b/src/android/app/src/main/jni/game_metadata.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/android/android_common.h" diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index 0ce841575c..35ca93a78d 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 suyu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/android/app/src/main/jni/native.h b/src/android/app/src/main/jni/native.h index e03002e641..6a4551ada2 100644 --- a/src/android/app/src/main/jni/native.h +++ b/src/android/app/src/main/jni/native.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/android/app/src/main/jni/native_input.cpp b/src/android/app/src/main/jni/native_input.cpp index d7f9d22ff2..5f83c3fe1b 100644 --- a/src/android/app/src/main/jni/native_input.cpp +++ b/src/android/app/src/main/jni/native_input.cpp @@ -1,4 +1,5 @@ -// SPDX-FileCopyrightText: 2024 suyu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/audio_core/sink/cubeb_sink.cpp b/src/audio_core/sink/cubeb_sink.cpp index 7ff4dc6577..62f7b4b07e 100644 --- a/src/audio_core/sink/cubeb_sink.cpp +++ b/src/audio_core/sink/cubeb_sink.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/audio_core/sink/sink_stream.cpp b/src/audio_core/sink/sink_stream.cpp index c83e451f79..8a03fdbbc3 100644 --- a/src/audio_core/sink/sink_stream.cpp +++ b/src/audio_core/sink/sink_stream.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index f8d431a770..e97a415189 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -1,4 +1,5 @@ -# SPDX-FileCopyrightText: 2018 yuzu Emulator Project & 2024 suyu Emulator Project +# SPDX-FileCopyrightText: 2018 yuzu Emulator Project +# SPDX-FileCopyrightText: 2024 suyu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later if (DEFINED ENV{AZURECIREPO}) diff --git a/src/common/android/applets/software_keyboard.cpp b/src/common/android/applets/software_keyboard.cpp index 68376cf5a2..2f0c58227a 100644 --- a/src/common/android/applets/software_keyboard.cpp +++ b/src/common/android/applets/software_keyboard.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/common/android/id_cache.cpp b/src/common/android/id_cache.cpp index e6462d357c..40faea9fa0 100644 --- a/src/common/android/id_cache.cpp +++ b/src/common/android/id_cache.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/common/android/id_cache.h b/src/common/android/id_cache.h index 950ce84e30..95e3e4e2ac 100644 --- a/src/common/android/id_cache.h +++ b/src/common/android/id_cache.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once diff --git a/src/common/assert.h b/src/common/assert.h index 9899c2cf2c..74c0158e9f 100644 --- a/src/common/assert.h +++ b/src/common/assert.h @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2013 Dolphin Emulator Project -// SPDX-FileCopyrightText: 2014 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/common/common_funcs.h b/src/common/common_funcs.h index 4eb8a12382..1523b48ac7 100644 --- a/src/common/common_funcs.h +++ b/src/common/common_funcs.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/common/fs/fs_paths.h b/src/common/fs/fs_paths.h index 6d30d16435..3720976efe 100644 --- a/src/common/fs/fs_paths.h +++ b/src/common/fs/fs_paths.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/common/fs/path_util.cpp b/src/common/fs/path_util.cpp index f92cbe0f7b..e23f53fb9d 100644 --- a/src/common/fs/path_util.cpp +++ b/src/common/fs/path_util.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/common/fs/path_util.h b/src/common/fs/path_util.h index 1fcb7d3778..2076fbcd43 100644 --- a/src/common/fs/path_util.h +++ b/src/common/fs/path_util.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/common/intrusive_list.h b/src/common/intrusive_list.h index 0867849a23..301af0533e 100644 --- a/src/common/intrusive_list.h +++ b/src/common/intrusive_list.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/common/intrusive_red_black_tree.h b/src/common/intrusive_red_black_tree.h index 6809acb47d..b0ae455b64 100644 --- a/src/common/intrusive_red_black_tree.h +++ b/src/common/intrusive_red_black_tree.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp index d2bb208467..fd16197749 100644 --- a/src/common/logging/backend.cpp +++ b/src/common/logging/backend.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2014 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/common/logging/types.h b/src/common/logging/types.h index 6b2e64d957..03544387d1 100644 --- a/src/common/logging/types.h +++ b/src/common/logging/types.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/common/nvidia_flags.cpp b/src/common/nvidia_flags.cpp index 579d2b9407..a788290274 100644 --- a/src/common/nvidia_flags.cpp +++ b/src/common/nvidia_flags.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/common/scope_exit.h b/src/common/scope_exit.h index 3d6bef8f57..f281d7716b 100644 --- a/src/common/scope_exit.h +++ b/src/common/scope_exit.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2014 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/common/settings.cpp b/src/common/settings.cpp index 5eca4dfa74..948c557674 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/common/settings.h b/src/common/settings.h index f3195af564..48f127bde8 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later // Modified by palfaiate on <2024/03/07> diff --git a/src/common/uuid.h b/src/common/uuid.h index 32bdedc3f0..249fe90c84 100644 --- a/src/common/uuid.h +++ b/src/common/uuid.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/common/x64/cpu_detect.cpp b/src/common/x64/cpu_detect.cpp index d2facf6335..534256ecb2 100644 --- a/src/common/x64/cpu_detect.cpp +++ b/src/common/x64/cpu_detect.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2013 Dolphin Emulator Project / 2015 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h index 741113bf8e..86d13ce9da 100644 --- a/src/core/arm/arm_interface.h +++ b/src/core/arm/arm_interface.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2014 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/arm/nce/arm_nce.cpp b/src/core/arm/nce/arm_nce.cpp index d3dd0899f4..d48d82c439 100644 --- a/src/core/arm/nce/arm_nce.cpp +++ b/src/core/arm/nce/arm_nce.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/arm/nce/patcher.cpp b/src/core/arm/nce/patcher.cpp index 8996f07463..4ff018c2b0 100644 --- a/src/core/arm/nce/patcher.cpp +++ b/src/core/arm/nce/patcher.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/arm64/native_clock.h" diff --git a/src/core/crypto/key_manager.cpp b/src/core/crypto/key_manager.cpp index e9896c7b6f..735a632f41 100644 --- a/src/core/crypto/key_manager.cpp +++ b/src/core/crypto/key_manager.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/device_memory_manager.inc b/src/core/device_memory_manager.inc index 7987cffe6a..47ff4ec5c7 100644 --- a/src/core/device_memory_manager.inc +++ b/src/core/device_memory_manager.inc @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/file_sys/bis_factory.cpp b/src/core/file_sys/bis_factory.cpp index a893fad8a3..9ec4e8e947 100644 --- a/src/core/file_sys/bis_factory.cpp +++ b/src/core/file_sys/bis_factory.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/file_sys/fs_path.h b/src/core/file_sys/fs_path.h index a4004c2161..e3282968e2 100644 --- a/src/core/file_sys/fs_path.h +++ b/src/core/file_sys/fs_path.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/file_sys/fssystem/fssystem_aes_ctr_counter_extended_storage.h b/src/core/file_sys/fssystem/fssystem_aes_ctr_counter_extended_storage.h index 0f53e3f669..3de634e6b7 100644 --- a/src/core/file_sys/fssystem/fssystem_aes_ctr_counter_extended_storage.h +++ b/src/core/file_sys/fssystem/fssystem_aes_ctr_counter_extended_storage.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/file_sys/fssystem/fssystem_aes_ctr_storage.h b/src/core/file_sys/fssystem/fssystem_aes_ctr_storage.h index 7838f982c6..b96986760e 100644 --- a/src/core/file_sys/fssystem/fssystem_aes_ctr_storage.h +++ b/src/core/file_sys/fssystem/fssystem_aes_ctr_storage.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/file_sys/fssystem/fssystem_aes_xts_storage.h b/src/core/file_sys/fssystem/fssystem_aes_xts_storage.h index c03f5d8b43..59a8560051 100644 --- a/src/core/file_sys/fssystem/fssystem_aes_xts_storage.h +++ b/src/core/file_sys/fssystem/fssystem_aes_xts_storage.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/file_sys/fssystem/fssystem_alignment_matching_storage.h b/src/core/file_sys/fssystem/fssystem_alignment_matching_storage.h index f5faee0ca1..8ad2c256b6 100644 --- a/src/core/file_sys/fssystem/fssystem_alignment_matching_storage.h +++ b/src/core/file_sys/fssystem/fssystem_alignment_matching_storage.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/file_sys/fssystem/fssystem_bucket_tree.h b/src/core/file_sys/fssystem/fssystem_bucket_tree.h index 89996f64b4..c674ba9029 100644 --- a/src/core/file_sys/fssystem/fssystem_bucket_tree.h +++ b/src/core/file_sys/fssystem/fssystem_bucket_tree.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/file_sys/fssystem/fssystem_compressed_storage.h b/src/core/file_sys/fssystem/fssystem_compressed_storage.h index 93a4b94972..6038994be6 100644 --- a/src/core/file_sys/fssystem/fssystem_compressed_storage.h +++ b/src/core/file_sys/fssystem/fssystem_compressed_storage.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/file_sys/fssystem/fssystem_hierarchical_integrity_verification_storage.h b/src/core/file_sys/fssystem/fssystem_hierarchical_integrity_verification_storage.h index 4ce5603706..a3460e958e 100644 --- a/src/core/file_sys/fssystem/fssystem_hierarchical_integrity_verification_storage.h +++ b/src/core/file_sys/fssystem/fssystem_hierarchical_integrity_verification_storage.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/file_sys/fssystem/fssystem_hierarchical_sha256_storage.h b/src/core/file_sys/fssystem/fssystem_hierarchical_sha256_storage.h index 31b26f164e..62489101b1 100644 --- a/src/core/file_sys/fssystem/fssystem_hierarchical_sha256_storage.h +++ b/src/core/file_sys/fssystem/fssystem_hierarchical_sha256_storage.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/file_sys/fssystem/fssystem_indirect_storage.h b/src/core/file_sys/fssystem/fssystem_indirect_storage.h index 7b1a6bd54e..5e24061fba 100644 --- a/src/core/file_sys/fssystem/fssystem_indirect_storage.h +++ b/src/core/file_sys/fssystem/fssystem_indirect_storage.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/file_sys/fssystem/fssystem_integrity_verification_storage.h b/src/core/file_sys/fssystem/fssystem_integrity_verification_storage.h index 9328901bc5..5fcb2afd80 100644 --- a/src/core/file_sys/fssystem/fssystem_integrity_verification_storage.h +++ b/src/core/file_sys/fssystem/fssystem_integrity_verification_storage.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/file_sys/fssystem/fssystem_memory_resource_buffer_hold_storage.h b/src/core/file_sys/fssystem/fssystem_memory_resource_buffer_hold_storage.h index 9f1e4cc1e8..c25115afb3 100644 --- a/src/core/file_sys/fssystem/fssystem_memory_resource_buffer_hold_storage.h +++ b/src/core/file_sys/fssystem/fssystem_memory_resource_buffer_hold_storage.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/file_sys/fssystem/fssystem_nca_file_system_driver.cpp b/src/core/file_sys/fssystem/fssystem_nca_file_system_driver.cpp index a2b9d27de5..ff92469458 100644 --- a/src/core/file_sys/fssystem/fssystem_nca_file_system_driver.cpp +++ b/src/core/file_sys/fssystem/fssystem_nca_file_system_driver.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "core/file_sys/fssystem/fssystem_aes_ctr_counter_extended_storage.h" diff --git a/src/core/file_sys/fssystem/fssystem_nca_file_system_driver.h b/src/core/file_sys/fssystem/fssystem_nca_file_system_driver.h index 34a04bffe1..f6618350a1 100644 --- a/src/core/file_sys/fssystem/fssystem_nca_file_system_driver.h +++ b/src/core/file_sys/fssystem/fssystem_nca_file_system_driver.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/file_sys/fssystem/fssystem_pooled_buffer.h b/src/core/file_sys/fssystem/fssystem_pooled_buffer.h index 2a084ec45f..5d95fdc3fd 100644 --- a/src/core/file_sys/fssystem/fssystem_pooled_buffer.h +++ b/src/core/file_sys/fssystem/fssystem_pooled_buffer.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/file_sys/fssystem/fssystem_sparse_storage.h b/src/core/file_sys/fssystem/fssystem_sparse_storage.h index d0761cd385..df37d11b5c 100644 --- a/src/core/file_sys/fssystem/fssystem_sparse_storage.h +++ b/src/core/file_sys/fssystem/fssystem_sparse_storage.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/file_sys/fssystem/fssystem_switch_storage.h b/src/core/file_sys/fssystem/fssystem_switch_storage.h index 9de6fbe936..aa4d0d1d31 100644 --- a/src/core/file_sys/fssystem/fssystem_switch_storage.h +++ b/src/core/file_sys/fssystem/fssystem_switch_storage.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/file_sys/registered_cache.cpp b/src/core/file_sys/registered_cache.cpp index 6bb2d304e1..c208be83f2 100644 --- a/src/core/file_sys/registered_cache.cpp +++ b/src/core/file_sys/registered_cache.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/file_sys/registered_cache.h b/src/core/file_sys/registered_cache.h index b60595ad98..41a3fc07c9 100644 --- a/src/core/file_sys/registered_cache.h +++ b/src/core/file_sys/registered_cache.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/file_sys/vfs/vfs.h b/src/core/file_sys/vfs/vfs.h index ec04cd8069..95a690186d 100644 --- a/src/core/file_sys/vfs/vfs.h +++ b/src/core/file_sys/vfs/vfs.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/frontend/applets/software_keyboard.cpp b/src/core/frontend/applets/software_keyboard.cpp index b262579b87..e977923124 100644 --- a/src/core/frontend/applets/software_keyboard.cpp +++ b/src/core/frontend/applets/software_keyboard.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/hle/api_version.h b/src/core/hle/api_version.h index 62745a8f2d..80d6cea09f 100644 --- a/src/core/hle/api_version.h +++ b/src/core/hle/api_version.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/hle/kernel/k_auto_object.h b/src/core/hle/kernel/k_auto_object.h index 3ec056119b..7b6f891a3b 100644 --- a/src/core/hle/kernel/k_auto_object.h +++ b/src/core/hle/kernel/k_auto_object.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/hle/kernel/k_auto_object_container.h b/src/core/hle/kernel/k_auto_object_container.h index bee5a5f304..604cd58131 100644 --- a/src/core/hle/kernel/k_auto_object_container.h +++ b/src/core/hle/kernel/k_auto_object_container.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/hle/kernel/k_dynamic_resource_manager.h b/src/core/hle/kernel/k_dynamic_resource_manager.h index 55347979b2..eeb3c13008 100644 --- a/src/core/hle/kernel/k_dynamic_resource_manager.h +++ b/src/core/hle/kernel/k_dynamic_resource_manager.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/hle/kernel/k_dynamic_slab_heap.h b/src/core/hle/kernel/k_dynamic_slab_heap.h index 4f3de7046d..d0df6f0bd5 100644 --- a/src/core/hle/kernel/k_dynamic_slab_heap.h +++ b/src/core/hle/kernel/k_dynamic_slab_heap.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/hle/kernel/k_handle_table.h b/src/core/hle/kernel/k_handle_table.h index 91d5b71009..0821201484 100644 --- a/src/core/hle/kernel/k_handle_table.h +++ b/src/core/hle/kernel/k_handle_table.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/hle/kernel/k_memory_region.h b/src/core/hle/kernel/k_memory_region.h index 44c7343156..3716b9e710 100644 --- a/src/core/hle/kernel/k_memory_region.h +++ b/src/core/hle/kernel/k_memory_region.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/hle/kernel/k_page_table_base.cpp b/src/core/hle/kernel/k_page_table_base.cpp index 25af39c856..7714717f74 100644 --- a/src/core/hle/kernel/k_page_table_base.cpp +++ b/src/core/hle/kernel/k_page_table_base.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/scope_exit.h" diff --git a/src/core/hle/kernel/k_page_table_base.h b/src/core/hle/kernel/k_page_table_base.h index 819502d0a0..37c745d14a 100644 --- a/src/core/hle/kernel/k_page_table_base.h +++ b/src/core/hle/kernel/k_page_table_base.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/hle/kernel/k_scheduler.h b/src/core/hle/kernel/k_scheduler.h index 20347124f8..96bc2788c9 100644 --- a/src/core/hle/kernel/k_scheduler.h +++ b/src/core/hle/kernel/k_scheduler.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/hle/kernel/k_slab_heap.h b/src/core/hle/kernel/k_slab_heap.h index e1b82597f5..f3bea4ea1e 100644 --- a/src/core/hle/kernel/k_slab_heap.h +++ b/src/core/hle/kernel/k_slab_heap.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/hle/kernel/k_spin_lock.h b/src/core/hle/kernel/k_spin_lock.h index fde6e250d0..a8c81e6cd2 100644 --- a/src/core/hle/kernel/k_spin_lock.h +++ b/src/core/hle/kernel/k_spin_lock.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/hle/kernel/physical_core.h b/src/core/hle/kernel/physical_core.h index d3bb4765a1..9159ba5306 100644 --- a/src/core/hle/kernel/physical_core.h +++ b/src/core/hle/kernel/physical_core.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/hle/result.h b/src/core/hle/result.h index 9a7c10efae..b3e1978906 100644 --- a/src/core/hle/result.h +++ b/src/core/hle/result.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2014 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp index 099fdbc368..888b34336b 100644 --- a/src/core/hle/service/acc/acc.cpp +++ b/src/core/hle/service/acc/acc.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/hle/service/acc/profile_manager.cpp b/src/core/hle/service/acc/profile_manager.cpp index d84bf33c38..e58066a51b 100644 --- a/src/core/hle/service/acc/profile_manager.cpp +++ b/src/core/hle/service/acc/profile_manager.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/hle/service/am/frontend/applet_web_browser.cpp b/src/core/hle/service/am/frontend/applet_web_browser.cpp index d1b65029ac..3754bc5c55 100644 --- a/src/core/hle/service/am/frontend/applet_web_browser.cpp +++ b/src/core/hle/service/am/frontend/applet_web_browser.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/assert.h" diff --git a/src/core/hle/service/caps/caps_manager.cpp b/src/core/hle/service/caps/caps_manager.cpp index 093447ff6a..2c414b881c 100644 --- a/src/core/hle/service/caps/caps_manager.cpp +++ b/src/core/hle/service/caps/caps_manager.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/hle/service/filesystem/filesystem.cpp b/src/core/hle/service/filesystem/filesystem.cpp index 99435a1d9c..9dcfebd977 100644 --- a/src/core/hle/service/filesystem/filesystem.cpp +++ b/src/core/hle/service/filesystem/filesystem.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/hle/service/jit/jit_code_memory.h b/src/core/hle/service/jit/jit_code_memory.h index c7e961deb7..87c9021f57 100644 --- a/src/core/hle/service/jit/jit_code_memory.h +++ b/src/core/hle/service/jit/jit_code_memory.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/hle/service/ldn/lan_discovery.h b/src/core/hle/service/ldn/lan_discovery.h index 0a376ce4f9..30524d9180 100644 --- a/src/core/hle/service/ldn/lan_discovery.h +++ b/src/core/hle/service/ldn/lan_discovery.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/hle/service/mii/mii_database_manager.cpp b/src/core/hle/service/mii/mii_database_manager.cpp index ffaa886f8b..a1d69cb619 100644 --- a/src/core/hle/service/mii/mii_database_manager.cpp +++ b/src/core/hle/service/mii/mii_database_manager.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/assert.h" diff --git a/src/core/hle/service/nfc/common/amiibo_crypto.cpp b/src/core/hle/service/nfc/common/amiibo_crypto.cpp index c627a06b49..b84c3eceb5 100644 --- a/src/core/hle/service/nfc/common/amiibo_crypto.cpp +++ b/src/core/hle/service/nfc/common/amiibo_crypto.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2017 socram8888/amiitool diff --git a/src/core/hle/service/nfc/common/device.cpp b/src/core/hle/service/nfc/common/device.cpp index b646e82c61..bf29bb354e 100644 --- a/src/core/hle/service/nfc/common/device.cpp +++ b/src/core/hle/service/nfc/common/device.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "core/hle/service/glue/time/static.h" diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp index 2202e3d899..c9997c745e 100644 --- a/src/core/hle/service/nifm/nifm.cpp +++ b/src/core/hle/service/nifm/nifm.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "core/core.h" diff --git a/src/core/hle/service/nvdrv/core/nvmap.cpp b/src/core/hle/service/nvdrv/core/nvmap.cpp index 08ff1a21ce..72d0087cd5 100644 --- a/src/core/hle/service/nvdrv/core/nvmap.cpp +++ b/src/core/hle/service/nvdrv/core/nvmap.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2022 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2022 yuzu Emulator Project // SPDX-FileCopyrightText: 2022 Skyline Team and Contributors // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp index f3e97bd75b..ef6c78f1c3 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2021 yuzu Emulator Project // SPDX-FileCopyrightText: 2021 Skyline Team and Contributors // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h index 8ac14b29f1..c11bd7e9b7 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2021 yuzu Emulator Project // SPDX-FileCopyrightText: 2021 Skyline Team and Contributors // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvdrv/devices/nvmap.cpp b/src/core/hle/service/nvdrv/devices/nvmap.cpp index b0b115a1b9..70897fdaaf 100644 --- a/src/core/hle/service/nvdrv/devices/nvmap.cpp +++ b/src/core/hle/service/nvdrv/devices/nvmap.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/hle/service/ro/ro.cpp b/src/core/hle/service/ro/ro.cpp index 68f8a34588..5c04297b69 100644 --- a/src/core/hle/service/ro/ro.cpp +++ b/src/core/hle/service/ro/ro.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/hle/service/set/system_settings_server.cpp b/src/core/hle/service/set/system_settings_server.cpp index 254fdd2e96..6dd432ba99 100644 --- a/src/core/hle/service/set/system_settings_server.cpp +++ b/src/core/hle/service/set/system_settings_server.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/hle/service/ssl/ssl_backend_schannel.cpp b/src/core/hle/service/ssl/ssl_backend_schannel.cpp index c4085b02af..7c58399495 100644 --- a/src/core/hle/service/ssl/ssl_backend_schannel.cpp +++ b/src/core/hle/service/ssl/ssl_backend_schannel.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/hle/service/ssl/ssl_backend_securetransport.cpp b/src/core/hle/service/ssl/ssl_backend_securetransport.cpp index dc25304062..dd23c4f6cf 100644 --- a/src/core/hle/service/ssl/ssl_backend_securetransport.cpp +++ b/src/core/hle/service/ssl/ssl_backend_securetransport.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/hle/service/vi/shared_buffer_manager.cpp b/src/core/hle/service/vi/shared_buffer_manager.cpp index 8c1acc7b97..0cd185b709 100644 --- a/src/core/hle/service/vi/shared_buffer_manager.cpp +++ b/src/core/hle/service/vi/shared_buffer_manager.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/internal_network/network.cpp b/src/core/internal_network/network.cpp index ef2392132f..4413866f81 100644 --- a/src/core/internal_network/network.cpp +++ b/src/core/internal_network/network.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/internal_network/network.h b/src/core/internal_network/network.h index ff636a4812..9cafe89713 100644 --- a/src/core/internal_network/network.h +++ b/src/core/internal_network/network.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/internal_network/socket_proxy.cpp b/src/core/internal_network/socket_proxy.cpp index dbeb754e87..a868a3febe 100644 --- a/src/core/internal_network/socket_proxy.cpp +++ b/src/core/internal_network/socket_proxy.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/internal_network/sockets.h b/src/core/internal_network/sockets.h index 7f026c6054..17e2645ac3 100644 --- a/src/core/internal_network/sockets.h +++ b/src/core/internal_network/sockets.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/loader/kip.cpp b/src/core/loader/kip.cpp index 2aa2adda3d..1a435b2a23 100644 --- a/src/core/loader/kip.cpp +++ b/src/core/loader/kip.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/loader/loader.h b/src/core/loader/loader.h index 3460a5bf9d..d597d101a1 100644 --- a/src/core/loader/loader.h +++ b/src/core/loader/loader.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp index 04f6bb613e..ed5c303a04 100644 --- a/src/core/loader/nro.cpp +++ b/src/core/loader/nro.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index e2d97ad1b4..bc11a1fab2 100644 --- a/src/core/loader/nso.cpp +++ b/src/core/loader/nso.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/memory.cpp b/src/core/memory.cpp index e50543fcf5..f7eae9c598 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2015 Citra Emulator Project -// SPDX-FileCopyrightText: 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/memory.h b/src/core/memory.h index 5de20d37fa..24710d27ea 100644 --- a/src/core/memory.h +++ b/src/core/memory.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2014 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/core/perf_stats.cpp b/src/core/perf_stats.cpp index 980efec1d4..1f5822bb61 100644 --- a/src/core/perf_stats.cpp +++ b/src/core/perf_stats.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2017 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/core/reporter.cpp b/src/core/reporter.cpp index d89967e2e6..b9da5ea68e 100644 --- a/src/core/reporter.cpp +++ b/src/core/reporter.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/dedicated_room/CMakeLists.txt b/src/dedicated_room/CMakeLists.txt index c535212425..25cc9cca95 100644 --- a/src/dedicated_room/CMakeLists.txt +++ b/src/dedicated_room/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2017 Citra Emulator Project & 2024 suyu Emulator Project +# SPDX-FileCopyrightText: 2017 Citra Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later add_executable(suyu-room diff --git a/src/dedicated_room/suyu_room.cpp b/src/dedicated_room/suyu_room.cpp index cd21e4d22b..b80ee912eb 100644 --- a/src/dedicated_room/suyu_room.cpp +++ b/src/dedicated_room/suyu_room.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/dedicated_room/suyu_room.rc b/src/dedicated_room/suyu_room.rc index 214792df92..6a2b842a33 100644 --- a/src/dedicated_room/suyu_room.rc +++ b/src/dedicated_room/suyu_room.rc @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2017 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "winresrc.h" diff --git a/src/frontend_common/config.cpp b/src/frontend_common/config.cpp index 9fe408e5e3..ccbab0291a 100644 --- a/src/frontend_common/config.cpp +++ b/src/frontend_common/config.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/hid_core/frontend/emulated_console.h b/src/hid_core/frontend/emulated_console.h index 5ea2093949..9f31926ddf 100644 --- a/src/hid_core/frontend/emulated_console.h +++ b/src/hid_core/frontend/emulated_console.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/hid_core/frontend/emulated_controller.h b/src/hid_core/frontend/emulated_controller.h index fbe83dd48e..b7263a93e3 100644 --- a/src/hid_core/frontend/emulated_controller.h +++ b/src/hid_core/frontend/emulated_controller.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/hid_core/frontend/emulated_devices.h b/src/hid_core/frontend/emulated_devices.h index 8ec58c1603..648eb64f6b 100644 --- a/src/hid_core/frontend/emulated_devices.h +++ b/src/hid_core/frontend/emulated_devices.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/hid_core/hid_core.h b/src/hid_core/hid_core.h index aa9ff5d7a0..e11c8bcfce 100644 --- a/src/hid_core/hid_core.h +++ b/src/hid_core/hid_core.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/input_common/drivers/android.cpp b/src/input_common/drivers/android.cpp index bd80e605ba..1edc0e01c3 100644 --- a/src/input_common/drivers/android.cpp +++ b/src/input_common/drivers/android.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include diff --git a/src/input_common/drivers/tas_input.cpp b/src/input_common/drivers/tas_input.cpp index 93e17de27a..58a5484b46 100644 --- a/src/input_common/drivers/tas_input.cpp +++ b/src/input_common/drivers/tas_input.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/network/room.cpp b/src/network/room.cpp index 4618e23a68..7e65d43075 100644 --- a/src/network/room.cpp +++ b/src/network/room.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/network/room.h b/src/network/room.h index 26a105b154..92dc1ff81c 100644 --- a/src/network/room.h +++ b/src/network/room.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/network/verify_user.h b/src/network/verify_user.h index 9d10e7169b..524c1f8d0e 100644 --- a/src/network/verify_user.h +++ b/src/network/verify_user.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/suyu/CMakeLists.txt b/src/suyu/CMakeLists.txt index 1c7354f545..a951a555aa 100644 --- a/src/suyu/CMakeLists.txt +++ b/src/suyu/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2018 yuzu Emulator Project & 2024 Suyu Emulator Project +# SPDX-FileCopyrightText: 2018 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later set(CMAKE_AUTOMOC ON) diff --git a/src/suyu/about_dialog.cpp b/src/suyu/about_dialog.cpp index 96d4cf95be..40c99f91b7 100644 --- a/src/suyu/about_dialog.cpp +++ b/src/suyu/about_dialog.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/about_dialog.h b/src/suyu/about_dialog.h index ac64247507..3c4e71ee6c 100644 --- a/src/suyu/about_dialog.h +++ b/src/suyu/about_dialog.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/suyu/applets/qt_amiibo_settings.cpp b/src/suyu/applets/qt_amiibo_settings.cpp index bb0e8aff56..137f671f6f 100644 --- a/src/suyu/applets/qt_amiibo_settings.cpp +++ b/src/suyu/applets/qt_amiibo_settings.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/applets/qt_amiibo_settings.h b/src/suyu/applets/qt_amiibo_settings.h index ee27b88afb..3833cf6f2a 100644 --- a/src/suyu/applets/qt_amiibo_settings.h +++ b/src/suyu/applets/qt_amiibo_settings.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/suyu/applets/qt_controller.cpp b/src/suyu/applets/qt_controller.cpp index b93b11fc9c..f27ab835e5 100644 --- a/src/suyu/applets/qt_controller.cpp +++ b/src/suyu/applets/qt_controller.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/applets/qt_controller.h b/src/suyu/applets/qt_controller.h index ef7d0190df..e5372495d7 100644 --- a/src/suyu/applets/qt_controller.h +++ b/src/suyu/applets/qt_controller.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/suyu/applets/qt_error.cpp b/src/suyu/applets/qt_error.cpp index 3316593436..7753a97f73 100644 --- a/src/suyu/applets/qt_error.cpp +++ b/src/suyu/applets/qt_error.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/applets/qt_error.h b/src/suyu/applets/qt_error.h index 56c23a0ea1..957f170ade 100644 --- a/src/suyu/applets/qt_error.h +++ b/src/suyu/applets/qt_error.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/suyu/applets/qt_profile_select.cpp b/src/suyu/applets/qt_profile_select.cpp index ac8d8f438a..af7d7e3940 100644 --- a/src/suyu/applets/qt_profile_select.cpp +++ b/src/suyu/applets/qt_profile_select.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/applets/qt_profile_select.h b/src/suyu/applets/qt_profile_select.h index 8ddc3bd53e..607f1777cd 100644 --- a/src/suyu/applets/qt_profile_select.h +++ b/src/suyu/applets/qt_profile_select.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/suyu/applets/qt_software_keyboard.cpp b/src/suyu/applets/qt_software_keyboard.cpp index 3626aade49..a1bcfa717e 100644 --- a/src/suyu/applets/qt_software_keyboard.cpp +++ b/src/suyu/applets/qt_software_keyboard.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/applets/qt_software_keyboard.h b/src/suyu/applets/qt_software_keyboard.h index adf9f55690..7e2fdf09ea 100644 --- a/src/suyu/applets/qt_software_keyboard.h +++ b/src/suyu/applets/qt_software_keyboard.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/suyu/applets/qt_web_browser.cpp b/src/suyu/applets/qt_web_browser.cpp index a7d7a5ce65..6419dbd7c3 100644 --- a/src/suyu/applets/qt_web_browser.cpp +++ b/src/suyu/applets/qt_web_browser.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #ifdef SUYU_USE_QT_WEB_ENGINE diff --git a/src/suyu/applets/qt_web_browser.h b/src/suyu/applets/qt_web_browser.h index 5e92825338..07e69fbbf4 100644 --- a/src/suyu/applets/qt_web_browser.h +++ b/src/suyu/applets/qt_web_browser.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/suyu/applets/qt_web_browser_scripts.h b/src/suyu/applets/qt_web_browser_scripts.h index f428d535e3..10e5ac4fa0 100644 --- a/src/suyu/applets/qt_web_browser_scripts.h +++ b/src/suyu/applets/qt_web_browser_scripts.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/suyu/bootmanager.cpp b/src/suyu/bootmanager.cpp index 3c536e3072..606325bf5e 100644 --- a/src/suyu/bootmanager.cpp +++ b/src/suyu/bootmanager.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2014 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/bootmanager.h b/src/suyu/bootmanager.h index df09cae04e..36eb956ec7 100644 --- a/src/suyu/bootmanager.h +++ b/src/suyu/bootmanager.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2014 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/suyu/breakpad.cpp b/src/suyu/breakpad.cpp index 7895a84e0f..d4a9d7d9a3 100644 --- a/src/suyu/breakpad.cpp +++ b/src/suyu/breakpad.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/configuration/configure_camera.cpp b/src/suyu/configuration/configure_camera.cpp index cb23fd78b2..5edc3902f0 100644 --- a/src/suyu/configuration/configure_camera.cpp +++ b/src/suyu/configuration/configure_camera.cpp @@ -1,4 +1,4 @@ -// Text : Copyright 2022 yuzu Emulator Project & 2024 suyu Emulator Project +// Text : Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include diff --git a/src/suyu/configuration/configure_camera.h b/src/suyu/configuration/configure_camera.h index 1df3738acb..359cf69373 100644 --- a/src/suyu/configuration/configure_camera.h +++ b/src/suyu/configuration/configure_camera.h @@ -1,4 +1,4 @@ -// Text : Copyright 2022 yuzu Emulator Project & 2024 suyu Emulator Project +// Text : Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once diff --git a/src/suyu/configuration/configure_debug.cpp b/src/suyu/configuration/configure_debug.cpp index e1ad00113f..b4fa4eca09 100644 --- a/src/suyu/configuration/configure_debug.cpp +++ b/src/suyu/configuration/configure_debug.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2016 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/configuration/configure_filesystem.cpp b/src/suyu/configuration/configure_filesystem.cpp index 0686a4946a..4a6c719f66 100644 --- a/src/suyu/configuration/configure_filesystem.cpp +++ b/src/suyu/configuration/configure_filesystem.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/configuration/configure_input_advanced.cpp b/src/suyu/configuration/configure_input_advanced.cpp index dd4ed0e03c..aea57e8c15 100644 --- a/src/suyu/configuration/configure_input_advanced.cpp +++ b/src/suyu/configuration/configure_input_advanced.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/configuration/configure_per_game_addons.cpp b/src/suyu/configuration/configure_per_game_addons.cpp index 4da1ea1a09..8c96995641 100644 --- a/src/suyu/configuration/configure_per_game_addons.cpp +++ b/src/suyu/configuration/configure_per_game_addons.cpp @@ -1,4 +1,5 @@ // SPDX-FileCopyrightText: 2016 Citra Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/suyu/configuration/configure_profile_manager.cpp b/src/suyu/configuration/configure_profile_manager.cpp index 16b5fe4285..c0f98e5240 100644 --- a/src/suyu/configuration/configure_profile_manager.cpp +++ b/src/suyu/configuration/configure_profile_manager.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2016 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/configuration/configure_tas.cpp b/src/suyu/configuration/configure_tas.cpp index 5f967b88cc..0a7fd9049a 100644 --- a/src/suyu/configuration/configure_tas.cpp +++ b/src/suyu/configuration/configure_tas.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/configuration/configure_ui.cpp b/src/suyu/configuration/configure_ui.cpp index 408a7372a7..a3648c5b1c 100644 --- a/src/suyu/configuration/configure_ui.cpp +++ b/src/suyu/configuration/configure_ui.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2016 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "suyu/configuration/configure_ui.h" diff --git a/src/suyu/configuration/configure_web.cpp b/src/suyu/configuration/configure_web.cpp index 7c88cc2586..7beca1563a 100644 --- a/src/suyu/configuration/configure_web.cpp +++ b/src/suyu/configuration/configure_web.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2017 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/configuration/input_profiles.cpp b/src/suyu/configuration/input_profiles.cpp index 9886f1348c..a2ca806899 100644 --- a/src/suyu/configuration/input_profiles.cpp +++ b/src/suyu/configuration/input_profiles.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/discord_impl.cpp b/src/suyu/discord_impl.cpp index f6db7dcae0..f5a6448d82 100644 --- a/src/suyu/discord_impl.cpp +++ b/src/suyu/discord_impl.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2018 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2018 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/game_list.cpp b/src/suyu/game_list.cpp index b12cdb7bf9..bda0d489bf 100644 --- a/src/suyu/game_list.cpp +++ b/src/suyu/game_list.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2015 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2015 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later // Modified by palfaiate on <2024/03/07> diff --git a/src/suyu/game_list.h b/src/suyu/game_list.h index 45a50fe2f3..7568e1b6e0 100644 --- a/src/suyu/game_list.h +++ b/src/suyu/game_list.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2015 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2015 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later // Modified by palfaiate on <2024/03/07> diff --git a/src/suyu/game_list_worker.cpp b/src/suyu/game_list_worker.cpp index cc88788db9..ecc2773064 100644 --- a/src/suyu/game_list_worker.cpp +++ b/src/suyu/game_list_worker.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/loading_screen.cpp b/src/suyu/loading_screen.cpp index 64f3264bec..2a83b9a867 100644 --- a/src/suyu/loading_screen.cpp +++ b/src/suyu/loading_screen.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/loading_screen.h b/src/suyu/loading_screen.h index ef12b59c39..dfaa191567 100644 --- a/src/suyu/loading_screen.h +++ b/src/suyu/loading_screen.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index 19148fcfc3..fc0028b45d 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2014 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later // Modified by palfaiate on <2024/03/07> diff --git a/src/suyu/main.h b/src/suyu/main.h index 7fa28477a7..e20950e238 100644 --- a/src/suyu/main.h +++ b/src/suyu/main.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2014 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later // Modified by palfaiate on <2024/03/07> diff --git a/src/suyu/multiplayer/direct_connect.cpp b/src/suyu/multiplayer/direct_connect.cpp index 5d5cb7aabc..b8b3eadf83 100644 --- a/src/suyu/multiplayer/direct_connect.cpp +++ b/src/suyu/multiplayer/direct_connect.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/multiplayer/host_room.cpp b/src/suyu/multiplayer/host_room.cpp index 6c71454c8e..f4a61d9624 100644 --- a/src/suyu/multiplayer/host_room.cpp +++ b/src/suyu/multiplayer/host_room.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/multiplayer/lobby.cpp b/src/suyu/multiplayer/lobby.cpp index b4c0596632..99e4d9ab30 100644 --- a/src/suyu/multiplayer/lobby.cpp +++ b/src/suyu/multiplayer/lobby.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/play_time_manager.cpp b/src/suyu/play_time_manager.cpp index 2d30e7d418..9a046c69a1 100644 --- a/src/suyu/play_time_manager.cpp +++ b/src/suyu/play_time_manager.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/alignment.h" diff --git a/src/suyu/play_time_manager.h b/src/suyu/play_time_manager.h index 8a45386810..d36319b748 100644 --- a/src/suyu/play_time_manager.h +++ b/src/suyu/play_time_manager.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/suyu/startup_checks.cpp b/src/suyu/startup_checks.cpp index f7308e0677..292fbcbbaa 100644 --- a/src/suyu/startup_checks.cpp +++ b/src/suyu/startup_checks.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "video_core/vulkan_common/vulkan_wrapper.h" diff --git a/src/suyu/startup_checks.h b/src/suyu/startup_checks.h index f0fedc3812..aa097ee483 100644 --- a/src/suyu/startup_checks.h +++ b/src/suyu/startup_checks.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/suyu/suyu.qrc b/src/suyu/suyu.qrc index 5d1f425a46..c0dde1bb1b 100644 --- a/src/suyu/suyu.qrc +++ b/src/suyu/suyu.qrc @@ -1,5 +1,5 @@ diff --git a/src/suyu/suyu.rc b/src/suyu/suyu.rc index 5f5639721f..bf891c8ff3 100644 --- a/src/suyu/suyu.rc +++ b/src/suyu/suyu.rc @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "winresrc.h" diff --git a/src/suyu/uisettings.cpp b/src/suyu/uisettings.cpp index 0bdf944f9a..60d4063c8c 100644 --- a/src/suyu/uisettings.cpp +++ b/src/suyu/uisettings.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2016 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/uisettings.h b/src/suyu/uisettings.h index f1956bddf1..cab889680f 100644 --- a/src/suyu/uisettings.h +++ b/src/suyu/uisettings.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2016 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/suyu/vk_device_info.cpp b/src/suyu/vk_device_info.cpp index fe10c85e92..4cdb74be9f 100644 --- a/src/suyu/vk_device_info.cpp +++ b/src/suyu/vk_device_info.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu/vk_device_info.h b/src/suyu/vk_device_info.h index d3b24d35af..bda8262f4e 100644 --- a/src/suyu/vk_device_info.h +++ b/src/suyu/vk_device_info.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/suyu_cmd/CMakeLists.txt b/src/suyu_cmd/CMakeLists.txt index 31a8b34a51..45cc281218 100644 --- a/src/suyu_cmd/CMakeLists.txt +++ b/src/suyu_cmd/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2018 yuzu Emulator Project & 2024 suyu Emulator Project +# SPDX-FileCopyrightText: 2018 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later # Credits to Samantas5855 and others for this function. diff --git a/src/suyu_cmd/emu_window/emu_window_sdl2.cpp b/src/suyu_cmd/emu_window/emu_window_sdl2.cpp index b9bd2c39f0..840dd83707 100644 --- a/src/suyu_cmd/emu_window/emu_window_sdl2.cpp +++ b/src/suyu_cmd/emu_window/emu_window_sdl2.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2016 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu_cmd/emu_window/emu_window_sdl2.h b/src/suyu_cmd/emu_window/emu_window_sdl2.h index 6cbc2a699e..f8886bbff4 100644 --- a/src/suyu_cmd/emu_window/emu_window_sdl2.h +++ b/src/suyu_cmd/emu_window/emu_window_sdl2.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2016 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/suyu_cmd/emu_window/emu_window_sdl2_gl.cpp b/src/suyu_cmd/emu_window/emu_window_sdl2_gl.cpp index 92380538b5..dce4358708 100644 --- a/src/suyu_cmd/emu_window/emu_window_sdl2_gl.cpp +++ b/src/suyu_cmd/emu_window/emu_window_sdl2_gl.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu_cmd/emu_window/emu_window_sdl2_gl.h b/src/suyu_cmd/emu_window/emu_window_sdl2_gl.h index f306168d1e..d000850273 100644 --- a/src/suyu_cmd/emu_window/emu_window_sdl2_gl.h +++ b/src/suyu_cmd/emu_window/emu_window_sdl2_gl.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/suyu_cmd/emu_window/emu_window_sdl2_null.cpp b/src/suyu_cmd/emu_window/emu_window_sdl2_null.cpp index 1f7924dc46..2224940a80 100644 --- a/src/suyu_cmd/emu_window/emu_window_sdl2_null.cpp +++ b/src/suyu_cmd/emu_window/emu_window_sdl2_null.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu_cmd/emu_window/emu_window_sdl2_null.h b/src/suyu_cmd/emu_window/emu_window_sdl2_null.h index 20eae31075..adacff11c0 100644 --- a/src/suyu_cmd/emu_window/emu_window_sdl2_null.h +++ b/src/suyu_cmd/emu_window/emu_window_sdl2_null.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/suyu_cmd/emu_window/emu_window_sdl2_vk.cpp b/src/suyu_cmd/emu_window/emu_window_sdl2_vk.cpp index 5e6cac5f5e..28def70fef 100644 --- a/src/suyu_cmd/emu_window/emu_window_sdl2_vk.cpp +++ b/src/suyu_cmd/emu_window/emu_window_sdl2_vk.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu_cmd/emu_window/emu_window_sdl2_vk.h b/src/suyu_cmd/emu_window/emu_window_sdl2_vk.h index 6db6cd2916..2aebdcb7d8 100644 --- a/src/suyu_cmd/emu_window/emu_window_sdl2_vk.h +++ b/src/suyu_cmd/emu_window/emu_window_sdl2_vk.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/suyu_cmd/precompiled_headers.h b/src/suyu_cmd/precompiled_headers.h index 79da9caa04..aabae730bf 100644 --- a/src/suyu_cmd/precompiled_headers.h +++ b/src/suyu_cmd/precompiled_headers.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2022 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/suyu_cmd/sdl_config.cpp b/src/suyu_cmd/sdl_config.cpp index 8869f1c2bc..60317dba5a 100644 --- a/src/suyu_cmd/sdl_config.cpp +++ b/src/suyu_cmd/sdl_config.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later // SDL will break our main function in suyu-cmd if we don't define this before adding SDL.h diff --git a/src/suyu_cmd/sdl_config.h b/src/suyu_cmd/sdl_config.h index 4f86e1695b..1fd1c692d5 100644 --- a/src/suyu_cmd/sdl_config.h +++ b/src/suyu_cmd/sdl_config.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/suyu_cmd/suyu.cpp b/src/suyu_cmd/suyu.cpp index f559c74f5b..eb46bb4e39 100644 --- a/src/suyu_cmd/suyu.cpp +++ b/src/suyu_cmd/suyu.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2014 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/suyu_cmd/suyu.rc b/src/suyu_cmd/suyu.rc index 1b3ae064dc..bc0f68da30 100644 --- a/src/suyu_cmd/suyu.rc +++ b/src/suyu_cmd/suyu.rc @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "winresrc.h" diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 36affdf4f0..e5cd0278fa 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2018 yuzu Emulator Project & 2024 suyu Emulator Project +# SPDX-FileCopyrightText: 2018 yuzu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later add_subdirectory(host_shaders) diff --git a/src/video_core/host1x/ffmpeg/ffmpeg.cpp b/src/video_core/host1x/ffmpeg/ffmpeg.cpp index 995673bc5c..5df7811928 100644 --- a/src/video_core/host1x/ffmpeg/ffmpeg.cpp +++ b/src/video_core/host1x/ffmpeg/ffmpeg.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "common/assert.h" diff --git a/src/video_core/host1x/ffmpeg/ffmpeg.h b/src/video_core/host1x/ffmpeg/ffmpeg.h index 50643cf416..3a1f362086 100644 --- a/src/video_core/host1x/ffmpeg/ffmpeg.h +++ b/src/video_core/host1x/ffmpeg/ffmpeg.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/video_core/host_shaders/fidelityfx_fsr.frag b/src/video_core/host_shaders/fidelityfx_fsr.frag index dd65b67594..3e3a53d5b8 100644 --- a/src/video_core/host_shaders/fidelityfx_fsr.frag +++ b/src/video_core/host_shaders/fidelityfx_fsr.frag @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later //!#version 460 core diff --git a/src/video_core/host_shaders/opengl_fidelityfx_fsr.frag b/src/video_core/host_shaders/opengl_fidelityfx_fsr.frag index a4599c43af..da3e5dec31 100644 --- a/src/video_core/host_shaders/opengl_fidelityfx_fsr.frag +++ b/src/video_core/host_shaders/opengl_fidelityfx_fsr.frag @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later //!#version 460 core diff --git a/src/video_core/host_shaders/opengl_present_scaleforce.frag b/src/video_core/host_shaders/opengl_present_scaleforce.frag index d1da725b9b..eace9bf2d7 100644 --- a/src/video_core/host_shaders/opengl_present_scaleforce.frag +++ b/src/video_core/host_shaders/opengl_present_scaleforce.frag @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2020 BreadFish64 & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2020 BreadFish64 // SPDX-License-Identifier: MIT // Adapted from https://github.com/BreadFish64/ScaleFish/tree/master/scaleforce diff --git a/src/video_core/host_shaders/vulkan_fidelityfx_fsr_easu_fp16.frag b/src/video_core/host_shaders/vulkan_fidelityfx_fsr_easu_fp16.frag index e033f4dd27..4a709f7d40 100644 --- a/src/video_core/host_shaders/vulkan_fidelityfx_fsr_easu_fp16.frag +++ b/src/video_core/host_shaders/vulkan_fidelityfx_fsr_easu_fp16.frag @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #version 460 core diff --git a/src/video_core/host_shaders/vulkan_fidelityfx_fsr_rcas_fp16.frag b/src/video_core/host_shaders/vulkan_fidelityfx_fsr_rcas_fp16.frag index 01a17e3bd2..77f0406c95 100644 --- a/src/video_core/host_shaders/vulkan_fidelityfx_fsr_rcas_fp16.frag +++ b/src/video_core/host_shaders/vulkan_fidelityfx_fsr_rcas_fp16.frag @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #version 460 core diff --git a/src/video_core/host_shaders/vulkan_present_scaleforce_fp16.frag b/src/video_core/host_shaders/vulkan_present_scaleforce_fp16.frag index 2e396a8269..5cf0c2205f 100644 --- a/src/video_core/host_shaders/vulkan_present_scaleforce_fp16.frag +++ b/src/video_core/host_shaders/vulkan_present_scaleforce_fp16.frag @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #version 460 diff --git a/src/video_core/macro/macro.cpp b/src/video_core/macro/macro.cpp index 77cecbe779..0e3f667977 100644 --- a/src/video_core/macro/macro.cpp +++ b/src/video_core/macro/macro.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/video_core/query_cache.h b/src/video_core/query_cache.h index 9c44a57755..dd1b1e6e72 100644 --- a/src/video_core/query_cache.h +++ b/src/video_core/query_cache.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/video_core/renderer_base.h b/src/video_core/renderer_base.h index c180bef73e..0eeb689ad8 100644 --- a/src/video_core/renderer_base.h +++ b/src/video_core/renderer_base.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2014 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/video_core/renderer_opengl/gl_device.cpp b/src/video_core/renderer_opengl/gl_device.cpp index 92eff494a6..3cf99d1586 100644 --- a/src/video_core/renderer_opengl/gl_device.cpp +++ b/src/video_core/renderer_opengl/gl_device.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/video_core/renderer_opengl/gl_resource_manager.cpp b/src/video_core/renderer_opengl/gl_resource_manager.cpp index 644305cdf0..2161c1c209 100644 --- a/src/video_core/renderer_opengl/gl_resource_manager.cpp +++ b/src/video_core/renderer_opengl/gl_resource_manager.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2015 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2015 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/video_core/renderer_opengl/gl_resource_manager.h b/src/video_core/renderer_opengl/gl_resource_manager.h index b8831ac00a..ec8f4e1634 100644 --- a/src/video_core/renderer_opengl/gl_resource_manager.h +++ b/src/video_core/renderer_opengl/gl_resource_manager.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2015 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2015 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp index dd48983ea2..50f86c29eb 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.cpp +++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 1cda51946e..46fada689c 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index a8a5353ad4..8909c77af3 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #include diff --git a/src/video_core/shader_cache.cpp b/src/video_core/shader_cache.cpp index b28bb7b3bb..a281f5d541 100644 --- a/src/video_core/shader_cache.cpp +++ b/src/video_core/shader_cache.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/video_core/shader_cache.h b/src/video_core/shader_cache.h index e305df5ca9..31f09e89fa 100644 --- a/src/video_core/shader_cache.h +++ b/src/video_core/shader_cache.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/video_core/shader_environment.cpp b/src/video_core/shader_environment.cpp index 282bb04ae5..3b4b645da0 100644 --- a/src/video_core/shader_environment.cpp +++ b/src/video_core/shader_environment.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/video_core/texture_cache/texture_cache_base.h b/src/video_core/texture_cache/texture_cache_base.h index 3c073ad222..3237ad94c8 100644 --- a/src/video_core/texture_cache/texture_cache_base.h +++ b/src/video_core/texture_cache/texture_cache_base.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once diff --git a/src/video_core/vulkan_common/nsight_aftermath_tracker.cpp b/src/video_core/vulkan_common/nsight_aftermath_tracker.cpp index 6e253e08ac..7b487fa895 100644 --- a/src/video_core/vulkan_common/nsight_aftermath_tracker.cpp +++ b/src/video_core/vulkan_common/nsight_aftermath_tracker.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #ifdef HAS_NSIGHT_AFTERMATH diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index fda4465a95..8ac1e2bed1 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp index 68613b60ee..4c9879109d 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.cpp +++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/web_service/announce_room_json.h b/src/web_service/announce_room_json.h index 8820b49563..d1db5a2981 100644 --- a/src/web_service/announce_room_json.h +++ b/src/web_service/announce_room_json.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once diff --git a/src/web_service/verify_login.h b/src/web_service/verify_login.h index 4dee9cdc2f..e4e3d560f0 100644 --- a/src/web_service/verify_login.h +++ b/src/web_service/verify_login.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2017 Citra Emulator Project & 2024 suyu Emulator Project +// SPDX-FileCopyrightText: 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once From 932e1a5fda91ba7351460f49b34198c536736582 Mon Sep 17 00:00:00 2001 From: Exverge Date: Sun, 24 Mar 2024 03:25:49 +0100 Subject: [PATCH 024/165] Update bug report template to have bug label --- .gitea/ISSUE_TEMPLATE/bug_report.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitea/ISSUE_TEMPLATE/bug_report.yml b/.gitea/ISSUE_TEMPLATE/bug_report.yml index 041a4ff3bf..8121611b02 100644 --- a/.gitea/ISSUE_TEMPLATE/bug_report.yml +++ b/.gitea/ISSUE_TEMPLATE/bug_report.yml @@ -1,5 +1,6 @@ name: Bug Report description: File a bug report +labels: "bug" body: - type: markdown attributes: From e139a99e018eab00157b8dfdf74ee9edc8c057fb Mon Sep 17 00:00:00 2001 From: zqpvr01 Date: Sun, 24 Mar 2024 05:13:09 +0100 Subject: [PATCH 025/165] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d98f2b089e..b59a4bf8db 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ We have official builds [here.](https://git.suyu.dev/suyu/suyu/releases) If any * __Windows__: [Windows Build](https://git.suyu.dev/suyu/suyu/wiki/Building-For-Windows) * __Linux__: [Linux Build](https://git.suyu.dev/suyu/suyu/wiki/Building-For-Linux) * __Android__: [Android Build](https://git.suyu.dev/suyu/suyu/wiki/Building-For-Android) -* __MacOS__: [MacOS Build](https://git.suyu.dev/suyu/suyu/wiki/Building-for-macOS) +* __macOS__: [macOS Build](https://git.suyu.dev/suyu/suyu/wiki/Building-for-macOS) From 9339a4dbdedc3a004e0f6c65cee06800bc2956d6 Mon Sep 17 00:00:00 2001 From: Fijxu Date: Sun, 24 Mar 2024 03:19:38 -0300 Subject: [PATCH 026/165] ci: Only run jobs when modifying a file in specific directories. Android job disabled because it fails. I will fix it other day. --- .forgejo/workflows/verify.yml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/.forgejo/workflows/verify.yml b/.forgejo/workflows/verify.yml index d55df43ea2..0e9263fbb4 100644 --- a/.forgejo/workflows/verify.yml +++ b/.forgejo/workflows/verify.yml @@ -9,13 +9,29 @@ name: 'suyu verify' on: pull_request: branches: [ "dev" ] + paths: + - 'src/**' + - 'CMakeModules/**' + - 'dist/**' + - 'externals/**' + - 'vcpkg.json' + paths-ignore: + - 'src/android/**' push: branches: [ "dev" ] + paths: + - 'src/**' + - 'CMakeModules/**' + - 'dist/**' + - 'externals/**' + - 'vcpkg.json' + paths-ignore: + - 'src/android/**' + env: PR_NUMBER: pr${{ github.event.number }} CCACHE_DIR: '.ccache' - jobs: format: name: 'Verify Format' From 77813b232e2d4cd888b6816c4cfc135c14843961 Mon Sep 17 00:00:00 2001 From: Exverge Date: Sun, 24 Mar 2024 15:27:00 +0100 Subject: [PATCH 027/165] =?UTF-8?q?We=20(don=E2=80=99t)=20own=20gradle.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/android/gradlew | 65 +++++++++++++++++++++++++++++++++++++---- src/android/gradlew.bat | 19 ++++++++++-- 2 files changed, 75 insertions(+), 9 deletions(-) diff --git a/src/android/gradlew b/src/android/gradlew index afa1279664..766b044aac 100755 --- a/src/android/gradlew +++ b/src/android/gradlew @@ -1,12 +1,65 @@ -#!/usr/bin/env sh +#!/bin/sh -# SPDX-FileCopyrightText: 2023 yuzu Emulator Project -# SPDX-License-Identifier: GPL-3.0-or-later +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME diff --git a/src/android/gradlew.bat b/src/android/gradlew.bat index 3aa3a7669c..fec6cb2bdd 100644 --- a/src/android/gradlew.bat +++ b/src/android/gradlew.bat @@ -1,7 +1,20 @@ -@rem SPDX-FileCopyrightText: 2023 suyu Emulator Project -@rem SPDX-License-Identifier: GPL-3.0-or-later +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows From a9312c837e91006033bb045da65673cfdce4a58d Mon Sep 17 00:00:00 2001 From: Lucas Clemente Vella Date: Sat, 23 Mar 2024 11:37:50 +0000 Subject: [PATCH 028/165] Searching for Vulkan before QT6, so it doesn't messes with Vulkan. --- CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7b4df91028..6fec995c6d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -374,6 +374,9 @@ if(ENABLE_QT6 AND Qt6_LOCATION) list(APPEND CMAKE_PREFIX_PATH "${Qt6_LOCATION}") endif() +# QT6 searches for Vulkan::Headers, too, so we have to define it before QT6 has a chance to do it. +add_subdirectory(externals) + function(set_suyu_qt_components) # Best practice is to ask for all components at once, so they are from the same version set(SUYU_QT_COMPONENTS2 Core Widgets Concurrent) @@ -709,7 +712,6 @@ if (SUYU_USE_FASTER_LD AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU") endif() endif() -add_subdirectory(externals) add_subdirectory(src) # Set suyu project or suyu-cmd project as default StartUp Project in Visual Studio depending on whether QT is enabled or not From 907f9aa6f2a011431d105de9e43887727c8b10d8 Mon Sep 17 00:00:00 2001 From: suyudontsueme Date: Sun, 24 Mar 2024 21:12:15 +0100 Subject: [PATCH 029/165] Rewrite missing keys dialog to be more descriptive Closes #30 --- .forgejo/workflows/verify.yml | 88 ++++++++++++++++++----------------- src/suyu/main.cpp | 9 ++-- 2 files changed, 49 insertions(+), 48 deletions(-) diff --git a/.forgejo/workflows/verify.yml b/.forgejo/workflows/verify.yml index 0e9263fbb4..46fa5f958b 100644 --- a/.forgejo/workflows/verify.yml +++ b/.forgejo/workflows/verify.yml @@ -14,6 +14,7 @@ on: - 'CMakeModules/**' - 'dist/**' - 'externals/**' + - 'CMakeLists.txt' - 'vcpkg.json' paths-ignore: - 'src/android/**' @@ -24,6 +25,7 @@ on: - 'CMakeModules/**' - 'dist/**' - 'externals/**' + - 'CMakeLists.txt' - 'vcpkg.json' paths-ignore: - 'src/android/**' @@ -171,47 +173,47 @@ jobs: # with: # name: ${{ env.INDIVIDUAL_EXE }} # path: ${{ env.INDIVIDUAL_EXE }} - android: - runs-on: ubuntu-latest - needs: format - steps: - - uses: https://code.forgejo.org/actions/checkout@v3 - with: - submodules: recursive - fetch-depth: 0 - - name: set up JDK 17 - uses: https://github.com/actions/setup-java@v3 - with: - java-version: '17' - distribution: 'temurin' - - name: Set up cache - uses: https://code.forgejo.org/actions/cache@v3 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - .ccache - key: ${{ runner.os }}-android-${{ github.sha }} - restore-keys: | - ${{ runner.os }}-android- - - name: Query tag name - uses: https://github.com/olegtarasov/get-tag@v2.1.2 - id: tagName - - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install -y ccache apksigner glslang-dev glslang-tools - - name: Build - run: ./.ci/scripts/android/build.sh - - name: Copy and sign artifacts - env: - ANDROID_KEYSTORE_B64: ${{ secrets.ANDROID_KEYSTORE_B64 }} - ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} - ANDROID_KEYSTORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASS }} - run: ./.ci/scripts/android/upload.sh - - name: Upload - uses: https://code.forgejo.org/actions/upload-artifact@v3 - with: - name: android - path: artifacts/ + # android: + # runs-on: ubuntu-latest + # needs: format + # steps: + # - uses: https://code.forgejo.org/actions/checkout@v3 + # with: + # submodules: recursive + # fetch-depth: 0 + # - name: set up JDK 17 + # uses: https://github.com/actions/setup-java@v3 + # with: + # java-version: '17' + # distribution: 'temurin' + # - name: Set up cache + # uses: https://code.forgejo.org/actions/cache@v3 + # with: + # path: | + # ~/.gradle/caches + # ~/.gradle/wrapper + # .ccache + # key: ${{ runner.os }}-android-${{ github.sha }} + # restore-keys: | + # ${{ runner.os }}-android- + # - name: Query tag name + # uses: https://github.com/olegtarasov/get-tag@v2.1.2 + # id: tagName + # - name: Install dependencies + # run: | + # sudo apt-get update + # sudo apt-get install -y ccache apksigner glslang-dev glslang-tools + # - name: Build + # run: ./.ci/scripts/android/build.sh + # - name: Copy and sign artifacts + # env: + # ANDROID_KEYSTORE_B64: ${{ secrets.ANDROID_KEYSTORE_B64 }} + # ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} + # ANDROID_KEYSTORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASS }} + # run: ./.ci/scripts/android/upload.sh + # - name: Upload + # uses: https://code.forgejo.org/actions/upload-artifact@v3 + # with: + # name: android + # path: artifacts/ diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index fc0028b45d..9a3ee7f662 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -1756,11 +1756,10 @@ bool GMainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPa } if (!ContentManager::AreKeysPresent()) { - QMessageBox::warning(this, tr("Derivation Components Missing"), - tr("Encryption keys are missing. " - "In order to use this emulator, " - "you need to provide your own encryption keys " - "in order to play them.")); + QMessageBox::warning( + this, tr("Encryption Keys Missing"), + tr("In order to use suyu you need to provide your own encryption keys. " + "You can install them by going to Tools -> Install encryption keys.")); return false; } } From 201bff1731aa8bae76be72e7746e0a0ba38df8df Mon Sep 17 00:00:00 2001 From: Fijxu Date: Sun, 24 Mar 2024 20:04:45 -0300 Subject: [PATCH 030/165] Add missing REUSE files and directories --- .forgejo/workflows/{ci.yml => reuse.yml} | 0 .forgejo/workflows/verify.yml | 4 +- .reuse/dep5 | 23 +- LICENSES/CC-BY-NC-SA-4.0.txt | 438 +++++++++++++++++++++++ dist/readme/suyu__Logo-Pill.svg | 5 + src/android/gradlew | 65 +--- src/android/gradlew.bat | 19 +- 7 files changed, 476 insertions(+), 78 deletions(-) rename .forgejo/workflows/{ci.yml => reuse.yml} (100%) create mode 100644 LICENSES/CC-BY-NC-SA-4.0.txt diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/reuse.yml similarity index 100% rename from .forgejo/workflows/ci.yml rename to .forgejo/workflows/reuse.yml diff --git a/.forgejo/workflows/verify.yml b/.forgejo/workflows/verify.yml index 46fa5f958b..47b28725fb 100644 --- a/.forgejo/workflows/verify.yml +++ b/.forgejo/workflows/verify.yml @@ -62,8 +62,8 @@ jobs: image: linux-fresh - type: linux image: linux-fresh - - type: windows - image: linux-mingw + # - type: windows + # image: linux-mingw container: fijxu/build-environments:${{ matrix.image }} # User 1001 doesn't exists on the images. # options: -u 1001 diff --git a/.reuse/dep5 b/.reuse/dep5 index 926ddd097d..b39bc42fb7 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -9,7 +9,8 @@ Files: dist/english_plurals/* dist/qt_themes/*/icons/48x48/sd_card.png dist/qt_themes/*/icons/index.theme dist/qt_themes/default/style.qss -Copyright: suyu Emulator Project +Copyright: yuzu Emulator Project + suyu Emulator Project License: GPL-2.0-or-later Files: dist/qt_themes/default/icons/256x256/suyu.png @@ -159,3 +160,23 @@ License: BSD-3-Clause Files: src/android/app/debug.keystore Copyright: 2023 yuzu Emulator Project License: GPL-3.0-or-later + +Files: .github-archive/ISSUE_TEMPLATE/* +Copyright: 2022 yuzu Emulator Project +License: GPL-2.0-or-later + +Files: .forgejo/ISSUE_TEMPLATE/* +Copyright: 2024 suyu Emulator Project +License: GPL-3.0-or-later + +Files: .gitea/ISSUE_TEMPLATE/* +Copyright: 2024 suyu Emulator Project +License: GPL-3.0-or-later + +Files: .gitlab-ci.yml +Copyright: 2024 suyu Emulator Project +License: GPL-3.0-or-later + +Files: dist/icns_generator.sh +Copyright: 2024 suyu Emulator Project +License: GPL-3.0-or-later diff --git a/LICENSES/CC-BY-NC-SA-4.0.txt b/LICENSES/CC-BY-NC-SA-4.0.txt new file mode 100644 index 0000000000..7cdbe0b482 --- /dev/null +++ b/LICENSES/CC-BY-NC-SA-4.0.txt @@ -0,0 +1,438 @@ +Attribution-NonCommercial-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International +Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-NonCommercial-ShareAlike 4.0 International Public License +("Public License"). To the extent this Public License may be +interpreted as a contract, You are granted the Licensed Rights in +consideration of Your acceptance of these terms and conditions, and the +Licensor grants You such rights in consideration of benefits the +Licensor receives from making the Licensed Material available under +these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-NC-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution, NonCommercial, and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. NonCommercial means not primarily intended for or directed towards + commercial advantage or monetary compensation. For purposes of + this Public License, the exchange of the Licensed Material for + other material subject to Copyright and Similar Rights by digital + file-sharing or similar means is NonCommercial provided there is + no payment of monetary compensation in connection with the + exchange. + + l. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + m. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + n. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part, for NonCommercial purposes only; and + + b. produce, reproduce, and Share Adapted Material for + NonCommercial purposes only. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties, including when + the Licensed Material is used other than for NonCommercial + purposes. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-NC-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database for NonCommercial purposes + only; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. + diff --git a/dist/readme/suyu__Logo-Pill.svg b/dist/readme/suyu__Logo-Pill.svg index e34ab989c8..673732798a 100644 --- a/dist/readme/suyu__Logo-Pill.svg +++ b/dist/readme/suyu__Logo-Pill.svg @@ -1,3 +1,8 @@ + + diff --git a/src/android/gradlew b/src/android/gradlew index 766b044aac..afa1279664 100755 --- a/src/android/gradlew +++ b/src/android/gradlew @@ -1,65 +1,12 @@ -#!/bin/sh +#!/usr/bin/env sh -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# +# SPDX-FileCopyrightText: 2023 yuzu Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later ############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# +## +## Gradle start up script for UN*X +## ############################################################################## # Attempt to set APP_HOME diff --git a/src/android/gradlew.bat b/src/android/gradlew.bat index fec6cb2bdd..be152d1088 100644 --- a/src/android/gradlew.bat +++ b/src/android/gradlew.bat @@ -1,20 +1,7 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem +@rem SPDX-FileCopyrightText: 2023 yuzu Emulator Project +@rem SPDX-License-Identifier: GPL-3.0-or-later -@if "%DEBUG%"=="" @echo off +@if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows From bbe9f86554b3deb83b32a13a9f34a5917e003509 Mon Sep 17 00:00:00 2001 From: Fijxu Date: Sun, 24 Mar 2024 21:01:56 -0300 Subject: [PATCH 031/165] ci: Execute CI if verify.yml has been changed --- .forgejo/workflows/verify.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.forgejo/workflows/verify.yml b/.forgejo/workflows/verify.yml index 47b28725fb..d250c136b7 100644 --- a/.forgejo/workflows/verify.yml +++ b/.forgejo/workflows/verify.yml @@ -27,6 +27,7 @@ on: - 'externals/**' - 'CMakeLists.txt' - 'vcpkg.json' + - '.forgejo/workflows/verify.yml' paths-ignore: - 'src/android/**' From ba411a17e0ada259085a3d9190b4698eeb048569 Mon Sep 17 00:00:00 2001 From: zqpvr01 Date: Mon, 25 Mar 2024 01:14:35 +0100 Subject: [PATCH 032/165] change application id when we enable discord rpc for use this will change the yuzu icon to suyu. --- src/suyu/discord_impl.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/suyu/discord_impl.cpp b/src/suyu/discord_impl.cpp index f5a6448d82..b72b9e41e3 100644 --- a/src/suyu/discord_impl.cpp +++ b/src/suyu/discord_impl.cpp @@ -24,7 +24,8 @@ DiscordImpl::DiscordImpl(Core::System& system_) : system{system_} { DiscordEventHandlers handlers{}; // The number is the client ID for suyu, it's used for images and the // application name - Discord_Initialize("712465656758665259", &handlers, 1, nullptr); + // NOTE: This application is owned by million1156 (million@alyocord.com) + Discord_Initialize("1221314350216646828", &handlers, 1, nullptr); } DiscordImpl::~DiscordImpl() { From 0c2bdc6f61cb9016ebcfad0cef1560631c213462 Mon Sep 17 00:00:00 2001 From: Fijxu Date: Sun, 24 Mar 2024 22:25:08 -0300 Subject: [PATCH 033/165] Fix wrong URL on DownloadExternals. Change Clang and GCC executables on CI scripts --- .ci/scripts/clang/docker.sh | 12 ++++++++---- .ci/scripts/linux/docker.sh | 6 +++--- CMakeLists.txt | 4 ++-- CMakeModules/DownloadExternals.cmake | 8 ++++---- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/.ci/scripts/clang/docker.sh b/.ci/scripts/clang/docker.sh index 7b5c6ec4df..57fbb97544 100755 --- a/.ci/scripts/clang/docker.sh +++ b/.ci/scripts/clang/docker.sh @@ -1,19 +1,22 @@ #!/bin/bash -ex # SPDX-FileCopyrightText: 2021 yuzu Emulator Project +# SPDX-FileCopyrightText: 2024 suyu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later # Exit on error, rather than continuing with the rest of the script. set -e -ccache -s +ccache -sv mkdir build || true && cd build cmake .. \ -DCMAKE_BUILD_TYPE=Release \ + -DSUYU_USE_PRECOMPILED_HEADERS=OFF \ + -DDYNARMIC_USE_PRECOMPILED_HEADERS=OFF \ -DCMAKE_CXX_FLAGS="-march=x86-64-v2" \ - -DCMAKE_CXX_COMPILER=/usr/lib/ccache/clang++ \ - -DCMAKE_C_COMPILER=/usr/lib/ccache/clang \ + -DCMAKE_CXX_COMPILER=/usr/bin/clang++ \ + -DCMAKE_C_COMPILER=/usr/bin/clang \ -DCMAKE_INSTALL_PREFIX="/usr" \ -DDISPLAY_VERSION=$1 \ -DENABLE_COMPATIBILITY_LIST_DOWNLOAD=ON \ @@ -22,11 +25,12 @@ cmake .. \ -DSUYU_CRASH_DUMPS=ON \ -DSUYU_ENABLE_COMPATIBILITY_REPORTING=${ENABLE_COMPATIBILITY_REPORTING:-"OFF"} \ -DSUYU_USE_BUNDLED_FFMPEG=ON \ + -DSUYU_USE_FASTER_LD=ON \ -GNinja ninja -ccache -s +ccache -sv ctest -VV -C Release diff --git a/.ci/scripts/linux/docker.sh b/.ci/scripts/linux/docker.sh index b6b8efeea4..a7a0eb0b00 100755 --- a/.ci/scripts/linux/docker.sh +++ b/.ci/scripts/linux/docker.sh @@ -15,8 +15,8 @@ cmake .. \ -DSUYU_USE_PRECOMPILED_HEADERS=OFF \ -DDYNARMIC_USE_PRECOMPILED_HEADERS=OFF \ -DCMAKE_CXX_FLAGS="-march=x86-64-v2" \ - -DCMAKE_CXX_COMPILER=/usr/lib/ccache/g++ \ - -DCMAKE_C_COMPILER=/usr/lib/ccache/gcc \ + -DCMAKE_CXX_COMPILER=/usr/bin/g++ \ + -DCMAKE_C_COMPILER=/usr/bin/gcc \ -DCMAKE_INSTALL_PREFIX="/usr" \ -DDISPLAY_VERSION=$1 \ -DENABLE_COMPATIBILITY_LIST_DOWNLOAD=OFF \ @@ -24,7 +24,7 @@ cmake .. \ -DUSE_DISCORD_PRESENCE=ON \ -DSUYU_ENABLE_COMPATIBILITY_REPORTING=${ENABLE_COMPATIBILITY_REPORTING:-"OFF"} \ -DSUYU_USE_BUNDLED_FFMPEG=ON \ - -DSUYU_ENABLE_LTO=ON \ + -DSUYU_ENABLE_LTO=OFF \ -DSUYU_CRASH_DUMPS=ON \ -DSUYU_USE_FASTER_LD=ON \ -GNinja diff --git a/CMakeLists.txt b/CMakeLists.txt index 6fec995c6d..84132e47d1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -132,7 +132,7 @@ if (SUYU_USE_BUNDLED_VCPKG) set(VCPKG_DOWNLOADS_PATH ${PROJECT_SOURCE_DIR}/externals/vcpkg/downloads) set(NASM_VERSION "2.16.01") set(NASM_DESTINATION_PATH ${VCPKG_DOWNLOADS_PATH}/nasm-${NASM_VERSION}-win64.zip) - set(NASM_DOWNLOAD_URL "https://gitlab.com/suyu-emu/ext-windows-bin/raw/master/nasm/nasm-${NASM_VERSION}-win64.zip") + set(NASM_DOWNLOAD_URL "https://git.suyu.dev/suyu/ext-windows-bin/raw/branch/master/nasm/nasm-${NASM_VERSION}-win64.zip") if (NOT EXISTS ${NASM_DESTINATION_PATH}) file(DOWNLOAD ${NASM_DOWNLOAD_URL} ${NASM_DESTINATION_PATH} SHOW_PROGRESS STATUS NASM_STATUS) @@ -632,7 +632,7 @@ if (NOT CLANG_FORMAT) message(STATUS "Clang format not found! Downloading...") set(CLANG_FORMAT "${PROJECT_BINARY_DIR}/externals/clang-format${CLANG_FORMAT_POSTFIX}.exe") file(DOWNLOAD - https://gitlab.com/suyu-emu/ext-windows-bin/raw/master/clang-format${CLANG_FORMAT_POSTFIX}.exe + https://git.suyu.dev/suyu/ext-windows-bin/raw/branch/master/clang-format${CLANG_FORMAT_POSTFIX}.exe "${CLANG_FORMAT}" SHOW_PROGRESS STATUS DOWNLOAD_SUCCESS) if (NOT DOWNLOAD_SUCCESS EQUAL 0) diff --git a/CMakeModules/DownloadExternals.cmake b/CMakeModules/DownloadExternals.cmake index 2498773e61..858bce8771 100644 --- a/CMakeModules/DownloadExternals.cmake +++ b/CMakeModules/DownloadExternals.cmake @@ -7,21 +7,21 @@ # prefix_var: name of a variable which will be set with the path to the extracted contents function(download_bundled_external remote_path lib_name prefix_var) -set(package_base_url "https://git.suyu.dev/suyu") +set(package_base_url "https://git.suyu.dev/suyu/") set(package_repo "no_platform") set(package_extension "no_platform") set(package_head "?ref_type=heads") if (WIN32) - set(package_repo "ext-windows-bin/-/raw/master/") + set(package_repo "ext-windows-bin/raw/branch/master/") set(package_extension ".7z") elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") - set(package_repo "ext-linux-bin/-/raw/main/") + set(package_repo "ext-linux-bin/raw/branch/main/") set(package_extension ".tar.xz") # elseif (APPLE) # set(package_repo "ext-osx-bin/-/raw/main/") # set(package_extension ".dmg") elseif (ANDROID) - set(package_repo "ext-android-bin/-/raw/main/") + set(package_repo "ext-android-bin/raw/branch/main/") set(package_extension ".tar.xz") else() message(FATAL_ERROR "No package available for this platform") From d4375a21ef2114ca5689e277ca1e53eb406c5f8f Mon Sep 17 00:00:00 2001 From: Fijxu Date: Mon, 25 Mar 2024 00:11:11 -0300 Subject: [PATCH 034/165] Revert a9312c837e . Use proper GCC binary location and CCACHE changes in the CI --- .ci/scripts/linux/docker.sh | 8 ++++---- .forgejo/workflows/verify.yml | 5 ++--- CMakeLists.txt | 3 +-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/.ci/scripts/linux/docker.sh b/.ci/scripts/linux/docker.sh index a7a0eb0b00..82432bd835 100755 --- a/.ci/scripts/linux/docker.sh +++ b/.ci/scripts/linux/docker.sh @@ -6,7 +6,7 @@ # Exit on error, rather than continuing with the rest of the script. set -e -ccache -s +ccache -sv mkdir build || true && cd build cmake .. \ @@ -15,8 +15,8 @@ cmake .. \ -DSUYU_USE_PRECOMPILED_HEADERS=OFF \ -DDYNARMIC_USE_PRECOMPILED_HEADERS=OFF \ -DCMAKE_CXX_FLAGS="-march=x86-64-v2" \ - -DCMAKE_CXX_COMPILER=/usr/bin/g++ \ - -DCMAKE_C_COMPILER=/usr/bin/gcc \ + -DCMAKE_CXX_COMPILER=/usr/local/bin/g++ \ + -DCMAKE_C_COMPILER=/usr/local/bin/gcc \ -DCMAKE_INSTALL_PREFIX="/usr" \ -DDISPLAY_VERSION=$1 \ -DENABLE_COMPATIBILITY_LIST_DOWNLOAD=OFF \ @@ -31,7 +31,7 @@ cmake .. \ ninja -ccache -s +ccache -sv ctest -VV -C Release diff --git a/.forgejo/workflows/verify.yml b/.forgejo/workflows/verify.yml index d250c136b7..1d17c43a2b 100644 --- a/.forgejo/workflows/verify.yml +++ b/.forgejo/workflows/verify.yml @@ -33,7 +33,6 @@ on: env: PR_NUMBER: pr${{ github.event.number }} - CCACHE_DIR: '.ccache' jobs: format: @@ -77,13 +76,13 @@ jobs: uses: https://code.forgejo.org/actions/cache@v3 id: ccache-restore with: - path: .ccache + path: ~/.ccache key: ${{ runner.os }}-${{ matrix.type }}-${{ github.sha }} restore-keys: | ${{ runner.os }}-${{ matrix.type }}- - name: Create ccache directory if: steps.ccache-restore.outputs.cache-hit != 'true' - run: mkdir -p .ccache + run: mkdir -p ~/.ccache - name: Build run: ./.ci/scripts/${{ matrix.type }}/docker.sh env: diff --git a/CMakeLists.txt b/CMakeLists.txt index 84132e47d1..42e8615e57 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -374,8 +374,6 @@ if(ENABLE_QT6 AND Qt6_LOCATION) list(APPEND CMAKE_PREFIX_PATH "${Qt6_LOCATION}") endif() -# QT6 searches for Vulkan::Headers, too, so we have to define it before QT6 has a chance to do it. -add_subdirectory(externals) function(set_suyu_qt_components) # Best practice is to ask for all components at once, so they are from the same version @@ -712,6 +710,7 @@ if (SUYU_USE_FASTER_LD AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU") endif() endif() +add_subdirectory(externals) add_subdirectory(src) # Set suyu project or suyu-cmd project as default StartUp Project in Visual Studio depending on whether QT is enabled or not From 77042ae6f79350a522b498a5d6c6c772cc7dd08a Mon Sep 17 00:00:00 2001 From: XForYouX Date: Mon, 25 Mar 2024 12:42:41 +0100 Subject: [PATCH 035/165] Add 32:9 Android This Fix Issue Aspec Ratio For Android --- src/android/app/src/main/res/values/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index a2487f4f11..5331f2b419 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -601,6 +601,7 @@ Force 4:3 Force 21:9 Force 16:10 + Force 32:9 Stretch to window From 9b3fa0d3da4e63cf5603313b8d15a0645d7c371a Mon Sep 17 00:00:00 2001 From: XForYouX Date: Mon, 25 Mar 2024 12:45:48 +0100 Subject: [PATCH 036/165] Add 32:9 Android Fix Issue Aspec Ratio For Android --- src/android/app/src/main/res/values/arrays.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 1bd6455b4c..8537488d4e 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -142,6 +142,7 @@ @string/ratio_force_four_three @string/ratio_force_twenty_one_nine @string/ratio_force_sixteen_ten + @string/ratio_force_thirty_two_nine @string/ratio_stretch @@ -151,6 +152,7 @@ 2 3 4 + 5 From 1f2bbfdf6d9e0a4e99017379c889c840144b1ec7 Mon Sep 17 00:00:00 2001 From: XForYouX Date: Mon, 25 Mar 2024 12:50:04 +0100 Subject: [PATCH 037/165] Increase Limit ( FSR Sharp , AUDIO ) Android Increase Limit FSR Sharp ( 0 - 200 ) Increase Limit Audio ( 0-120 ) --- .../suyu_emu/features/settings/model/view/SettingsItem.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt index 8aa8a477de..f59f4ebf53 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt @@ -241,6 +241,8 @@ abstract class SettingsItem( IntSetting.FSR_SHARPENING_SLIDER, titleId = R.string.fsr_sharpness, descriptionId = R.string.fsr_sharpness_description, + min = 0, + max = 200, units = "%" ) ) @@ -327,6 +329,8 @@ abstract class SettingsItem( ByteSetting.AUDIO_VOLUME, titleId = R.string.audio_volume, descriptionId = R.string.audio_volume_description, + min = 0, + max = 120, units = "%" ) ) From 177bb48d6c0a004504aaf5e10b06c37ae6828301 Mon Sep 17 00:00:00 2001 From: zqpvr01 Date: Mon, 25 Mar 2024 16:59:22 +0100 Subject: [PATCH 038/165] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index b59a4bf8db..6334f02b2c 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,8 @@ You can also contact any of the developers on Discord to learn more about the cu * __macOS__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __Android__: [Releases](https://git.suyu.dev/suyu/suyu/releases) +If you want daily builds then go here. https://git.suyu.dev/suyu/suyu/actions + We have official builds [here.](https://git.suyu.dev/suyu/suyu/releases) If any website or person is claiming to have a build for suyu, take that with a grain of salt. ## Building From 068052078fdb0e6bbe4073f1ad2fda9ec6d08e2b Mon Sep 17 00:00:00 2001 From: Fijxu Date: Mon, 25 Mar 2024 12:03:07 -0300 Subject: [PATCH 039/165] CI: Enable android artifacts --- .ci/scripts/android/build.sh | 3 +- .ci/scripts/android/upload.sh | 2 +- .forgejo/workflows/verify.yml | 92 +++++++++++++++++------------------ 3 files changed, 48 insertions(+), 49 deletions(-) diff --git a/.ci/scripts/android/build.sh b/.ci/scripts/android/build.sh index d0811adf7b..935919b6de 100755 --- a/.ci/scripts/android/build.sh +++ b/.ci/scripts/android/build.sh @@ -1,6 +1,7 @@ #!/bin/bash -ex # SPDX-FileCopyrightText: 2023 yuzu Emulator Project +# SPDX-FileCopyrightText: 2024 suyu Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later export NDK_CCACHE="$(which ccache)" @@ -9,7 +10,7 @@ ccache -s BUILD_FLAVOR="mainline" BUILD_TYPE="release" -if [ "${GITHUB_REPOSITORY}" == "suyu-emu/suyu" ]; then +if [ "${GITHUB_REPOSITORY}" == "suyu/suyu" ]; then BUILD_TYPE="relWithDebInfo" fi diff --git a/.ci/scripts/android/upload.sh b/.ci/scripts/android/upload.sh index 05ccff2aa9..1db05bec11 100755 --- a/.ci/scripts/android/upload.sh +++ b/.ci/scripts/android/upload.sh @@ -11,7 +11,7 @@ BUILD_FLAVOR="mainline" BUILD_TYPE_LOWER="release" BUILD_TYPE_UPPER="Release" -if [ "${GITHUB_REPOSITORY}" == "suyu-emu/suyu" ]; then +if [ "${GITHUB_REPOSITORY}" == "suyu/suyu" ]; then BUILD_TYPE_LOWER="relWithDebInfo" BUILD_TYPE_UPPER="RelWithDebInfo" fi diff --git a/.forgejo/workflows/verify.yml b/.forgejo/workflows/verify.yml index 1d17c43a2b..f89166dbde 100644 --- a/.forgejo/workflows/verify.yml +++ b/.forgejo/workflows/verify.yml @@ -16,8 +16,8 @@ on: - 'externals/**' - 'CMakeLists.txt' - 'vcpkg.json' - paths-ignore: - - 'src/android/**' + # paths-ignore: + # - 'src/android/**' push: branches: [ "dev" ] paths: @@ -28,8 +28,9 @@ on: - 'CMakeLists.txt' - 'vcpkg.json' - '.forgejo/workflows/verify.yml' - paths-ignore: - - 'src/android/**' + - '.ci/**' + # paths-ignore: + # - 'src/android/**' env: PR_NUMBER: pr${{ github.event.number }} @@ -173,47 +174,44 @@ jobs: # with: # name: ${{ env.INDIVIDUAL_EXE }} # path: ${{ env.INDIVIDUAL_EXE }} - # android: - # runs-on: ubuntu-latest - # needs: format - # steps: - # - uses: https://code.forgejo.org/actions/checkout@v3 - # with: - # submodules: recursive - # fetch-depth: 0 - # - name: set up JDK 17 - # uses: https://github.com/actions/setup-java@v3 - # with: - # java-version: '17' - # distribution: 'temurin' - # - name: Set up cache - # uses: https://code.forgejo.org/actions/cache@v3 - # with: - # path: | - # ~/.gradle/caches - # ~/.gradle/wrapper - # .ccache - # key: ${{ runner.os }}-android-${{ github.sha }} - # restore-keys: | - # ${{ runner.os }}-android- - # - name: Query tag name - # uses: https://github.com/olegtarasov/get-tag@v2.1.2 - # id: tagName - # - name: Install dependencies - # run: | - # sudo apt-get update - # sudo apt-get install -y ccache apksigner glslang-dev glslang-tools - # - name: Build - # run: ./.ci/scripts/android/build.sh - # - name: Copy and sign artifacts - # env: - # ANDROID_KEYSTORE_B64: ${{ secrets.ANDROID_KEYSTORE_B64 }} - # ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} - # ANDROID_KEYSTORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASS }} - # run: ./.ci/scripts/android/upload.sh - # - name: Upload - # uses: https://code.forgejo.org/actions/upload-artifact@v3 - # with: - # name: android - # path: artifacts/ + android: + runs-on: ubuntu-latest + container: fijxu/build-environments:android + needs: format + steps: + - uses: https://code.forgejo.org/actions/checkout@v3 + with: + submodules: recursive + fetch-depth: 0 + - name: set up JDK 17 + uses: https://github.com/actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + - name: Set up cache + uses: https://code.forgejo.org/actions/cache@v3 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + ~/.ccache + key: ${{ runner.os }}-android-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-android- + - name: Query tag name + uses: https://github.com/olegtarasov/get-tag@v2.1.2 + id: tagName + - name: Build + run: ./.ci/scripts/android/build.sh + - name: Copy and sign artifacts + env: + ANDROID_KEYSTORE_B64: ${{ secrets.ANDROID_KEYSTORE_B64 }} + ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} + ANDROID_KEYSTORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASS }} + run: ./.ci/scripts/android/upload.sh + - name: Upload + uses: https://code.forgejo.org/actions/upload-artifact@v3 + with: + name: android + path: artifacts/ From 207732e71ffd287171f42161323ed205a5988f41 Mon Sep 17 00:00:00 2001 From: Hustler One Date: Mon, 25 Mar 2024 20:48:12 +0100 Subject: [PATCH 040/165] Clarify that we indeed have builds --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6334f02b2c..56857b8216 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ It is written in C++ with portability in mind, and we're actively working on bui ## Status -Although we're able to make builds, we don't have a version ready for distribution yet. But we can always use more help! You can make a merge request if you'd like to see something changed, or you can [chat with other developers to find out what needs work](https://discord.gg/suyu). +We currently have builds over at the [Releases](https://git.suyu.dev/suyu/suyu/releases) page. **Note**: We try to update this README whenever we can, but some links might be broken, and some information may be outdated or irrelevant. From eba28b0df3ab1aeb734d99c1a208cdfa49043102 Mon Sep 17 00:00:00 2001 From: Hustler One Date: Mon, 25 Mar 2024 21:12:28 +0100 Subject: [PATCH 041/165] All relevant changes in commit 51862e862dd353e746913c989a6fce87ecbc7a5c have been --- src/common/settings.h | 1 + src/suyu/game_list.cpp | 10 ++ src/suyu/game_list.h | 7 ++ src/suyu/main.cpp | 251 +++++++++++++++++++++++++++++++++++++++++ src/suyu/main.h | 2 + 5 files changed, 271 insertions(+) diff --git a/src/common/settings.h b/src/common/settings.h index 48f127bde8..12def092b8 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later // Modified by palfaiate on <2024/03/07> +// Reverted palfaiate's changes on <2024/03/25> -Nine-Ball #pragma once diff --git a/src/suyu/game_list.cpp b/src/suyu/game_list.cpp index bda0d489bf..28a9d9c970 100644 --- a/src/suyu/game_list.cpp +++ b/src/suyu/game_list.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later // Modified by palfaiate on <2024/03/07> +// Reverted palfaiate's changes on <2024/03/25> -Nine-Ball #include #include @@ -580,6 +581,9 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri remove_menu->addSeparator(); QAction* remove_shader_cache = remove_menu->addAction(tr("Remove All Pipeline Caches")); QAction* remove_all_content = remove_menu->addAction(tr("Remove All Installed Contents")); + QAction* dump_romfs_menu = context_menu.addMenu(tr("Dump RomFS")); + QAction* dump_romfs = dump_romfs_menu->addAction(tr("Dump RomFS")); + QAction* dump_romfs_sdmc = dump_romfs_menu->addAction(tr("Dump RomFS to SDMC")); QAction* verify_integrity = context_menu.addAction(tr("Verify Integrity")); QAction* copy_tid = context_menu.addAction(tr("Copy Title ID to Clipboard")); QAction* navigate_to_gamedb_entry = context_menu.addAction(tr("Navigate to GameDB entry")); @@ -647,6 +651,12 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri connect(remove_cache_storage, &QAction::triggered, [this, program_id, path] { emit RemoveFileRequested(program_id, GameListRemoveTarget::CacheStorage, path); }); + connect(dump_romfs, &QAction::triggered, [this, program_id, path]() { + emit DumpRomFSRequested(program_id, path, DumpRomFSTarget::Normal); + }); + connect(dump_romfs_sdmc, &QAction::triggered, [this, program_id, path]() { + emit DumpRomFSRequested(program_id, path, DumpRomFSTarget::SDMC); + }); connect(verify_integrity, &QAction::triggered, [this, path]() { emit VerifyIntegrityRequested(path); }); connect(copy_tid, &QAction::triggered, diff --git a/src/suyu/game_list.h b/src/suyu/game_list.h index 7568e1b6e0..684a7ba2d9 100644 --- a/src/suyu/game_list.h +++ b/src/suyu/game_list.h @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later // Modified by palfaiate on <2024/03/07> +// Reverted palfaiate's changes on <2024/03/25> -Nine-Ball #pragma once @@ -52,6 +53,11 @@ enum class GameListRemoveTarget { CacheStorage, }; +enum class DumpRomFSTarget { + Normal, + SDMC, +}; + enum class GameListShortcutTarget { Desktop, Applications, @@ -113,6 +119,7 @@ signals: void RemoveFileRequested(u64 program_id, GameListRemoveTarget target, const std::string& game_path); void RemovePlayTimeRequested(u64 program_id); + void DumpRomFSRequested(u64 program_id, const std::string& game_path, DumpRomFSTarget target); void VerifyIntegrityRequested(const std::string& game_path); void CopyTIDRequested(u64 program_id); void CreateShortcut(u64 program_id, const std::string& game_path, diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index 9a3ee7f662..b6af950097 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later // Modified by palfaiate on <2024/03/07> +// Reverted palfaiate's changes on <2024/03/25> -Nine-Ball #include #include @@ -55,6 +56,18 @@ #include "suyu/multiplayer/state.h" #include "suyu/util/controller_navigation.h" +// These are wrappers to avoid the calls to CreateDirectory and CreateFile because of the Windows +static FileSys::VirtualDir VfsFilesystemCreateDirectoryWrapper( + const FileSys::VirtualFilesystem& vfs, const std::string& path, FileSys::OpenMode mode) { + return vfs->CreateDirectory(path, mode); +} + +// Overloaded function, also removed by palafiate +static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::VirtualDir& dir, const std::string& path) { + return dir->CreateFile(path); +} + + #include #include @@ -1465,6 +1478,7 @@ void GMainWindow::ConnectWidgetEvents() { connect(game_list, &GameList::RemoveFileRequested, this, &GMainWindow::OnGameListRemoveFile); connect(game_list, &GameList::RemovePlayTimeRequested, this, &GMainWindow::OnGameListRemovePlayTimeData); + connect(game_list, &GameList::DumpRomFSRequested, this, &GMainWindow::OnGameListDumpRomFS); connect(game_list, &GameList::VerifyIntegrityRequested, this, &GMainWindow::OnGameListVerifyIntegrity); connect(game_list, &GameList::CopyTIDRequested, this, &GMainWindow::OnGameListCopyTID); @@ -2369,6 +2383,68 @@ void GMainWindow::OnTransferableShaderCacheOpenFile(u64 program_id) { QDesktopServices::openUrl(QUrl::fromLocalFile(qt_shader_cache_path)); } +static bool RomFSRawCopy(size_t total_size, size_t& read_size, QProgressDialog& dialog, + const FileSys::VirtualDir& src, const FileSys::VirtualDir& dest, + bool full) { + if (src == nullptr || dest == nullptr || !src->IsReadable() || !dest->IsWritable()) + return false; + if (dialog.wasCanceled()) + return false; + + std::vector buffer(CopyBufferSize); + auto last_timestamp = std::chrono::steady_clock::now(); + + const auto QtRawCopy = [&](const FileSys::VirtualFile& src_file, + const FileSys::VirtualFile& dest_file) { + if (src_file == nullptr || dest_file == nullptr) { + return false; + } + if (!dest_file->Resize(src_file->GetSize())) { + return false; + } + + for (std::size_t i = 0; i < src_file->GetSize(); i += buffer.size()) { + if (dialog.wasCanceled()) { + dest_file->Resize(0); + return false; + } + + using namespace std::literals::chrono_literals; + const auto new_timestamp = std::chrono::steady_clock::now(); + + if ((new_timestamp - last_timestamp) > 33ms) { + last_timestamp = new_timestamp; + dialog.setValue( + static_cast(std::min(read_size, total_size) * 100 / total_size)); + QCoreApplication::processEvents(); + } + + const auto read = src_file->Read(buffer.data(), buffer.size(), i); + dest_file->Write(buffer.data(), read, i); + + read_size += read; + } + + return true; + }; + + if (full) { + for (const auto& file : src->GetFiles()) { + const auto out = VfsDirectoryCreateFileWrapper(dest, file->GetName()); + if (!QtRawCopy(file, out)) + return false; + } + } + + for (const auto& dir : src->GetSubdirectories()) { + const auto out = dest->CreateSubdirectory(dir->GetName()); + if (!RomFSRawCopy(total_size, read_size, dialog, dir, out, full)) + return false; + } + + return true; +} + QString GMainWindow::GetGameListErrorRemoving(InstalledEntryType type) const { switch (type) { case InstalledEntryType::Game: @@ -2610,6 +2686,121 @@ void GMainWindow::RemoveCacheStorage(u64 program_id) { Common::FS::RemoveDirRecursively(path); } +void GMainWindow::OnGameListDumpRomFS(u64 program_id, const std::string& game_path, + DumpRomFSTarget target) { + const auto failed = [this] { + QMessageBox::warning(this, tr("RomFS Extraction Failed!"), + tr("There was an error copying the RomFS files or the user " + "cancelled the operation.")); + }; + + const auto loader = + Loader::GetLoader(*system, vfs->OpenFile(game_path, FileSys::OpenMode::Read)); + if (loader == nullptr) { + failed(); + return; + } + + FileSys::VirtualFile packed_update_raw{}; + loader->ReadUpdateRaw(packed_update_raw); + + const auto& installed = system->GetContentProvider(); + + u64 title_id{}; + u8 raw_type{}; + if (!SelectRomFSDumpTarget(installed, program_id, &title_id, &raw_type)) { + failed(); + return; + } + + const auto type = static_cast(raw_type); + const auto base_nca = installed.GetEntry(title_id, type); + if (!base_nca) { + failed(); + return; + } + + const FileSys::NCA update_nca{packed_update_raw, nullptr}; + if (type != FileSys::ContentRecordType::Program || + update_nca.GetStatus() != Loader::ResultStatus::ErrorMissingBKTRBaseRomFS || + update_nca.GetTitleId() != FileSys::GetUpdateTitleID(title_id)) { + packed_update_raw = {}; + } + + const auto base_romfs = base_nca->GetRomFS(); + const auto dump_dir = + target == DumpRomFSTarget::Normal + ? Common::FS::GetSuyuPath(Common::FS::SuyuPath::DumpDir) + : Common::FS::GetSuyuPath(Common::FS::SuyuPath::SDMCDir) / "atmosphere" / "contents"; + const auto romfs_dir = fmt::format("{:016X}/romfs", title_id); + + const auto path = Common::FS::PathToUTF8String(dump_dir / romfs_dir); + + const FileSys::PatchManager pm{title_id, system->GetFileSystemController(), installed}; + auto romfs = pm.PatchRomFS(base_nca.get(), base_romfs, type, packed_update_raw, false); + + const auto out = VfsFilesystemCreateDirectoryWrapper(vfs, path, FileSys::OpenMode::ReadWrite); + + if (out == nullptr) { + failed(); + vfs->DeleteDirectory(path); + return; + } + + bool ok = false; + const QStringList selections{tr("Full"), tr("Skeleton")}; + const auto res = QInputDialog::getItem( + this, tr("Select RomFS Dump Mode"), + tr("Please select the how you would like the RomFS dumped.
Full will copy all of the " + "files into the new directory while
skeleton will only create the directory " + "structure."), + selections, 0, false, &ok); + if (!ok) { + failed(); + vfs->DeleteDirectory(path); + return; + } + + const auto extracted = FileSys::ExtractRomFS(romfs); + if (extracted == nullptr) { + failed(); + return; + } + + const auto full = res == selections.constFirst(); + + // The expected required space is the size of the RomFS + 1 GiB + const auto minimum_free_space = romfs->GetSize() + 0x40000000; + + if (full && Common::FS::GetFreeSpaceSize(path) < minimum_free_space) { + QMessageBox::warning(this, tr("RomFS Extraction Failed!"), + tr("There is not enough free space at %1 to extract the RomFS. Please " + "free up space or select a different dump directory at " + "Emulation > Configure > System > Filesystem > Dump Root") + .arg(QString::fromStdString(path))); + return; + } + + QProgressDialog progress(tr("Extracting RomFS..."), tr("Cancel"), 0, 100, this); + progress.setWindowModality(Qt::WindowModal); + progress.setMinimumDuration(100); + progress.setAutoClose(false); + progress.setAutoReset(false); + + size_t read_size = 0; + + if (RomFSRawCopy(romfs->GetSize(), read_size, progress, extracted, out, full)) { + progress.close(); + QMessageBox::information(this, tr("RomFS Extraction Succeeded!"), + tr("The operation completed successfully.")); + QDesktopServices::openUrl(QUrl::fromLocalFile(QString::fromStdString(path))); + } else { + progress.close(); + failed(); + vfs->DeleteDirectory(path); + } +} + void GMainWindow::OnGameListVerifyIntegrity(const std::string& game_path) { const auto NotImplemented = [this] { QMessageBox::warning(this, tr("Integrity verification couldn't be performed!"), @@ -4680,6 +4871,66 @@ void GMainWindow::SetFirmwareVersion() { firmware_label->setToolTip(QString::fromStdString(display_title)); } +bool GMainWindow::SelectRomFSDumpTarget(const FileSys::ContentProvider& installed, u64 program_id, + u64* selected_title_id, u8* selected_content_record_type) { + using ContentInfo = std::tuple; + boost::container::flat_set available_title_ids; + + const auto RetrieveEntries = [&](FileSys::TitleType title_type, + FileSys::ContentRecordType record_type) { + const auto entries = installed.ListEntriesFilter(title_type, record_type); + for (const auto& entry : entries) { + if (FileSys::GetBaseTitleID(entry.title_id) == program_id && + installed.GetEntry(entry)->GetStatus() == Loader::ResultStatus::Success) { + available_title_ids.insert({entry.title_id, title_type, record_type}); + } + } + }; + + RetrieveEntries(FileSys::TitleType::Application, FileSys::ContentRecordType::Program); + RetrieveEntries(FileSys::TitleType::Application, FileSys::ContentRecordType::HtmlDocument); + RetrieveEntries(FileSys::TitleType::Application, FileSys::ContentRecordType::LegalInformation); + RetrieveEntries(FileSys::TitleType::AOC, FileSys::ContentRecordType::Data); + + if (available_title_ids.empty()) { + return false; + } + + size_t title_index = 0; + + if (available_title_ids.size() > 1) { + QStringList list; + for (auto& [title_id, title_type, record_type] : available_title_ids) { + const auto hex_title_id = QString::fromStdString(fmt::format("{:X}", title_id)); + if (record_type == FileSys::ContentRecordType::Program) { + list.push_back(QStringLiteral("Program [%1]").arg(hex_title_id)); + } else if (record_type == FileSys::ContentRecordType::HtmlDocument) { + list.push_back(QStringLiteral("HTML document [%1]").arg(hex_title_id)); + } else if (record_type == FileSys::ContentRecordType::LegalInformation) { + list.push_back(QStringLiteral("Legal information [%1]").arg(hex_title_id)); + } else { + list.push_back( + QStringLiteral("DLC %1 [%2]").arg(title_id & 0x7FF).arg(hex_title_id)); + } + } + + bool ok; + const auto res = QInputDialog::getItem( + this, tr("Select RomFS Dump Target"), + tr("Please select which RomFS you would like to dump."), list, 0, false, &ok); + if (!ok) { + return false; + } + + title_index = list.indexOf(res); + } + + const auto& [title_id, title_type, record_type] = *available_title_ids.nth(title_index); + *selected_title_id = title_id; + *selected_content_record_type = static_cast(record_type); + return true; +} + bool GMainWindow::ConfirmClose() { if (emu_thread == nullptr || UISettings::values.confirm_before_stopping.GetValue() == ConfirmStop::Ask_Never) { diff --git a/src/suyu/main.h b/src/suyu/main.h index e20950e238..b2b0f9afc4 100644 --- a/src/suyu/main.h +++ b/src/suyu/main.h @@ -51,6 +51,7 @@ class WaitTreeWidget; enum class GameListOpenTarget; enum class GameListRemoveTarget; enum class GameListShortcutTarget; +enum class DumpRomFSTarget; enum class InstalledEntryType; class GameListPlaceholder; @@ -347,6 +348,7 @@ private slots: void OnGameListRemoveFile(u64 program_id, GameListRemoveTarget target, const std::string& game_path); void OnGameListRemovePlayTimeData(u64 program_id); + void OnGameListDumpRomFS(u64 program_id, const std::string& game_path, DumpRomFSTarget target); void OnGameListVerifyIntegrity(const std::string& game_path); void OnGameListCopyTID(u64 program_id); void OnGameListNavigateToGamedbEntry(u64 program_id, From 925ce2fad34aeb890103d52ea50c151a94fdcd1f Mon Sep 17 00:00:00 2001 From: Crimson-Hawk Date: Tue, 26 Mar 2024 16:39:56 +0800 Subject: [PATCH 042/165] preliminary fix to the peach game --- .../glasm/emit_glasm_context_get_set.cpp | 4 ++++ .../backend/glasm/glasm_emit_context.h | 1 + .../backend/glsl/emit_glsl_context_get_set.cpp | 4 ++++ .../spirv/emit_spirv_context_get_set.cpp | 2 ++ src/shader_recompiler/runtime_info.h | 18 ++++++++++++++++++ 5 files changed, 29 insertions(+) diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp index c7d7d5fefb..75c89ebd02 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp @@ -406,6 +406,10 @@ void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) { case Stage::TessellationEval: ctx.Add("SHL.U {}.x,primitive.vertexcount,16;", inst); break; + case Stage::Geometry: + ctx.Add("SHL.U {}.x,{},16;", inst, + InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); + break; default: LOG_WARNING(Shader, "(STUBBED) called"); ctx.Add("MOV.S {}.x,0x00ff0000;", inst); diff --git a/src/shader_recompiler/backend/glasm/glasm_emit_context.h b/src/shader_recompiler/backend/glasm/glasm_emit_context.h index a81d64a9e4..b4d66ea559 100644 --- a/src/shader_recompiler/backend/glasm/glasm_emit_context.h +++ b/src/shader_recompiler/backend/glasm/glasm_emit_context.h @@ -11,6 +11,7 @@ #include "shader_recompiler/backend/glasm/reg_alloc.h" #include "shader_recompiler/stage.h" +#include "shader_recompiler/runtime_info.h" namespace Shader { struct Info; diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp index 2e369ed723..35d99bad3e 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp @@ -426,6 +426,10 @@ void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) { case Stage::TessellationEval: ctx.AddU32("{}=uint(gl_PatchVerticesIn)<<16;", inst); break; + case Stage::Geometry: + ctx.AddU32("{}=uint({}<<16);", inst, + InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); + break; default: LOG_WARNING(Shader, "(STUBBED) called"); ctx.AddU32("{}=uint(0x00ff0000);", inst); diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp index feca5105f9..2e7643fe9a 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp @@ -549,6 +549,8 @@ Id EmitInvocationInfo(EmitContext& ctx) { case Stage::TessellationEval: return ctx.OpShiftLeftLogical(ctx.U32[1], ctx.OpLoad(ctx.U32[1], ctx.patch_vertices_in), ctx.Const(16u)); + case Stage::Geometry: + return ctx.Const(InputTopologyVertices::vertices(ctx.runtime_info.input_topology) << 16); default: LOG_WARNING(Shader, "(STUBBED) called"); return ctx.Const(0x00ff0000u); diff --git a/src/shader_recompiler/runtime_info.h b/src/shader_recompiler/runtime_info.h index 619c0b1387..dc54d932a6 100644 --- a/src/shader_recompiler/runtime_info.h +++ b/src/shader_recompiler/runtime_info.h @@ -30,6 +30,24 @@ enum class InputTopology { TrianglesAdjacency, }; +struct InputTopologyVertices { + static u32 vertices(InputTopology input_topology) { + switch (input_topology) { + case InputTopology::Lines: + return 2; + case InputTopology::LinesAdjacency: + return 4; + case InputTopology::Triangles: + return 3; + case InputTopology::TrianglesAdjacency: + return 6; + case InputTopology::Points: + default: + return 1; + } + } +}; + enum class CompareFunction { Never, Less, From eb306775c616c4ba6db5fadafd19b509ae16f709 Mon Sep 17 00:00:00 2001 From: Crimson-Hawk Date: Tue, 26 Mar 2024 16:46:05 +0800 Subject: [PATCH 043/165] fix clong format --- .../backend/glasm/emit_glasm_context_get_set.cpp | 2 +- src/shader_recompiler/backend/glasm/glasm_emit_context.h | 2 +- .../backend/glsl/emit_glsl_context_get_set.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp index 75c89ebd02..f96bcc7097 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp @@ -408,7 +408,7 @@ void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) { break; case Stage::Geometry: ctx.Add("SHL.U {}.x,{},16;", inst, - InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); + InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); break; default: LOG_WARNING(Shader, "(STUBBED) called"); diff --git a/src/shader_recompiler/backend/glasm/glasm_emit_context.h b/src/shader_recompiler/backend/glasm/glasm_emit_context.h index b4d66ea559..912fd53db4 100644 --- a/src/shader_recompiler/backend/glasm/glasm_emit_context.h +++ b/src/shader_recompiler/backend/glasm/glasm_emit_context.h @@ -10,8 +10,8 @@ #include #include "shader_recompiler/backend/glasm/reg_alloc.h" -#include "shader_recompiler/stage.h" #include "shader_recompiler/runtime_info.h" +#include "shader_recompiler/stage.h" namespace Shader { struct Info; diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp index 35d99bad3e..ec35f71f87 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp @@ -428,7 +428,7 @@ void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) { break; case Stage::Geometry: ctx.AddU32("{}=uint({}<<16);", inst, - InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); + InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); break; default: LOG_WARNING(Shader, "(STUBBED) called"); From fd1ec51496917ee656e9405826d3d26444b2a04c Mon Sep 17 00:00:00 2001 From: Crimson-Hawk Date: Tue, 26 Mar 2024 16:49:03 +0800 Subject: [PATCH 044/165] try 2 fix clang --- .../backend/glsl/emit_glsl_context_get_set.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp index ec35f71f87..554acafadc 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp @@ -428,7 +428,7 @@ void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) { break; case Stage::Geometry: ctx.AddU32("{}=uint({}<<16);", inst, - InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); + InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); break; default: LOG_WARNING(Shader, "(STUBBED) called"); From 77e9b7b59bb31bf93e4d2156e614f8944cc542af Mon Sep 17 00:00:00 2001 From: Crimson-Hawk Date: Tue, 26 Mar 2024 16:51:43 +0800 Subject: [PATCH 045/165] try 3 fixing clang omfg its just a space --- .../backend/glsl/emit_glsl_context_get_set.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp index 554acafadc..f964c25507 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp @@ -428,7 +428,7 @@ void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) { break; case Stage::Geometry: ctx.AddU32("{}=uint({}<<16);", inst, - InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); + InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); break; default: LOG_WARNING(Shader, "(STUBBED) called"); From caa1fb094c34d3504dd29a2847a9836b8a7620fb Mon Sep 17 00:00:00 2001 From: BoomMicrophone Date: Tue, 26 Mar 2024 15:57:41 +0100 Subject: [PATCH 046/165] nullglob globstar gobble up those nuts shoutout to gpg for not working Signed-off-by: BoomMicrophone --- src/suyu/game_list.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/suyu/game_list.h b/src/suyu/game_list.h index 684a7ba2d9..4adb6403ef 100644 --- a/src/suyu/game_list.h +++ b/src/suyu/game_list.h @@ -56,7 +56,7 @@ enum class GameListRemoveTarget { enum class DumpRomFSTarget { Normal, SDMC, -}; +}; enum class GameListShortcutTarget { Desktop, From b59aaf14e90211d96d79c4824674c956f897af97 Mon Sep 17 00:00:00 2001 From: BoomMicrophone Date: Tue, 26 Mar 2024 16:10:33 +0100 Subject: [PATCH 047/165] Woah guys this is so compliant! Signed-off-by: BoomMicrophone --- src/suyu/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index b6af950097..5d0a46713d 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -63,11 +63,11 @@ static FileSys::VirtualDir VfsFilesystemCreateDirectoryWrapper( } // Overloaded function, also removed by palafiate -static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::VirtualDir& dir, const std::string& path) { +static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::VirtualDir& dir, + const std::string& path) { return dir->CreateFile(path); } - #include #include From affee8c5225e26a28db7c6ac8951c0e1ef39cfb9 Mon Sep 17 00:00:00 2001 From: BoomMicrophone Date: Tue, 26 Mar 2024 16:34:22 +0100 Subject: [PATCH 048/165] fix epic fail (I am relying on actions to do the compiling for me until i get nix) --- src/suyu/game_list.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/suyu/game_list.cpp b/src/suyu/game_list.cpp index 28a9d9c970..132ff30b0c 100644 --- a/src/suyu/game_list.cpp +++ b/src/suyu/game_list.cpp @@ -581,7 +581,7 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri remove_menu->addSeparator(); QAction* remove_shader_cache = remove_menu->addAction(tr("Remove All Pipeline Caches")); QAction* remove_all_content = remove_menu->addAction(tr("Remove All Installed Contents")); - QAction* dump_romfs_menu = context_menu.addMenu(tr("Dump RomFS")); + QMenu* dump_romfs_menu = context_menu.addMenu(tr("Dump RomFS")); QAction* dump_romfs = dump_romfs_menu->addAction(tr("Dump RomFS")); QAction* dump_romfs_sdmc = dump_romfs_menu->addAction(tr("Dump RomFS to SDMC")); QAction* verify_integrity = context_menu.addAction(tr("Verify Integrity")); From 43c1a4c64349243e9f068db92f1372e8086dd3d5 Mon Sep 17 00:00:00 2001 From: ivchodev Date: Tue, 26 Mar 2024 18:36:29 +0100 Subject: [PATCH 049/165] revert 77e9b7b59bb31bf93e4d2156e614f8944cc542af revert try 3 fixing clang omfg its just a space --- .../backend/glsl/emit_glsl_context_get_set.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp index f964c25507..554acafadc 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp @@ -428,7 +428,7 @@ void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) { break; case Stage::Geometry: ctx.AddU32("{}=uint({}<<16);", inst, - InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); + InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); break; default: LOG_WARNING(Shader, "(STUBBED) called"); From 224cac988e0bd275265fcf5934dc1e7ec897a815 Mon Sep 17 00:00:00 2001 From: ivchodev Date: Tue, 26 Mar 2024 18:37:35 +0100 Subject: [PATCH 050/165] revert fd1ec51496917ee656e9405826d3d26444b2a04c revert try 2 fix clang --- .../backend/glsl/emit_glsl_context_get_set.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp index 554acafadc..ec35f71f87 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp @@ -428,7 +428,7 @@ void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) { break; case Stage::Geometry: ctx.AddU32("{}=uint({}<<16);", inst, - InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); + InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); break; default: LOG_WARNING(Shader, "(STUBBED) called"); From 9b77efe2b43ef8d93e895ceec5ba416843cc1bf8 Mon Sep 17 00:00:00 2001 From: ivchodev Date: Tue, 26 Mar 2024 18:37:54 +0100 Subject: [PATCH 051/165] revert eb306775c616c4ba6db5fadafd19b509ae16f709 revert fix clong format --- .../backend/glasm/emit_glasm_context_get_set.cpp | 2 +- src/shader_recompiler/backend/glasm/glasm_emit_context.h | 2 +- .../backend/glsl/emit_glsl_context_get_set.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp index f96bcc7097..75c89ebd02 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp @@ -408,7 +408,7 @@ void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) { break; case Stage::Geometry: ctx.Add("SHL.U {}.x,{},16;", inst, - InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); + InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); break; default: LOG_WARNING(Shader, "(STUBBED) called"); diff --git a/src/shader_recompiler/backend/glasm/glasm_emit_context.h b/src/shader_recompiler/backend/glasm/glasm_emit_context.h index 912fd53db4..b4d66ea559 100644 --- a/src/shader_recompiler/backend/glasm/glasm_emit_context.h +++ b/src/shader_recompiler/backend/glasm/glasm_emit_context.h @@ -10,8 +10,8 @@ #include #include "shader_recompiler/backend/glasm/reg_alloc.h" -#include "shader_recompiler/runtime_info.h" #include "shader_recompiler/stage.h" +#include "shader_recompiler/runtime_info.h" namespace Shader { struct Info; diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp index ec35f71f87..35d99bad3e 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp @@ -428,7 +428,7 @@ void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) { break; case Stage::Geometry: ctx.AddU32("{}=uint({}<<16);", inst, - InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); + InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); break; default: LOG_WARNING(Shader, "(STUBBED) called"); From 09578d522b203458d8196001bc5130de8c4e619a Mon Sep 17 00:00:00 2001 From: ivchodev Date: Tue, 26 Mar 2024 18:38:52 +0100 Subject: [PATCH 052/165] revert 925ce2fad34aeb890103d52ea50c151a94fdcd1f Reverting potentially plagiarized code. The developer team did not sign off on this commit. --- .../glasm/emit_glasm_context_get_set.cpp | 4 ---- .../backend/glasm/glasm_emit_context.h | 1 - .../backend/glsl/emit_glsl_context_get_set.cpp | 4 ---- .../spirv/emit_spirv_context_get_set.cpp | 2 -- src/shader_recompiler/runtime_info.h | 18 ------------------ 5 files changed, 29 deletions(-) diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp index 75c89ebd02..c7d7d5fefb 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp @@ -406,10 +406,6 @@ void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) { case Stage::TessellationEval: ctx.Add("SHL.U {}.x,primitive.vertexcount,16;", inst); break; - case Stage::Geometry: - ctx.Add("SHL.U {}.x,{},16;", inst, - InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); - break; default: LOG_WARNING(Shader, "(STUBBED) called"); ctx.Add("MOV.S {}.x,0x00ff0000;", inst); diff --git a/src/shader_recompiler/backend/glasm/glasm_emit_context.h b/src/shader_recompiler/backend/glasm/glasm_emit_context.h index b4d66ea559..a81d64a9e4 100644 --- a/src/shader_recompiler/backend/glasm/glasm_emit_context.h +++ b/src/shader_recompiler/backend/glasm/glasm_emit_context.h @@ -11,7 +11,6 @@ #include "shader_recompiler/backend/glasm/reg_alloc.h" #include "shader_recompiler/stage.h" -#include "shader_recompiler/runtime_info.h" namespace Shader { struct Info; diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp index 35d99bad3e..2e369ed723 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp @@ -426,10 +426,6 @@ void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) { case Stage::TessellationEval: ctx.AddU32("{}=uint(gl_PatchVerticesIn)<<16;", inst); break; - case Stage::Geometry: - ctx.AddU32("{}=uint({}<<16);", inst, - InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); - break; default: LOG_WARNING(Shader, "(STUBBED) called"); ctx.AddU32("{}=uint(0x00ff0000);", inst); diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp index 2e7643fe9a..feca5105f9 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp @@ -549,8 +549,6 @@ Id EmitInvocationInfo(EmitContext& ctx) { case Stage::TessellationEval: return ctx.OpShiftLeftLogical(ctx.U32[1], ctx.OpLoad(ctx.U32[1], ctx.patch_vertices_in), ctx.Const(16u)); - case Stage::Geometry: - return ctx.Const(InputTopologyVertices::vertices(ctx.runtime_info.input_topology) << 16); default: LOG_WARNING(Shader, "(STUBBED) called"); return ctx.Const(0x00ff0000u); diff --git a/src/shader_recompiler/runtime_info.h b/src/shader_recompiler/runtime_info.h index dc54d932a6..619c0b1387 100644 --- a/src/shader_recompiler/runtime_info.h +++ b/src/shader_recompiler/runtime_info.h @@ -30,24 +30,6 @@ enum class InputTopology { TrianglesAdjacency, }; -struct InputTopologyVertices { - static u32 vertices(InputTopology input_topology) { - switch (input_topology) { - case InputTopology::Lines: - return 2; - case InputTopology::LinesAdjacency: - return 4; - case InputTopology::Triangles: - return 3; - case InputTopology::TrianglesAdjacency: - return 6; - case InputTopology::Points: - default: - return 1; - } - } -}; - enum class CompareFunction { Never, Less, From b3e989343dd0702e302af8c38d413cd5037eb38c Mon Sep 17 00:00:00 2001 From: Jarrod Norwell Date: Sat, 23 Mar 2024 11:53:26 +0800 Subject: [PATCH 053/165] Added support for Princess Peach: Showtime! --- .../glasm/emit_glasm_context_get_set.cpp | 5 +++++ .../backend/glsl/emit_glsl_context_get_set.cpp | 4 ++++ .../spirv/emit_spirv_context_get_set.cpp | 2 ++ src/shader_recompiler/runtime_info.h | 18 ++++++++++++++++++ 4 files changed, 29 insertions(+) diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp index c7d7d5fefb..6820d4d985 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp @@ -7,6 +7,7 @@ #include "shader_recompiler/backend/glasm/glasm_emit_context.h" #include "shader_recompiler/frontend/ir/value.h" #include "shader_recompiler/profile.h" +#include "shader_recompiler/runtime_info.h" #include "shader_recompiler/shader_info.h" namespace Shader::Backend::GLASM { @@ -406,6 +407,10 @@ void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) { case Stage::TessellationEval: ctx.Add("SHL.U {}.x,primitive.vertexcount,16;", inst); break; + case Stage::Geometry: + ctx.Add("SHL.U {}.x,{},16;", inst, + InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); + break; default: LOG_WARNING(Shader, "(STUBBED) called"); ctx.Add("MOV.S {}.x,0x00ff0000;", inst); diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp index 2e369ed723..f964c25507 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp @@ -426,6 +426,10 @@ void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) { case Stage::TessellationEval: ctx.AddU32("{}=uint(gl_PatchVerticesIn)<<16;", inst); break; + case Stage::Geometry: + ctx.AddU32("{}=uint({}<<16);", inst, + InputTopologyVertices::vertices(ctx.runtime_info.input_topology)); + break; default: LOG_WARNING(Shader, "(STUBBED) called"); ctx.AddU32("{}=uint(0x00ff0000);", inst); diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp index feca5105f9..2e7643fe9a 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp @@ -549,6 +549,8 @@ Id EmitInvocationInfo(EmitContext& ctx) { case Stage::TessellationEval: return ctx.OpShiftLeftLogical(ctx.U32[1], ctx.OpLoad(ctx.U32[1], ctx.patch_vertices_in), ctx.Const(16u)); + case Stage::Geometry: + return ctx.Const(InputTopologyVertices::vertices(ctx.runtime_info.input_topology) << 16); default: LOG_WARNING(Shader, "(STUBBED) called"); return ctx.Const(0x00ff0000u); diff --git a/src/shader_recompiler/runtime_info.h b/src/shader_recompiler/runtime_info.h index 619c0b1387..dc54d932a6 100644 --- a/src/shader_recompiler/runtime_info.h +++ b/src/shader_recompiler/runtime_info.h @@ -30,6 +30,24 @@ enum class InputTopology { TrianglesAdjacency, }; +struct InputTopologyVertices { + static u32 vertices(InputTopology input_topology) { + switch (input_topology) { + case InputTopology::Lines: + return 2; + case InputTopology::LinesAdjacency: + return 4; + case InputTopology::Triangles: + return 3; + case InputTopology::TrianglesAdjacency: + return 6; + case InputTopology::Points: + default: + return 1; + } + } +}; + enum class CompareFunction { Never, Less, From db647d915d575a995f9ba9a92489042e20ea5283 Mon Sep 17 00:00:00 2001 From: Lucas Clemente Vella Date: Wed, 27 Mar 2024 01:26:35 +0000 Subject: [PATCH 054/165] Including sudachi Emulator Project as a copyright owner. To the files where sudachi changes were ported into in the parent commit. --- .../backend/glasm/emit_glasm_context_get_set.cpp | 2 +- .../backend/glsl/emit_glsl_context_get_set.cpp | 2 +- .../backend/spirv/emit_spirv_context_get_set.cpp | 2 +- src/shader_recompiler/runtime_info.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp index 6820d4d985..d4a6d7f9ad 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project, 2024 sudachi Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp index f964c25507..44ce3242a5 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project, 2024 sudachi Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp index 2e7643fe9a..adec9fa46f 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project, 2024 sudachi Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/shader_recompiler/runtime_info.h b/src/shader_recompiler/runtime_info.h index dc54d932a6..f49c1bdda1 100644 --- a/src/shader_recompiler/runtime_info.h +++ b/src/shader_recompiler/runtime_info.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project, 2024 sudachi Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once From 876d7f90b60e3fed88b6ae8eb2720f1f9a02306c Mon Sep 17 00:00:00 2001 From: Kelebek1 Date: Mon, 25 Mar 2024 19:16:08 +0100 Subject: [PATCH 055/165] Add option to log synchronously, add tooltip to log filter. --- src/common/logging/backend.cpp | 21 +++++++++++++++----- src/common/logging/filter.cpp | 1 + src/common/settings.h | 1 + src/suyu/configuration/configure_debug.cpp | 2 ++ src/suyu/configuration/configure_debug.ui | 23 +++++++++++++++++++++- 5 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp index fd16197749..2cdd6cf06a 100644 --- a/src/common/logging/backend.cpp +++ b/src/common/logging/backend.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -231,8 +232,15 @@ public: if (!filter.CheckMessage(log_class, log_level)) { return; } - message_queue.EmplaceWait( - CreateEntry(log_class, log_level, filename, line_num, function, std::move(message))); + + auto entry = + CreateEntry(log_class, log_level, filename, line_num, function, std::move(message)); + if (Settings::values.log_async) { + message_queue.EmplaceWait(entry); + } else { + std::scoped_lock l{sync_mutex}; + ForEachBackend([&entry](Backend& backend) { backend.Write(entry); }); + } } private: @@ -313,6 +321,7 @@ private: #endif MPSCQueue message_queue{}; + std::mutex sync_mutex; std::chrono::steady_clock::time_point time_origin{std::chrono::steady_clock::now()}; std::jthread backend_thread; }; @@ -345,9 +354,11 @@ void SetColorConsoleBackendEnabled(bool enabled) { void FmtLogMessageImpl(Class log_class, Level log_level, const char* filename, unsigned int line_num, const char* function, fmt::string_view format, const fmt::format_args& args) { - if (!initialization_in_progress_suppress_logging) { - Impl::Instance().PushEntry(log_class, log_level, filename, line_num, function, - fmt::vformat(format, args)); + if (initialization_in_progress_suppress_logging) { + return; } + + Impl::Instance().PushEntry(log_class, log_level, filename, line_num, function, + fmt::vformat(format, args)); } } // namespace Common::Log diff --git a/src/common/logging/filter.cpp b/src/common/logging/filter.cpp index 4e3a614a45..c16f4df3aa 100644 --- a/src/common/logging/filter.cpp +++ b/src/common/logging/filter.cpp @@ -171,6 +171,7 @@ const char* GetLogClassName(Class log_class) { #define SUB(x, y) \ case Class::x##_##y: \ return #x "." #y; +// return #x "_" #y; ALL_LOG_CLASSES() #undef CLS #undef SUB diff --git a/src/common/settings.h b/src/common/settings.h index 48f127bde8..829759c94b 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -604,6 +604,7 @@ struct Values { // Miscellaneous Setting log_filter{linkage, "*:Info", "log_filter", Category::Miscellaneous}; + Setting log_async{linkage, true, "log_async", Category::Miscellaneous}; Setting use_dev_keys{linkage, false, "use_dev_keys", Category::Miscellaneous}; // Network diff --git a/src/suyu/configuration/configure_debug.cpp b/src/suyu/configuration/configure_debug.cpp index b4fa4eca09..6f9bb36340 100644 --- a/src/suyu/configuration/configure_debug.cpp +++ b/src/suyu/configuration/configure_debug.cpp @@ -73,6 +73,7 @@ void ConfigureDebug::SetConfiguration() { ui->disable_loop_safety_checks->setChecked( Settings::values.disable_shader_loop_safety_checks.GetValue()); ui->extended_logging->setChecked(Settings::values.extended_logging.GetValue()); + ui->log_async->setChecked(Settings::values.log_async.GetValue()); ui->perform_vulkan_check->setChecked(Settings::values.perform_vulkan_check.GetValue()); #ifdef SUYU_USE_QT_WEB_ENGINE @@ -115,6 +116,7 @@ void ConfigureDebug::ApplyConfiguration() { Common::Log::Filter filter; filter.ParseFilterString(Settings::values.log_filter.GetValue()); Common::Log::SetGlobalFilter(filter); + Settings::values.log_async = ui->log_async->isChecked(); } void ConfigureDebug::changeEvent(QEvent* event) { diff --git a/src/suyu/configuration/configure_debug.ui b/src/suyu/configuration/configure_debug.ui index ed48b2f8f6..e5b76290e6 100644 --- a/src/suyu/configuration/configure_debug.ui +++ b/src/suyu/configuration/configure_debug.ui @@ -164,6 +164,20 @@ + + + + true + + + When checked, logging will run asynchronously. This may cut the log on crashes. +When unchecked, logging will run synchronously. This will slow down the emulator, but allow all logs to be written. Useful for debugging. + + + Log asynchronously + + + @@ -199,7 +213,14 @@ - + + + Log filter in the form <class>:<level>. +Separate multiple filters with a space. +Levels: Trace, Debug, Info, Warning, Error, Critical +Classes: See Common/logging/types.h + + From 040893da00a4d42f973756e26c7f94213d4d7685 Mon Sep 17 00:00:00 2001 From: ilonachan Date: Mon, 25 Mar 2024 19:25:11 +0100 Subject: [PATCH 056/165] formatting --- src/common/logging/filter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/logging/filter.cpp b/src/common/logging/filter.cpp index c16f4df3aa..ae866c7a50 100644 --- a/src/common/logging/filter.cpp +++ b/src/common/logging/filter.cpp @@ -171,7 +171,7 @@ const char* GetLogClassName(Class log_class) { #define SUB(x, y) \ case Class::x##_##y: \ return #x "." #y; -// return #x "_" #y; + // return #x "_" #y; ALL_LOG_CLASSES() #undef CLS #undef SUB From ce8f3e802edc216caebfdee40d589f13e8714598 Mon Sep 17 00:00:00 2001 From: Fijxu Date: Fri, 29 Mar 2024 01:04:51 -0300 Subject: [PATCH 057/165] Use proper SPDX-FileCopyrightText for Sudachi. Corrects db647d915d --- .../backend/glasm/emit_glasm_context_get_set.cpp | 3 ++- .../backend/glsl/emit_glsl_context_get_set.cpp | 3 ++- .../backend/spirv/emit_spirv_context_get_set.cpp | 3 ++- src/shader_recompiler/runtime_info.h | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp index d4a6d7f9ad..480649cc82 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp @@ -1,4 +1,5 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project, 2024 sudachi Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project +// SPDX-FileCopyrightText: 2024 sudachi Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp index 44ce3242a5..3c0c19961d 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp @@ -1,4 +1,5 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project, 2024 sudachi Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project +// SPDX-FileCopyrightText: 2024 sudachi Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp index adec9fa46f..5d428d2d68 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp @@ -1,4 +1,5 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project, 2024 sudachi Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project +// SPDX-FileCopyrightText: 2024 sudachi Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include diff --git a/src/shader_recompiler/runtime_info.h b/src/shader_recompiler/runtime_info.h index f49c1bdda1..f9ac9fbb42 100644 --- a/src/shader_recompiler/runtime_info.h +++ b/src/shader_recompiler/runtime_info.h @@ -1,4 +1,5 @@ -// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project, 2024 sudachi Emulator Project +// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project +// SPDX-FileCopyrightText: 2024 sudachi Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once From 36ede797f3dd48c854021a12349b205366439f0c Mon Sep 17 00:00:00 2001 From: Lucas Clemente Vella Date: Sat, 23 Mar 2024 23:46:02 +0000 Subject: [PATCH 058/165] Vulkan validation error fix. Different image usage flags between image creation and image view creation. --- .../renderer_vulkan/vk_texture_cache.cpp | 14 +++++++------- .../renderer_vulkan/vk_texture_cache.h | 15 +++++++++++---- .../vulkan_common/vulkan_memory_allocator.cpp | 2 +- src/video_core/vulkan_common/vulkan_wrapper.h | 17 ++++++++++++----- 4 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 8909c77af3..24853ebb9e 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -1406,7 +1406,7 @@ Image::Image(TextureCacheRuntime& runtime_, const ImageInfo& info_, GPUVAddr gpu if (runtime->device.HasDebuggingToolAttached()) { original_image.SetObjectNameEXT(VideoCommon::Name(*this).c_str()); } - current_image = *original_image; + current_image = &Image::original_image; storage_image_views.resize(info.resources.levels); if (IsPixelFormatASTC(info.format) && !runtime->device.IsOptimalAstcSupported() && Settings::values.astc_recompression.GetValue() == @@ -1550,8 +1550,8 @@ VkImageView Image::StorageImageView(s32 level) noexcept { if (!view) { const auto format_info = MaxwellToVK::SurfaceFormat(runtime->device, FormatType::Optimal, true, info.format); - view = - MakeStorageView(runtime->device.GetLogical(), level, current_image, format_info.format); + view = MakeStorageView(runtime->device.GetLogical(), level, *(this->*current_image), + format_info.format); } return *view; } @@ -1582,7 +1582,7 @@ bool Image::ScaleUp(bool ignore) { runtime->ViewFormats(info.format)); ignore = false; } - current_image = *scaled_image; + current_image = &Image::scaled_image; if (ignore) { return true; } @@ -1607,7 +1607,7 @@ bool Image::ScaleDown(bool ignore) { } ASSERT(info.type != ImageType::Linear); flags &= ~ImageFlagBits::Rescaled; - current_image = *original_image; + current_image = &Image::original_image; if (ignore) { return true; } @@ -1726,7 +1726,7 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI const VkImageViewUsageCreateInfo image_view_usage{ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, .pNext = nullptr, - .usage = ImageUsageFlags(format_info, format), + .usage = image.UsageFlags(), }; const VkImageViewCreateInfo create_info{ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, @@ -2087,4 +2087,4 @@ void TextureCacheRuntime::TransitionImageLayout(Image& image) { } } -} // namespace Vulkan \ No newline at end of file +} // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h index 8501ec384b..4161d7ff92 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.h +++ b/src/video_core/renderer_vulkan/vk_texture_cache.h @@ -24,7 +24,6 @@ using Common::SlotVector; using VideoCommon::ImageId; using VideoCommon::NUM_RT; using VideoCommon::Region2D; -using VideoCommon::RenderTargets; using VideoCore::Surface::PixelFormat; class BlitImageHelper; @@ -157,13 +156,17 @@ public: std::span copies); [[nodiscard]] VkImage Handle() const noexcept { - return current_image; + return *(this->*current_image); } [[nodiscard]] VkImageAspectFlags AspectMask() const noexcept { return aspect_mask; } + [[nodiscard]] VkImageUsageFlags UsageFlags() const noexcept { + return (this->*current_image).UsageFlags(); + } + /// Returns true when the image is already initialized and mark it as initialized [[nodiscard]] bool ExchangeInitialization() noexcept { return std::exchange(initialized, true); @@ -186,11 +189,15 @@ private: TextureCacheRuntime* runtime{}; vk::Image original_image; + vk::Image scaled_image; + + // Use a pointer to field because it is relative, so that the object can be + // moved without breaking the reference. + vk::Image Image::*current_image{}; + std::vector storage_image_views; VkImageAspectFlags aspect_mask = 0; bool initialized = false; - vk::Image scaled_image{}; - VkImage current_image{}; std::unique_ptr scale_framebuffer; std::unique_ptr scale_view; diff --git a/src/video_core/vulkan_common/vulkan_memory_allocator.cpp b/src/video_core/vulkan_common/vulkan_memory_allocator.cpp index 8f4a57e3ca..54331688e3 100644 --- a/src/video_core/vulkan_common/vulkan_memory_allocator.cpp +++ b/src/video_core/vulkan_common/vulkan_memory_allocator.cpp @@ -247,7 +247,7 @@ vk::Image MemoryAllocator::CreateImage(const VkImageCreateInfo& ci) const { vk::Check(vmaCreateImage(allocator, &ci, &alloc_ci, &handle, &allocation, nullptr)); - return vk::Image(handle, *device.GetLogical(), allocator, allocation, + return vk::Image(handle, ci.usage, *device.GetLogical(), allocator, allocation, device.GetDispatchLoader()); } diff --git a/src/video_core/vulkan_common/vulkan_wrapper.h b/src/video_core/vulkan_common/vulkan_wrapper.h index 757f3c8afb..1bb8a47bdf 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.h +++ b/src/video_core/vulkan_common/vulkan_wrapper.h @@ -623,9 +623,10 @@ public: class Image { public: - explicit Image(VkImage handle_, VkDevice owner_, VmaAllocator allocator_, - VmaAllocation allocation_, const DeviceDispatch& dld_) noexcept - : handle{handle_}, owner{owner_}, allocator{allocator_}, + explicit Image(VkImage handle_, VkImageUsageFlags usage_, VkDevice owner_, + VmaAllocator allocator_, VmaAllocation allocation_, + const DeviceDispatch& dld_) noexcept + : handle{handle_}, usage{usage_}, owner{owner_}, allocator{allocator_}, allocation{allocation_}, dld{&dld_} {} Image() = default; @@ -633,12 +634,13 @@ public: Image& operator=(const Image&) = delete; Image(Image&& rhs) noexcept - : handle{std::exchange(rhs.handle, nullptr)}, owner{rhs.owner}, allocator{rhs.allocator}, - allocation{rhs.allocation}, dld{rhs.dld} {} + : handle{std::exchange(rhs.handle, nullptr)}, usage{rhs.usage}, owner{rhs.owner}, + allocator{rhs.allocator}, allocation{rhs.allocation}, dld{rhs.dld} {} Image& operator=(Image&& rhs) noexcept { Release(); handle = std::exchange(rhs.handle, nullptr); + usage = rhs.usage; owner = rhs.owner; allocator = rhs.allocator; allocation = rhs.allocation; @@ -665,10 +667,15 @@ public: void SetObjectNameEXT(const char* name) const; + [[nodiscard]] VkImageUsageFlags UsageFlags() const noexcept { + return usage; + } + private: void Release() const noexcept; VkImage handle = nullptr; + VkImageUsageFlags usage{}; VkDevice owner = nullptr; VmaAllocator allocator = nullptr; VmaAllocation allocation = nullptr; From b5c02fe14a0739add8e7ee0553280f2cd15a8704 Mon Sep 17 00:00:00 2001 From: zqpvr01 Date: Fri, 29 Mar 2024 17:31:07 +0100 Subject: [PATCH 059/165] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 6334f02b2c..2e76388ba5 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,9 @@ It is written in C++ with portability in mind, and we're actively working on bui Pipelines

+## Hardware Requirements +[Click here to see the Hardware Requirements](https://git.suyu.dev/suyu/suyu/wiki/Hardware-Requirements) + ## Status Although we're able to make builds, we don't have a version ready for distribution yet. But we can always use more help! You can make a merge request if you'd like to see something changed, or you can [chat with other developers to find out what needs work](https://discord.gg/suyu). From 9e223759e0e804514c318f282038fc0e12c8a180 Mon Sep 17 00:00:00 2001 From: zqpvr01 Date: Fri, 29 Mar 2024 19:18:38 +0100 Subject: [PATCH 060/165] Add img --- img | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 img diff --git a/img b/img new file mode 100644 index 0000000000..e69de29bb2 From 2a672fac30cd3a7b578088c02795d641ccbc93c8 Mon Sep 17 00:00:00 2001 From: zqpvr01 Date: Fri, 29 Mar 2024 19:19:11 +0100 Subject: [PATCH 061/165] revert 9e223759e0e804514c318f282038fc0e12c8a180 revert Add img --- img | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 img diff --git a/img b/img deleted file mode 100644 index e69de29bb2..0000000000 From 444a200eef33193403ab8d1ec3ee81742f611156 Mon Sep 17 00:00:00 2001 From: zqpvr01 Date: Fri, 29 Mar 2024 19:19:28 +0100 Subject: [PATCH 062/165] Upload files to "img" --- img/maximum-clocks.png | Bin 0 -> 30758 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/maximum-clocks.png diff --git a/img/maximum-clocks.png b/img/maximum-clocks.png new file mode 100644 index 0000000000000000000000000000000000000000..0353c0bf83796ea720b4841784e90595142e6637 GIT binary patch literal 30758 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 XQCfY7gzR62=+q4No9rvlBVYM{Sf;j4 literal 0 HcmV?d00001 From 66cf0c1b0c9452637266f4faf7077fd5d2daa88d Mon Sep 17 00:00:00 2001 From: Hustler One Date: Mon, 25 Mar 2024 20:48:12 +0100 Subject: [PATCH 063/165] Clarify that we indeed have builds Cherry-picked from #65 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2e76388ba5..3448576d3f 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ It is written in C++ with portability in mind, and we're actively working on bui ## Status -Although we're able to make builds, we don't have a version ready for distribution yet. But we can always use more help! You can make a merge request if you'd like to see something changed, or you can [chat with other developers to find out what needs work](https://discord.gg/suyu). +We currently have builds over at the [Releases](https://git.suyu.dev/suyu/suyu/releases) page. **Note**: We try to update this README whenever we can, but some links might be broken, and some information may be outdated or irrelevant. From ba3539c5179913fd32f172d4002cb47b775ddb57 Mon Sep 17 00:00:00 2001 From: Fijxu Date: Fri, 29 Mar 2024 21:31:40 -0300 Subject: [PATCH 064/165] Use CC0-1.0 for images under ./img --- .reuse/dep5 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.reuse/dep5 b/.reuse/dep5 index b39bc42fb7..baf1354bf6 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -180,3 +180,7 @@ License: GPL-3.0-or-later Files: dist/icns_generator.sh Copyright: 2024 suyu Emulator Project License: GPL-3.0-or-later + +Files: img/* +Copyright: 2024 suyu Emulator Project +License: CC0-1.0 From 48e86d6e84c0027ccade556e90fef170c7e3d803 Mon Sep 17 00:00:00 2001 From: Lucas Clemente Vella Date: Sat, 30 Mar 2024 15:13:23 +0000 Subject: [PATCH 065/165] Fixes issue #94: setting Vulkan::Headers before Qt6 can do it --- CMakeLists.txt | 126 +++++++++++++++++++++++++------------------------ 1 file changed, 64 insertions(+), 62 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 42e8615e57..9406dd64a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -396,7 +396,71 @@ function(set_suyu_qt_components) set(SUYU_QT_COMPONENTS ${SUYU_QT_COMPONENTS2} PARENT_SCOPE) endfunction(set_suyu_qt_components) +# find SDL2 exports a bunch of variables that are needed, so its easier to do this outside of the suyu_find_package +if (ENABLE_SDL2) + if (SUYU_USE_BUNDLED_SDL2) + # Detect toolchain and platform + if ((MSVC_VERSION GREATER_EQUAL 1920 AND MSVC_VERSION LESS 1940) AND ARCHITECTURE_x86_64) + set(SDL2_VER "SDL2-2.28.2") + else() + message(FATAL_ERROR "No bundled SDL2 binaries for your toolchain. Disable SUYU_USE_BUNDLED_SDL2 and provide your own.") + endif() + + if (DEFINED SDL2_VER) + download_bundled_external("sdl2/" ${SDL2_VER} SDL2_PREFIX) + endif() + + set(SDL2_FOUND YES) + set(SDL2_INCLUDE_DIR "${SDL2_PREFIX}/include" CACHE PATH "Path to SDL2 headers") + set(SDL2_LIBRARY "${SDL2_PREFIX}/lib/x64/SDL2.lib" CACHE PATH "Path to SDL2 library") + set(SDL2_DLL_DIR "${SDL2_PREFIX}/lib/x64/" CACHE PATH "Path to SDL2.dll") + + add_library(SDL2::SDL2 INTERFACE IMPORTED) + target_link_libraries(SDL2::SDL2 INTERFACE "${SDL2_LIBRARY}") + target_include_directories(SDL2::SDL2 INTERFACE "${SDL2_INCLUDE_DIR}") + elseif (SUYU_USE_EXTERNAL_SDL2) + message(STATUS "Using SDL2 from externals.") + else() + find_package(SDL2 2.26.4 REQUIRED) + endif() +endif() + +# List of all FFmpeg components required +set(FFmpeg_COMPONENTS + avcodec + avfilter + avutil + swscale) + +if (UNIX AND NOT APPLE AND NOT ANDROID) + find_package(PkgConfig REQUIRED) + pkg_check_modules(LIBVA libva) +endif() +if (NOT SUYU_USE_BUNDLED_FFMPEG) + # Use system installed FFmpeg + find_package(FFmpeg 4.3 REQUIRED QUIET COMPONENTS ${FFmpeg_COMPONENTS}) +endif() + +if (WIN32 AND SUYU_CRASH_DUMPS) + set(BREAKPAD_VER "breakpad-c89f9dd") + download_bundled_external("breakpad/" ${BREAKPAD_VER} BREAKPAD_PREFIX) + + set(BREAKPAD_CLIENT_INCLUDE_DIR "${BREAKPAD_PREFIX}/include") + set(BREAKPAD_CLIENT_LIBRARY "${BREAKPAD_PREFIX}/lib/libbreakpad_client.lib") + + add_library(libbreakpad_client INTERFACE IMPORTED) + target_link_libraries(libbreakpad_client INTERFACE "${BREAKPAD_CLIENT_LIBRARY}") + target_include_directories(libbreakpad_client INTERFACE "${BREAKPAD_CLIENT_INCLUDE_DIR}") +endif() + +# Prefer the -pthread flag on Linux. +set(THREADS_PREFER_PTHREAD_FLAG ON) +find_package(Threads REQUIRED) + +add_subdirectory(externals) + # Qt5 requires that we find components, so it doesn't fit our pretty little find package function +# Qt6 sets Vulkan::Headers, so Qt search has to come after externals, so it doesn't get to do it. if(ENABLE_QT) set(QT_VERSION 5.15) # These are used to specify minimum versions @@ -535,67 +599,6 @@ if(ENABLE_QT) endif() -# find SDL2 exports a bunch of variables that are needed, so its easier to do this outside of the suyu_find_package -if (ENABLE_SDL2) - if (SUYU_USE_BUNDLED_SDL2) - # Detect toolchain and platform - if ((MSVC_VERSION GREATER_EQUAL 1920 AND MSVC_VERSION LESS 1940) AND ARCHITECTURE_x86_64) - set(SDL2_VER "SDL2-2.28.2") - else() - message(FATAL_ERROR "No bundled SDL2 binaries for your toolchain. Disable SUYU_USE_BUNDLED_SDL2 and provide your own.") - endif() - - if (DEFINED SDL2_VER) - download_bundled_external("sdl2/" ${SDL2_VER} SDL2_PREFIX) - endif() - - set(SDL2_FOUND YES) - set(SDL2_INCLUDE_DIR "${SDL2_PREFIX}/include" CACHE PATH "Path to SDL2 headers") - set(SDL2_LIBRARY "${SDL2_PREFIX}/lib/x64/SDL2.lib" CACHE PATH "Path to SDL2 library") - set(SDL2_DLL_DIR "${SDL2_PREFIX}/lib/x64/" CACHE PATH "Path to SDL2.dll") - - add_library(SDL2::SDL2 INTERFACE IMPORTED) - target_link_libraries(SDL2::SDL2 INTERFACE "${SDL2_LIBRARY}") - target_include_directories(SDL2::SDL2 INTERFACE "${SDL2_INCLUDE_DIR}") - elseif (SUYU_USE_EXTERNAL_SDL2) - message(STATUS "Using SDL2 from externals.") - else() - find_package(SDL2 2.26.4 REQUIRED) - endif() -endif() - -# List of all FFmpeg components required -set(FFmpeg_COMPONENTS - avcodec - avfilter - avutil - swscale) - -if (UNIX AND NOT APPLE AND NOT ANDROID) - find_package(PkgConfig REQUIRED) - pkg_check_modules(LIBVA libva) -endif() -if (NOT SUYU_USE_BUNDLED_FFMPEG) - # Use system installed FFmpeg - find_package(FFmpeg 4.3 REQUIRED QUIET COMPONENTS ${FFmpeg_COMPONENTS}) -endif() - -if (WIN32 AND SUYU_CRASH_DUMPS) - set(BREAKPAD_VER "breakpad-c89f9dd") - download_bundled_external("breakpad/" ${BREAKPAD_VER} BREAKPAD_PREFIX) - - set(BREAKPAD_CLIENT_INCLUDE_DIR "${BREAKPAD_PREFIX}/include") - set(BREAKPAD_CLIENT_LIBRARY "${BREAKPAD_PREFIX}/lib/libbreakpad_client.lib") - - add_library(libbreakpad_client INTERFACE IMPORTED) - target_link_libraries(libbreakpad_client INTERFACE "${BREAKPAD_CLIENT_LIBRARY}") - target_include_directories(libbreakpad_client INTERFACE "${BREAKPAD_CLIENT_INCLUDE_DIR}") -endif() - -# Prefer the -pthread flag on Linux. -set(THREADS_PREFER_PTHREAD_FLAG ON) -find_package(Threads REQUIRED) - # Platform-specific library requirements # ====================================== @@ -710,7 +713,6 @@ if (SUYU_USE_FASTER_LD AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU") endif() endif() -add_subdirectory(externals) add_subdirectory(src) # Set suyu project or suyu-cmd project as default StartUp Project in Visual Studio depending on whether QT is enabled or not From 39eea71e62535c72eef0b41b35c5305f86df4971 Mon Sep 17 00:00:00 2001 From: Exverge Date: Sun, 24 Mar 2024 19:51:18 -0400 Subject: [PATCH 066/165] fix: resume application when library applets are closed --- .../am/service/library_applet_accessor.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/core/hle/service/am/service/library_applet_accessor.cpp b/src/core/hle/service/am/service/library_applet_accessor.cpp index cda8c3eb87..b7ea464ff2 100644 --- a/src/core/hle/service/am/service/library_applet_accessor.cpp +++ b/src/core/hle/service/am/service/library_applet_accessor.cpp @@ -1,4 +1,5 @@ // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-FileCopyrightText: Copyright 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "core/hle/service/am/applet_data_broker.h" @@ -101,6 +102,22 @@ Result ILibraryAppletAccessor::PushInData(SharedPointer storage) { Result ILibraryAppletAccessor::PopOutData(Out> out_storage) { LOG_DEBUG(Service_AM, "called"); + // suyu todo: move library applet fix to another function + // since this function is only called for applets that give a result, + // applets that don't (e.g. info applets in 1st party games) simply freeze + if (auto caller = m_applet->caller_applet.lock(); caller != nullptr) { + caller->SetInteractibleLocked(true); + + caller->lifecycle_manager.SetFocusState(FocusState::InFocus); + caller->lifecycle_manager.UpdateRequestedFocusState(); + + caller->lifecycle_manager.SetResumeNotificationEnabled(true); + caller->lifecycle_manager.RequestResumeNotification(); + caller->UpdateSuspensionStateLocked(true); + } else { + LOG_CRITICAL(Service_AM, "Caller applet pointer is invalid."); + LOG_CRITICAL(Service_AM, "The emulator will freeze!"); + } R_RETURN(m_broker->GetOutData().Pop(out_storage.Get())); } From 7215ac95437dd041fc402faf7daad6f995724f0b Mon Sep 17 00:00:00 2001 From: Belal Ashraf Date: Fri, 29 Mar 2024 13:41:34 +0100 Subject: [PATCH 067/165] Fix NROs crashing and loading infinitely --- src/core/hle/service/am/process_creation.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/hle/service/am/process_creation.cpp b/src/core/hle/service/am/process_creation.cpp index 237151d061..e6e2fad2c6 100644 --- a/src/core/hle/service/am/process_creation.cpp +++ b/src/core/hle/service/am/process_creation.cpp @@ -106,6 +106,7 @@ std::unique_ptr CreateApplicationProcess(std::vector& out_control, out_control = nacp.GetRawBytes(); } else { out_control.resize(sizeof(FileSys::RawNACP)); + memset(out_control.data(), 0, sizeof(u8) * out_control.size()); } auto& storage = system.GetContentProviderUnion(); From db9035cc352103718ad6c8fe16421afb8a1d2db5 Mon Sep 17 00:00:00 2001 From: BoomMicrophone Date: Sun, 31 Mar 2024 21:41:43 +0200 Subject: [PATCH 068/165] remove comment gpg timeout so i gotta coooooommit :D --- src/suyu/main.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index 5d0a46713d..03b427036d 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -1,9 +1,6 @@ // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -// Modified by palfaiate on <2024/03/07> -// Reverted palfaiate's changes on <2024/03/25> -Nine-Ball - #include #include #include From d09ab05c1b6127b8ffa23a6fc0a313dc13184aee Mon Sep 17 00:00:00 2001 From: BoomMicrophone Date: Sun, 31 Mar 2024 21:42:11 +0200 Subject: [PATCH 069/165] remove comment gotta coooooommit :D --- src/common/settings.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/common/settings.h b/src/common/settings.h index 3cc815bf27..98c3958c00 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -1,9 +1,6 @@ // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -// Modified by palfaiate on <2024/03/07> -// Reverted palfaiate's changes on <2024/03/25> -Nine-Ball - #pragma once #include From d3f67d1e9c7562026909a07cb53ea0f20c12a500 Mon Sep 17 00:00:00 2001 From: voidanix Date: Sat, 23 Mar 2024 23:25:52 +0100 Subject: [PATCH 070/165] Fix GCC builds with Debug build type When compiling with -DCMAKE_BUILD_TYPE=Debug, GCC would (correctly) fail to compile intrinsics in stb and host1x due to lack of optimizations. Sadly, the compilation error given is bogus and Clang completing the builds without issues does raise some eyebrows. Therefore, force optimizations for the offending files under GCC when creating Debug builds. Signed-off-by: voidanix --- src/common/CMakeLists.txt | 9 +++++++++ src/video_core/CMakeLists.txt | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index e97a415189..1d2e973841 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -240,6 +240,15 @@ if (MSVC) ) else() set_source_files_properties(stb.cpp PROPERTIES COMPILE_OPTIONS "-Wno-implicit-fallthrough;-Wno-missing-declarations;-Wno-missing-field-initializers") + + # Get around GCC failing with intrinsics in Debug + if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_BUILD_TYPE MATCHES "Debug") + set_property( + SOURCE stb.cpp + APPEND + PROPERTY COMPILE_OPTIONS ";-O2" + ) + endif() endif() if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index e5cd0278fa..0afa3d7036 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -425,6 +425,11 @@ else() # VMA set_source_files_properties(vulkan_common/vma.cpp PROPERTIES COMPILE_OPTIONS "-Wno-conversion;-Wno-unused-variable;-Wno-unused-parameter;-Wno-missing-field-initializers") + + # Get around GCC failing with intrinsics in Debug + if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_BUILD_TYPE MATCHES "Debug") + set_source_files_properties(host1x/vic.cpp PROPERTIES COMPILE_OPTIONS "-O2") + endif() endif() if (ARCHITECTURE_x86_64) From 4015b1d397c5beb1968497e1f8ab6238e743c972 Mon Sep 17 00:00:00 2001 From: Lucas Clemente Vella Date: Sun, 31 Mar 2024 13:40:04 +0100 Subject: [PATCH 071/165] Solves warning about GuestMemory having internal linkage. It is very hard to explain why this public interface class was defined in an anonymous namespace inside a header file. --- src/core/guest_memory.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/core/guest_memory.h b/src/core/guest_memory.h index 83292f7023..a753f51a4e 100644 --- a/src/core/guest_memory.h +++ b/src/core/guest_memory.h @@ -31,7 +31,6 @@ enum GuestMemoryFlags : u32 { UnsafeReadCachedWrite = UnsafeReadWrite | Cached, }; -namespace { template class GuestMemory { using iterator = T*; @@ -219,6 +218,5 @@ public: } } }; -} // namespace } // namespace Core::Memory From a3c8b296071ad22b37ef14af6f769ede528bc0f6 Mon Sep 17 00:00:00 2001 From: Nikilite Date: Thu, 28 Mar 2024 22:31:16 +0100 Subject: [PATCH 072/165] Updated the links for the Info Popup --- src/suyu/aboutdialog.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/suyu/aboutdialog.ui b/src/suyu/aboutdialog.ui index fc139fc066..d3ed825310 100644 --- a/src/suyu/aboutdialog.ui +++ b/src/suyu/aboutdialog.ui @@ -127,7 +127,7 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://gitlab.com/suyu-emu/suyu"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://discord.com/invite/2gQRBp44KT"><span style=" text-decoration: underline; color:#039be5;">Discord</span></a> | <a href="https://gitlab.com/suyu-emu/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/-/graphs/master"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/-/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://discord.com/invite/2gQRBp44KT"><span style=" text-decoration: underline; color:#039be5;">Discord</span></a> | <a href="https://git.suyu.dev/suyu/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.suyu.dev/suyu/suyu/src/branch/dev/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> true From 242114d86254004f14760c3ed63b6219a1dec7e1 Mon Sep 17 00:00:00 2001 From: zqpvr01 Date: Tue, 2 Apr 2024 15:24:51 +0200 Subject: [PATCH 073/165] Upload files to "/" --- daily-builds.png | Bin 0 -> 137839 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 daily-builds.png diff --git a/daily-builds.png b/daily-builds.png new file mode 100644 index 0000000000000000000000000000000000000000..9eb0653a05dd7dc8edc440c199d28786894d89ce GIT binary patch literal 137839 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

jnZgdwB2%p}607mt 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 literal 0 HcmV?d00001 From 1d4f0a78f631581c3d4578b8b493264a1ae7e3de Mon Sep 17 00:00:00 2001 From: zqpvr01 Date: Tue, 2 Apr 2024 15:25:09 +0200 Subject: [PATCH 074/165] revert 242114d86254004f14760c3ed63b6219a1dec7e1 revert Upload files to "/" --- daily-builds.png | Bin 137839 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 daily-builds.png diff --git a/daily-builds.png b/daily-builds.png deleted file mode 100644 index 9eb0653a05dd7dc8edc440c199d28786894d89ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137839 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

jnZgdwB2%p}607mt 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 From 8032d67619f60db47ea3cabef4e32eba62a3b3a1 Mon Sep 17 00:00:00 2001 From: zqpvr01 Date: Tue, 2 Apr 2024 15:25:23 +0200 Subject: [PATCH 075/165] Upload files to "img" --- img/daily-builds.png | Bin 0 -> 137839 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/daily-builds.png diff --git a/img/daily-builds.png b/img/daily-builds.png new file mode 100644 index 0000000000000000000000000000000000000000..9eb0653a05dd7dc8edc440c199d28786894d89ce GIT binary patch literal 137839 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

jnZgdwB2%p}607mt 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 literal 0 HcmV?d00001 From 715a3fc83bc41492d0bf1d8b9c26763f5c66b2e0 Mon Sep 17 00:00:00 2001 From: zqpvr01 Date: Tue, 2 Apr 2024 15:28:16 +0200 Subject: [PATCH 076/165] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3448576d3f..5538a9831e 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,8 @@ You can also contact any of the developers on Discord to learn more about the cu * __macOS__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __Android__: [Releases](https://git.suyu.dev/suyu/suyu/releases) -If you want daily builds then go here. https://git.suyu.dev/suyu/suyu/actions +If you want daily builds then [Click here](https://git.suyu.dev/suyu/suyu/actions) +If you don't know how to download the daily builds then [Click here](https://git.suyu.dev/suyu/suyu/raw/branch/dev/img/daily-builds.png) We have official builds [here.](https://git.suyu.dev/suyu/suyu/releases) If any website or person is claiming to have a build for suyu, take that with a grain of salt. From b911ac8516850b8e86e4479367b33bf81665bcac Mon Sep 17 00:00:00 2001 From: zqpvr01 Date: Tue, 2 Apr 2024 15:29:13 +0200 Subject: [PATCH 077/165] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5538a9831e..703b475e78 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,7 @@ You can also contact any of the developers on Discord to learn more about the cu If you want daily builds then [Click here](https://git.suyu.dev/suyu/suyu/actions) If you don't know how to download the daily builds then [Click here](https://git.suyu.dev/suyu/suyu/raw/branch/dev/img/daily-builds.png) +Right now we only have daily builds for Linux and Android. We have official builds [here.](https://git.suyu.dev/suyu/suyu/releases) If any website or person is claiming to have a build for suyu, take that with a grain of salt. From c889f1bd36c21a70f00c397815f5238725fd6e28 Mon Sep 17 00:00:00 2001 From: flodavid Date: Thu, 18 Jan 2024 20:51:39 +0000 Subject: [PATCH 078/165] Load custom Qt themes from yuzu data directory - Directory is qt_themes, each theme must be in one folder - It should contain a file "style.qss" - It may contain an "icons" sub-directory, to override included icons (with files like mytheme/icons/colorful/48x48/star.png for example) - Directories ending by "_dark" are reserved for dark variant icons. They are not listed as themes in the UI. - If theme directory contains "dark" or "midnight", theme will be considered dark --- src/common/fs/fs_paths.h | 3 +- src/common/fs/path_util.cpp | 3 +- src/common/fs/path_util.h | 3 +- src/suyu/configuration/configure_ui.cpp | 27 +++++++++-- src/suyu/configuration/qt_config.cpp | 11 ++--- src/suyu/debugger/wait_tree.cpp | 5 +- src/suyu/main.cpp | 64 +++++++++++++++++-------- src/suyu/main.h | 6 +++ src/suyu/uisettings.cpp | 19 ++++---- src/suyu/uisettings.h | 23 ++++----- 10 files changed, 102 insertions(+), 62 deletions(-) diff --git a/src/common/fs/fs_paths.h b/src/common/fs/fs_paths.h index 3720976efe..de06571a6f 100644 --- a/src/common/fs/fs_paths.h +++ b/src/common/fs/fs_paths.h @@ -15,6 +15,7 @@ #define CONFIG_DIR "config" #define CRASH_DUMPS_DIR "crash_dumps" #define DUMP_DIR "dump" +#define ICONS_DIR "icons" #define KEYS_DIR "keys" #define LOAD_DIR "load" #define LOG_DIR "log" @@ -24,7 +25,7 @@ #define SDMC_DIR "sdmc" #define SHADER_DIR "shader" #define TAS_DIR "tas" -#define ICONS_DIR "icons" +#define THEMES_DIR "qt_themes" // suyu-specific files diff --git a/src/common/fs/path_util.cpp b/src/common/fs/path_util.cpp index e23f53fb9d..9362e18c39 100644 --- a/src/common/fs/path_util.cpp +++ b/src/common/fs/path_util.cpp @@ -121,6 +121,7 @@ public: GenerateSuyuPath(SuyuPath::ConfigDir, suyu_path_config); GenerateSuyuPath(SuyuPath::CrashDumpsDir, suyu_path / CRASH_DUMPS_DIR); GenerateSuyuPath(SuyuPath::DumpDir, suyu_path / DUMP_DIR); + GenerateSuyuPath(SuyuPath::IconsDir, suyu_path / ICONS_DIR); GenerateSuyuPath(SuyuPath::KeysDir, suyu_path / KEYS_DIR); GenerateSuyuPath(SuyuPath::LoadDir, suyu_path / LOAD_DIR); GenerateSuyuPath(SuyuPath::LogDir, suyu_path / LOG_DIR); @@ -130,7 +131,7 @@ public: GenerateSuyuPath(SuyuPath::SDMCDir, suyu_path / SDMC_DIR); GenerateSuyuPath(SuyuPath::ShaderDir, suyu_path / SHADER_DIR); GenerateSuyuPath(SuyuPath::TASDir, suyu_path / TAS_DIR); - GenerateSuyuPath(SuyuPath::IconsDir, suyu_path / ICONS_DIR); + GenerateSuyuPath(SuyuPath::ThemesDir, suyu_path / THEMES_DIR); } private: diff --git a/src/common/fs/path_util.h b/src/common/fs/path_util.h index 2076fbcd43..1ac4a26eea 100644 --- a/src/common/fs/path_util.h +++ b/src/common/fs/path_util.h @@ -17,6 +17,7 @@ enum class SuyuPath { ConfigDir, // Where config files are stored. CrashDumpsDir, // Where crash dumps are stored. DumpDir, // Where dumped data is stored. + IconsDir, // Where Icons for Windows shortcuts are stored. KeysDir, // Where key files are stored. LoadDir, // Where cheat/mod files are stored. LogDir, // Where log files are stored. @@ -26,7 +27,7 @@ enum class SuyuPath { SDMCDir, // Where the emulated SDMC is stored. ShaderDir, // Where shaders are stored. TASDir, // Where TAS scripts are stored. - IconsDir, // Where Icons for Windows shortcuts are stored. + ThemesDir, // Where users should put their custom themes }; /** diff --git a/src/suyu/configuration/configure_ui.cpp b/src/suyu/configuration/configure_ui.cpp index a3648c5b1c..046b34721e 100644 --- a/src/suyu/configuration/configure_ui.cpp +++ b/src/suyu/configuration/configure_ui.cpp @@ -106,11 +106,31 @@ ConfigureUi::ConfigureUi(Core::System& system_, QWidget* parent) InitializeLanguageComboBox(); - for (const auto& theme : UISettings::themes) { + for (const auto& theme : UISettings::included_themes) { ui->theme_combobox->addItem(QString::fromUtf8(theme.first), QString::fromUtf8(theme.second)); } + // Add custom styles stored in yuzu directory + const QDir themes_local_dir( + QString::fromStdString(Common::FS::GetSuyuPathString(Common::FS::SuyuPath::ThemesDir))); + for (const QString& theme_dir : + themes_local_dir.entryList(QDir::NoDot | QDir::NoDotDot | QDir::Dirs)) { + // folders ending with "_dark" are reserved for dark variant icons of other styles + if (theme_dir.endsWith(QStringLiteral("_dark"))) { + continue; + } + // Split at _ and capitalize words in name + QStringList cased_name; + for (QString word : theme_dir.split(QChar::fromLatin1('_'))) { + cased_name.append(word.at(0).toUpper() + word.mid(1)); + } + QString theme_name = cased_name.join(QChar::fromLatin1(' ')); + theme_name += QStringLiteral(" (%1)").arg(tr("Custom")); + + ui->theme_combobox->addItem(theme_name, themes_local_dir.filePath(theme_dir)); + } + InitializeIconSizeComboBox(); InitializeRowComboBoxes(); @@ -164,7 +184,7 @@ ConfigureUi::~ConfigureUi() = default; void ConfigureUi::ApplyConfiguration() { UISettings::values.theme = - ui->theme_combobox->itemData(ui->theme_combobox->currentIndex()).toString().toStdString(); + ui->theme_combobox->itemData(ui->theme_combobox->currentIndex()).toString(); UISettings::values.show_add_ons = ui->show_add_ons->isChecked(); UISettings::values.show_compat = ui->show_compat->isChecked(); UISettings::values.show_size = ui->show_size->isChecked(); @@ -191,8 +211,7 @@ void ConfigureUi::RequestGameListUpdate() { } void ConfigureUi::SetConfiguration() { - ui->theme_combobox->setCurrentIndex( - ui->theme_combobox->findData(QString::fromStdString(UISettings::values.theme))); + ui->theme_combobox->setCurrentIndex(ui->theme_combobox->findData(UISettings::values.theme)); ui->language_combobox->setCurrentIndex(ui->language_combobox->findData( QString::fromStdString(UISettings::values.language.GetValue()))); ui->show_add_ons->setChecked(UISettings::values.show_add_ons.GetValue()); diff --git a/src/suyu/configuration/qt_config.cpp b/src/suyu/configuration/qt_config.cpp index 37951b9c84..2868db4ebb 100644 --- a/src/suyu/configuration/qt_config.cpp +++ b/src/suyu/configuration/qt_config.cpp @@ -260,9 +260,8 @@ void QtConfig::ReadShortcutValues() { void QtConfig::ReadUIValues() { BeginGroup(Settings::TranslateCategory(Settings::Category::Ui)); - UISettings::values.theme = ReadStringSetting( - std::string("theme"), - std::string(UISettings::themes[static_cast(UISettings::default_theme)].second)); + UISettings::values.theme = QString::fromStdString( + ReadStringSetting(std::string("theme"), std::string(UISettings::default_theme))); ReadUIGamelistValues(); ReadUILayoutValues(); @@ -468,10 +467,8 @@ void QtConfig::SaveUIValues() { WriteCategory(Settings::Category::Ui); WriteCategory(Settings::Category::UiGeneral); - WriteStringSetting( - std::string("theme"), UISettings::values.theme, - std::make_optional(std::string( - UISettings::themes[static_cast(UISettings::default_theme)].second))); + WriteStringSetting(std::string("theme"), UISettings::values.theme.toStdString(), + std::make_optional(std::string(UISettings::default_theme))); SaveUIGamelistValues(); SaveUILayoutValues(); diff --git a/src/suyu/debugger/wait_tree.cpp b/src/suyu/debugger/wait_tree.cpp index b339862ba7..b5ee4bcfdf 100644 --- a/src/suyu/debugger/wait_tree.cpp +++ b/src/suyu/debugger/wait_tree.cpp @@ -35,9 +35,8 @@ constexpr std::array, 10> WaitTreeColors{{ }}; bool IsDarkTheme() { - const auto& theme = UISettings::values.theme; - return theme == std::string("qdarkstyle") || theme == std::string("qdarkstyle_midnight_blue") || - theme == std::string("colorful_dark") || theme == std::string("colorful_midnight_blue"); + return UISettings::values.theme.contains(QStringLiteral("dark")) || + UISettings::values.theme.contains(QStringLiteral("midnight")); } } // namespace diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index 9a3ee7f662..030e4ae511 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -3542,7 +3542,7 @@ void GMainWindow::ResetWindowSize1080() { } void GMainWindow::OnConfigure() { - const auto old_theme = UISettings::values.theme; + const QString old_theme = UISettings::values.theme; const bool old_discord_presence = UISettings::values.enable_discord_presence.GetValue(); const auto old_language_index = Settings::values.language_index.GetValue(); #ifdef __unix__ @@ -4812,9 +4812,8 @@ static void AdjustLinkColor() { } void GMainWindow::UpdateUITheme() { - const QString default_theme = QString::fromUtf8( - UISettings::themes[static_cast(UISettings::default_theme)].second); - QString current_theme = QString::fromStdString(UISettings::values.theme); + QString default_theme = QString::fromStdString(UISettings::default_theme.data()); + QString current_theme = UISettings::values.theme; if (current_theme.isEmpty()) { current_theme = default_theme; @@ -4825,6 +4824,7 @@ void GMainWindow::UpdateUITheme() { AdjustLinkColor(); #else if (current_theme == QStringLiteral("default") || current_theme == QStringLiteral("colorful")) { + LOG_INFO(Frontend, "Theme is default or colorful: {}", current_theme.toStdString()); QIcon::setThemeName(current_theme == QStringLiteral("colorful") ? current_theme : startup_icon_theme); QIcon::setThemeSearchPaths(QStringList(default_theme_paths)); @@ -4832,35 +4832,57 @@ void GMainWindow::UpdateUITheme() { current_theme = QStringLiteral("default_dark"); } } else { + LOG_INFO(Frontend, "Theme is NOT default or colorful: {}", current_theme.toStdString()); QIcon::setThemeName(current_theme); - QIcon::setThemeSearchPaths(QStringList(QStringLiteral(":/icons"))); + // Use icon resources from application binary and current theme subdirectory if it exists + QStringList theme_paths; + theme_paths << QString::fromStdString(":/icons") + << QStringLiteral("%1/%2/icons") + .arg(QString::fromStdString( + Common::FS::GetYuzuPathString(Common::FS::YuzuPath::ThemesDir)), + current_theme); + QIcon::setThemeSearchPaths(theme_paths); AdjustLinkColor(); } #endif if (current_theme != default_theme) { - QString theme_uri{QStringLiteral(":%1/style.qss").arg(current_theme)}; - QFile f(theme_uri); - if (!f.open(QFile::ReadOnly | QFile::Text)) { - LOG_ERROR(Frontend, "Unable to open style \"{}\", fallback to the default theme", - UISettings::values.theme); - current_theme = default_theme; + QString theme_uri{current_theme + QStringLiteral("style.qss")}; + if (tryLoadStylesheet(theme_uri)) { + return; } - } - QString theme_uri{QStringLiteral(":%1/style.qss").arg(current_theme)}; - QFile f(theme_uri); - if (f.open(QFile::ReadOnly | QFile::Text)) { - QTextStream ts(&f); - qApp->setStyleSheet(ts.readAll()); - setStyleSheet(ts.readAll()); - } else { + // Reading new theme failed, loading default stylesheet + LOG_ERROR(Frontend, "Unable to open style \"{}\", fallback to the default theme", + current_theme.toStdString()); + + current_theme = default_theme; + theme_uri = QStringLiteral(":%1/style.qss").arg(default_theme); + if (tryLoadStylesheet(theme_uri)) { + return; + } + + // Reading default failed, loading empty stylesheet LOG_ERROR(Frontend, "Unable to set style \"{}\", stylesheet file not found", - UISettings::values.theme); + current_theme.toStdString()); + qApp->setStyleSheet({}); setStyleSheet({}); } } +bool GMainWindow::tryLoadStylesheet(const QString& theme_path) { + QFile theme_file(theme_path); + if (theme_file.open(QFile::ReadOnly | QFile::Text)) { + LOG_INFO(Frontend, "Loading style in: {}", theme_path.toStdString()); + QTextStream ts(&theme_file); + qApp->setStyleSheet(ts.readAll()); + setStyleSheet(ts.readAll()); + return true; + } + // Opening the file failed + return false; +} + void GMainWindow::LoadTranslation() { bool loaded; @@ -4919,7 +4941,7 @@ void GMainWindow::changeEvent(QEvent* event) { // UpdateUITheme is a decent work around if (event->type() == QEvent::PaletteChange) { const QPalette test_palette(qApp->palette()); - const QString current_theme = QString::fromStdString(UISettings::values.theme); + const QString& current_theme = UISettings::values.theme; // Keeping eye on QPalette::Window to avoid looping. QPalette::Text might be useful too static QColor last_window_color; const QColor window_color = test_palette.color(QPalette::Active, QPalette::Window); diff --git a/src/suyu/main.h b/src/suyu/main.h index e20950e238..6bbcdd7c58 100644 --- a/src/suyu/main.h +++ b/src/suyu/main.h @@ -165,6 +165,12 @@ class GMainWindow : public QMainWindow { CREATE_SHORTCUT_MSGBOX_APPVOLATILE_WARNING, }; + /** + * Try to load a stylesheet from its path. If the path starts with ":/", its embedded in the app + * @returns true if the text file could be opened as read-only + */ + bool tryLoadStylesheet(const QString& theme_path); + public: void filterBarSetChecked(bool state); void UpdateUITheme(); diff --git a/src/suyu/uisettings.cpp b/src/suyu/uisettings.cpp index 60d4063c8c..e382afdf61 100644 --- a/src/suyu/uisettings.cpp +++ b/src/suyu/uisettings.cpp @@ -22,19 +22,18 @@ namespace FS = Common::FS; namespace UISettings { -const Themes themes{{ - {"Default", "default"}, - {"Default Colorful", "colorful"}, - {"Dark", "qdarkstyle"}, - {"Dark Colorful", "colorful_dark"}, - {"Midnight Blue", "qdarkstyle_midnight_blue"}, - {"Midnight Blue Colorful", "colorful_midnight_blue"}, +const Themes included_themes{{ + {"Default", ":/default/"}, + {"Default Colorful", ":/colorful/"}, + {"Dark", ":/qdarkstyle/"}, + {"Dark Colorful", ":/colorful_dark/"}, + {"Midnight Blue", ":/qdarkstyle_midnight_blue/"}, + {"Midnight Blue Colorful", ":/colorful_midnight_blue/"}, }}; bool IsDarkTheme() { - const auto& theme = UISettings::values.theme; - return theme == std::string("qdarkstyle") || theme == std::string("qdarkstyle_midnight_blue") || - theme == std::string("colorful_dark") || theme == std::string("colorful_midnight_blue"); + return UISettings::values.theme.contains(QStringLiteral("dark")) || + UISettings::values.theme.contains(QStringLiteral("midnight")); } Values values = {}; diff --git a/src/suyu/uisettings.h b/src/suyu/uisettings.h index cab889680f..7713c8c73a 100644 --- a/src/suyu/uisettings.h +++ b/src/suyu/uisettings.h @@ -35,6 +35,10 @@ extern template class Setting; namespace UISettings { +/** + * Check if the theme is dark + * @returns true if the current theme contains the string "dark" in its name + */ bool IsDarkTheme(); struct ContextualShortcut { @@ -50,25 +54,16 @@ struct Shortcut { ContextualShortcut shortcut; }; -enum class Theme { - Default, - DefaultColorful, - Dark, - DarkColorful, - MidnightBlue, - MidnightBlueColorful, -}; - -static constexpr Theme default_theme{ +static constexpr std::string_view default_theme{ #ifdef _WIN32 - Theme::DarkColorful + "colorful_dark" #else - Theme::DefaultColorful + "colorful" #endif }; using Themes = std::array, 6>; -extern const Themes themes; +extern const Themes included_themes; struct GameDir { std::string path; @@ -160,7 +155,7 @@ struct Values { QStringList recent_files; Setting language{linkage, {}, "language", Category::Paths}; - std::string theme; + QString theme; // Shortcut name std::vector shortcuts; From 0b2409d1bdd383feb84f160f3dabf679ce6bd62b Mon Sep 17 00:00:00 2001 From: flodavid Date: Sun, 4 Feb 2024 04:04:47 +0100 Subject: [PATCH 079/165] Automatic dark theme switching for Windows and Linux - Windows dark theme uses "fusion" style, which is better suited, but has minor differences - Improve OS theme detection - Linux: - Listen for OS color schemes changes on D-Bus - Read OS scheme for D-Bus. Fallback with gsettings, reading org.gnome.desktop.interface. First "color-scheme" key, then "gtk-theme". Finally, fallback to checking window palette - Windows (dark mode detection was not implemented before): - Force dark palette when OS uses dark mode by setting QT_QPA_PLATFORM to "windows:darkmode=2" - This enables to detect dark mode by checking the window palette - Improve theming capabilites: - Linux uses custom palette when dark mode is detected. By using palette(xxx) in .qss files, there is no need to create a dark stylesheet - Allow themes to have stylesheet variants, dark.qss and light.qss - If current mode is dark, use dark icons for controller and keyboard applets - Add "dark" property to RendererStatusBarButton and GPUStatusBarButton, set to true when dark mode is used. Allows to have distinct colors for GPU API and accuracy buttons depending on dark mode or not - Enable all themes to have dark icon alternatives, not just "default" and "colorful" - If dark mode, icons are loaded from the directory "THEME-NAME_dark/icons" - If current mode is dark, use dark icons for controller and keyboard applets - Only qdarkstyle, qdarkstyle_midnight_blue, colorful_dark and colorful_midnight_blue used elements specific to dark themes --- dist/qt_themes/default/style.qss | 88 +++-- src/suyu/applets/qt_controller.cpp | 16 +- src/suyu/applets/qt_software_keyboard.cpp | 4 +- src/suyu/main.cpp | 392 ++++++++++++++++------ src/suyu/main.h | 48 ++- src/suyu/startup_checks.cpp | 5 + src/suyu/uisettings.cpp | 5 - src/suyu/uisettings.h | 14 +- 8 files changed, 414 insertions(+), 158 deletions(-) diff --git a/dist/qt_themes/default/style.qss b/dist/qt_themes/default/style.qss index 921950c6c0..bd9c1964cf 100644 --- a/dist/qt_themes/default/style.qss +++ b/dist/qt_themes/default/style.qss @@ -1,3 +1,14 @@ +/* +* SPDX-FileCopyrightText: 2018 yuzu Emulator Project +* SPDX-FileCopyrightText: 2024 suyu Emulator Project +* SPDX-License-Identifier: GPL-2.0-or-later +*/ + +QWidget:item:hover { + background-color: #28668d; + color: #eff0f1; +} + QAbstractSpinBox { min-height: 19px; } @@ -94,21 +105,21 @@ QGroupBox#groupPlayer5Connected:checked, QGroupBox#groupPlayer6Connected:checked, QGroupBox#groupPlayer7Connected:checked, QGroupBox#groupPlayer8Connected:checked { - background-color: #f5f5f5; + background-color: palette(window); } QWidget#topControllerApplet { - border-bottom: 1px solid #828790 + border-bottom: 1px solid palette(dark) } QWidget#bottomPerGameInput, QWidget#bottomControllerApplet { - border-top: 1px solid #828790 + border-top: 1px solid palette(dark) } QWidget#topPerGameInput, QWidget#middleControllerApplet { - background-color: #fff; + background-color: palette(base) } QWidget#topPerGameInput QComboBox, @@ -345,7 +356,7 @@ QWidget#lineDialog { QStackedWidget#bottomOSK, QWidget#contentDialog, QWidget#contentRichDialog { - background: rgba(240, 240, 240, 1); + background: palette(base); } QWidget#contentDialog, @@ -402,6 +413,7 @@ QWidget#inputOSK QLineEdit { background: transparent; border: none; color: #ccc; + padding: 0px; } QWidget#inputBoxOSK { @@ -431,6 +443,27 @@ QWidget#boxOSK QLabel#label_characters_box { color: #ccc; } +QWidget#buttonsDialog, +QWidget#buttonsRichDialog, +QWidget#mainOSK, +QWidget#headerOSK, +QWidget#normalOSK, +QWidget#shiftOSK, +QWidget#numOSK, +QWidget#subOSK, +QWidget#inputOSK, +QWidget#inputBoxOSK, +QWidget#charactersOSK, +QWidget#charactersBoxOSK, +QWidget#legendOSK, +QWidget#legendOSK QWidget, +QWidget#legendOSKshift, +QWidget#legendOSKshift QWidget, +QWidget#legendOSKnum, +QWidget#legendOSKnum QWidget { + background: transparent; +} + QWidget#contentDialog QLabel#label_title, QWidget#contentRichDialog QLabel#label_title_rich { color: #888; @@ -471,8 +504,8 @@ QDialog#OverlayDialog QPushButton:pressed { } QDialog#QtSoftwareKeyboardDialog QPushButton { - background: rgba(232, 232, 232, 1); - border: 2px solid rgba(240, 240, 240, 1); + background: palette(window); + border: 2px solid palette(base); } QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift, @@ -481,27 +514,35 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift, QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift, QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { - background: rgba(218, 218, 218, 1); - border: 2px solid rgba(240, 240, 240, 1); + background: palette(alternate-base); + border: 2px solid palette(base); } QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { - color: rgba(240, 240, 240, 1); - background: rgba(44, 44, 44, 1); - border: 2px solid rgba(240, 240, 240, 1); + color: palette(base); + background: palette(mid); + border: 2px solid palette(base); } QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { - color: rgba(240, 240, 240, 1); - background: rgba(49, 79, 239, 1); - border: 2px solid rgba(240, 240, 240, 1); + color: palette(base); + background: palette(highlight); + border: 2px solid palette(base); } QDialog#QtSoftwareKeyboardDialog QPushButton:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton:hover +{ + background: palette(base); + border: 5px solid rgba(148, 250, 202, 1); + border-radius: 6px; + outline: none; +} + QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:focus, QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:focus, QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:focus, @@ -514,8 +555,6 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:focus, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:focus, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:focus, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:focus, - -QDialog#QtSoftwareKeyboardDialog QPushButton:hover, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:hover, QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:hover, QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:hover, @@ -524,12 +563,11 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:hover, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:hover, QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift:hover, QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:hover, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:hover, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:hover { - color: rgba(0, 0, 0, 1); - background: rgba(255, 255, 255, 1); +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:hover +{ border: 5px solid rgba(148, 250, 202, 1); border-radius: 6px; outline: none; @@ -548,7 +586,7 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:pressed, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:pressed, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:pressed, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:pressed { - color: rgba(240, 240, 240, 1); + color: palette(base); background: rgba(150, 150, 150, 1); border: 5px solid rgba(148, 250, 202, 1); border-radius: 6px; @@ -653,8 +691,8 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { - color: rgba(164, 164, 164, 1); - background-color: rgba(218, 218, 218, 1); + color: palette(midlight); + background-color: palette(alternate-base); } QDialog#QtSoftwareKeyboardDialog QPushButton#button_at:disabled, @@ -671,7 +709,7 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_8:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_9:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_0:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled { - color: rgba(164, 164, 164, 1); + color: palette(midlight); } QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, diff --git a/src/suyu/applets/qt_controller.cpp b/src/suyu/applets/qt_controller.cpp index f27ab835e5..d41d23eceb 100644 --- a/src/suyu/applets/qt_controller.cpp +++ b/src/suyu/applets/qt_controller.cpp @@ -384,10 +384,12 @@ bool QtControllerSelectorDialog::CheckIfParametersMet() { void QtControllerSelectorDialog::SetSupportedControllers() { const QString theme = [] { - if (QIcon::themeName().contains(QStringLiteral("dark"))) { - return QStringLiteral("_dark"); - } else if (QIcon::themeName().contains(QStringLiteral("midnight"))) { + if (QIcon::themeName().contains(QStringLiteral("midnight"))) { return QStringLiteral("_midnight"); + } else if (GMainWindow::CheckDarkMode() || + QIcon::themeName().contains(QStringLiteral("dark"))) { + // Use dark icons if current OS mode is dark, or the theme contains "dark" in its name + return QStringLiteral("_dark"); } else { return QString{}; } @@ -572,10 +574,12 @@ void QtControllerSelectorDialog::UpdateControllerIcon(std::size_t player_index) } const QString theme = [] { - if (QIcon::themeName().contains(QStringLiteral("dark"))) { - return QStringLiteral("_dark"); - } else if (QIcon::themeName().contains(QStringLiteral("midnight"))) { + if (QIcon::themeName().contains(QStringLiteral("midnight"))) { return QStringLiteral("_midnight"); + } else if (GMainWindow::CheckDarkMode() || + QIcon::themeName().contains(QStringLiteral("dark"))) { + // Use dark icons if current OS mode is dark, or the theme contains "dark" in its name + return QStringLiteral("_dark"); } else { return QString{}; } diff --git a/src/suyu/applets/qt_software_keyboard.cpp b/src/suyu/applets/qt_software_keyboard.cpp index a1bcfa717e..ca7169e2a2 100644 --- a/src/suyu/applets/qt_software_keyboard.cpp +++ b/src/suyu/applets/qt_software_keyboard.cpp @@ -823,7 +823,9 @@ void QtSoftwareKeyboardDialog::SetControllerImage() { handheld->IsConnected() ? handheld->GetNpadStyleIndex() : player_1->GetNpadStyleIndex(); const QString theme = [] { - if (QIcon::themeName().contains(QStringLiteral("dark")) || + // Use dark icons if current OS mode is dark, or the theme contains "dark", or "midnight" in + // its name + if (GMainWindow::CheckDarkMode() || QIcon::themeName().contains(QStringLiteral("dark")) || QIcon::themeName().contains(QStringLiteral("midnight"))) { return QStringLiteral("_dark"); } else { diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index 030e4ae511..e6d14717cf 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -9,7 +9,9 @@ #include #include #include +#include #include + #include "core/hle/service/am/applet_manager.h" #include "core/loader/nca.h" #include "core/loader/nro.h" @@ -20,6 +22,9 @@ #endif #ifdef __unix__ #include +#include +#include +#include #include #include "common/linux/gamemode.h" #endif @@ -271,18 +276,6 @@ static void OverrideWindowsFont() { } #endif -bool GMainWindow::CheckDarkMode() { -#ifdef __unix__ - const QPalette test_palette(qApp->palette()); - const QColor text_color = test_palette.color(QPalette::Active, QPalette::Text); - const QColor window_color = test_palette.color(QPalette::Active, QPalette::Window); - return (text_color.value() > window_color.value()); -#else - // TODO: Windows - return false; -#endif // __unix__ -} - GMainWindow::GMainWindow(std::unique_ptr config_, bool has_broken_vulkan) : ui{std::make_unique()}, system{std::make_unique()}, input_subsystem{std::make_shared()}, config{std::move(config_)}, @@ -303,8 +296,6 @@ GMainWindow::GMainWindow(std::unique_ptr config_, bool has_broken_vulk ui->setupUi(this); statusBar()->hide(); - // Check dark mode before a theme is loaded - os_dark_mode = CheckDarkMode(); startup_icon_theme = QIcon::themeName(); // fallback can only be set once, colorful theme icons are okay on both light/dark QIcon::setFallbackThemeName(QStringLiteral("colorful")); @@ -329,6 +320,7 @@ GMainWindow::GMainWindow(std::unique_ptr config_, bool has_broken_vulk SetDefaultUIGeometry(); RestoreUIState(); + UpdateUITheme(); ConnectMenuEvents(); ConnectWidgetEvents(); @@ -449,7 +441,10 @@ GMainWindow::GMainWindow(std::unique_ptr config_, bool has_broken_vulk SDL_EnableScreenSaver(); #endif +#ifdef __unix__ SetupPrepareForSleep(); + ListenColorSchemeChange(); +#endif QStringList args = QApplication::arguments(); @@ -1647,8 +1642,8 @@ void GMainWindow::OnDisplayTitleBars(bool show) { } } -void GMainWindow::SetupPrepareForSleep() { #ifdef __unix__ +void GMainWindow::SetupPrepareForSleep() { auto bus = QDBusConnection::systemBus(); if (bus.isConnected()) { const bool success = bus.connect( @@ -1662,8 +1657,8 @@ void GMainWindow::SetupPrepareForSleep() { } else { LOG_WARNING(Frontend, "QDBusConnection system bus is not connected"); } -#endif // __unix__ } +#endif // __unix__ void GMainWindow::OnPrepareForSleep(bool prepare_sleep) { if (emu_thread == nullptr) { @@ -4799,9 +4794,106 @@ void GMainWindow::filterBarSetChecked(bool state) { emit(OnToggleFilterBar()); } +void GMainWindow::UpdateUITheme() { + LOG_DEBUG(Frontend, "Updating UI"); + QString default_theme = QString::fromStdString(UISettings::default_theme.data()); + QString current_theme = UISettings::values.theme; + if (current_theme.isEmpty()) { + current_theme = default_theme; + } + const bool current_dark_mode = CheckDarkMode(); + + UpdateIcons(current_theme); + + /* Find the stylesheet to load */ + if (TryLoadStylesheet(current_theme)) { + return; + } + + // Reading new theme failed, loading default stylesheet + LOG_ERROR(Frontend, "Unable to open style \"{}\", fallback to the default theme", + current_theme.toStdString()); + + if (TryLoadStylesheet(QStringLiteral(":/%1").arg(default_theme))) { + return; + } + + // Reading default failed, loading empty stylesheet + LOG_ERROR(Frontend, "Unable to set default style, stylesheet file not found"); + + qApp->setStyleSheet({}); + setStyleSheet({}); +} + +void GMainWindow::UpdateIcons(const QString& theme_path) { + // Get the theme directory from its path + std::size_t last_slash = theme_path.toStdString().find_last_of("/"); + QString theme_dir = QString::fromStdString(theme_path.toStdString().substr(last_slash + 1)); + + // Append _dark to the theme name to use dark variant icons + if (CheckDarkMode()) { + LOG_DEBUG(Frontend, "Using icons from: {}", theme_dir.toStdString() + "_dark"); + QIcon::setThemeName(theme_dir + QStringLiteral("_dark")); + } else { + LOG_DEBUG(Frontend, "Using icons from: {}", theme_dir.toStdString()); + QIcon::setThemeName(theme_dir); + } + + const QString theme_directory{ + QString::fromStdString(Common::FS::GetSuyuPathString(Common::FS::SuyuPath::ThemesDir))}; + + // Set path for default icons + // Use icon resources from application binary and current theme local subdirectory, if it exists + QStringList theme_paths; + theme_paths << QString::fromStdString(":/icons") << QStringLiteral("%1").arg(theme_directory); + QIcon::setThemeSearchPaths(theme_paths); + + // Change current directory, to allow user themes to add their own icons + QDir::setCurrent(QStringLiteral("%1/%2").arg(theme_directory, UISettings::values.theme)); + + emit UpdateThemedIcons(); +} + +bool GMainWindow::TryLoadStylesheet(const QString& theme_uri) { + QString style_path; + + // Use themed stylesheet if it exists + if (CheckDarkMode()) { + style_path = theme_uri + QStringLiteral("/dark.qss"); + } else { + style_path = theme_uri + QStringLiteral("/light.qss"); + } + if (!QFile::exists(style_path)) { + LOG_INFO(Frontend, "Themed (light/dark) stylesheet could not be found, using default one"); + // Use common stylesheet if themed one does not exist + style_path = theme_uri + QStringLiteral("/style.qss"); + } + + // Loading stylesheet + QFile style_file(style_path); + if (style_file.open(QFile::ReadOnly | QFile::Text)) { + // Update the color palette before applying the stylesheet + UpdateThemePalette(); + + LOG_INFO(Frontend, "Loading stylesheet in: {}", theme_uri.toStdString()); + QTextStream ts_theme(&style_file); + qApp->setStyleSheet(ts_theme.readAll()); + setStyleSheet(ts_theme.readAll()); + SetCustomStylesheet(); + + return true; + } + // Opening the file failed + return false; +} + +bool GMainWindow::TryLoadStylesheet(const std::filesystem::path& theme_path) { + return TryLoadStylesheet(QString::fromStdString(theme_path.string() + "/")); +} + static void AdjustLinkColor() { QPalette new_pal(qApp->palette()); - if (UISettings::IsDarkTheme()) { + if (GMainWindow::CheckDarkMode()) { new_pal.setColor(QPalette::Link, QColor(0, 190, 255, 255)); } else { new_pal.setColor(QPalette::Link, QColor(0, 140, 200, 255)); @@ -4811,77 +4903,201 @@ static void AdjustLinkColor() { } } -void GMainWindow::UpdateUITheme() { - QString default_theme = QString::fromStdString(UISettings::default_theme.data()); - QString current_theme = UISettings::values.theme; - - if (current_theme.isEmpty()) { - current_theme = default_theme; - } - +void GMainWindow::UpdateThemePalette() { + QPalette themePalette(qApp->palette()); #ifdef _WIN32 - QIcon::setThemeName(current_theme); - AdjustLinkColor(); -#else - if (current_theme == QStringLiteral("default") || current_theme == QStringLiteral("colorful")) { - LOG_INFO(Frontend, "Theme is default or colorful: {}", current_theme.toStdString()); - QIcon::setThemeName(current_theme == QStringLiteral("colorful") ? current_theme - : startup_icon_theme); - QIcon::setThemeSearchPaths(QStringList(default_theme_paths)); - if (CheckDarkMode()) { - current_theme = QStringLiteral("default_dark"); + QColor dark(25, 25, 25); + QColor darkGray(100, 100, 100); + QColor gray(150, 150, 150); + QColor light(230, 230, 230); + // By default, revert fusion style set for Windows dark theme + QString style; + if (CheckDarkMode()) { + // AlternateBase is kept at rgb(233, 231, 227) or rgb(245, 245, 245) on Windows dark + // palette, fix this. Sometimes, it even is rgb(0, 0, 0), but uses a very light gray for + // alternate rows, do not know why + if (themePalette.alternateBase().color() == QColor(233, 231, 227) || + themePalette.alternateBase().color() == QColor(245, 245, 245) || + themePalette.alternateBase().color() == QColor(0, 0, 0)) { + themePalette.setColor(QPalette::AlternateBase, dark); + alternate_base_modified = true; } + // Use fusion theme, since its close to windowsvista, but works well with a dark palette + style = QStringLiteral("fusion"); } else { - LOG_INFO(Frontend, "Theme is NOT default or colorful: {}", current_theme.toStdString()); - QIcon::setThemeName(current_theme); - // Use icon resources from application binary and current theme subdirectory if it exists - QStringList theme_paths; - theme_paths << QString::fromStdString(":/icons") - << QStringLiteral("%1/%2/icons") - .arg(QString::fromStdString( - Common::FS::GetYuzuPathString(Common::FS::YuzuPath::ThemesDir)), - current_theme); - QIcon::setThemeSearchPaths(theme_paths); - AdjustLinkColor(); + // Reset AlternateBase if it has been modified + if (alternate_base_modified) { + themePalette.setColor(QPalette::AlternateBase, QColor(245, 245, 245)); + alternate_base_modified = false; + } + // Reset Windows theme to the default + style = QStringLiteral("windowsvista"); + } + LOG_DEBUG(Frontend, "Using style: {}", style.toStdString()); + qApp->setStyle(style); +#else + if (CheckDarkMode()) { + // Set Dark palette on non Windows platforms (that may not have a dark palette) + LOG_INFO(Frontend, "Using custom dark palette"); + themePalette.setColor(QPalette::Window, QColor(53, 53, 53)); + themePalette.setColor(QPalette::WindowText, Qt::white); + themePalette.setColor(QPalette::Disabled, QPalette::WindowText, QColor(127, 127, 127)); + themePalette.setColor(QPalette::Base, QColor(42, 42, 42)); + themePalette.setColor(QPalette::AlternateBase, QColor(66, 66, 66)); + themePalette.setColor(QPalette::ToolTipBase, Qt::white); + themePalette.setColor(QPalette::ToolTipText, QColor(53, 53, 53)); + themePalette.setColor(QPalette::Text, Qt::white); + themePalette.setColor(QPalette::Disabled, QPalette::Text, QColor(127, 127, 127)); + themePalette.setColor(QPalette::Dark, QColor(35, 35, 35)); + themePalette.setColor(QPalette::Shadow, QColor(20, 20, 20)); + themePalette.setColor(QPalette::Button, QColor(53, 53, 53)); + themePalette.setColor(QPalette::ButtonText, Qt::white); + themePalette.setColor(QPalette::Disabled, QPalette::ButtonText, QColor(127, 127, 127)); + themePalette.setColor(QPalette::BrightText, Qt::red); + themePalette.setColor(QPalette::Link, QColor(42, 130, 218)); + themePalette.setColor(QPalette::Highlight, QColor(42, 130, 218)); + themePalette.setColor(QPalette::Disabled, QPalette::Highlight, QColor(80, 80, 80)); + themePalette.setColor(QPalette::HighlightedText, Qt::white); + themePalette.setColor(QPalette::Disabled, QPalette::HighlightedText, QColor(127, 127, 127)); + } else { + LOG_INFO(Frontend, "Using standard palette"); + // Reset light palette on non Windows platforms + themePalette = this->style()->standardPalette(); } #endif - if (current_theme != default_theme) { - QString theme_uri{current_theme + QStringLiteral("style.qss")}; - if (tryLoadStylesheet(theme_uri)) { - return; - } - - // Reading new theme failed, loading default stylesheet - LOG_ERROR(Frontend, "Unable to open style \"{}\", fallback to the default theme", - current_theme.toStdString()); - - current_theme = default_theme; - theme_uri = QStringLiteral(":%1/style.qss").arg(default_theme); - if (tryLoadStylesheet(theme_uri)) { - return; - } - - // Reading default failed, loading empty stylesheet - LOG_ERROR(Frontend, "Unable to set style \"{}\", stylesheet file not found", - current_theme.toStdString()); - - qApp->setStyleSheet({}); - setStyleSheet({}); - } + qApp->setPalette(themePalette); + AdjustLinkColor(); } -bool GMainWindow::tryLoadStylesheet(const QString& theme_path) { - QFile theme_file(theme_path); - if (theme_file.open(QFile::ReadOnly | QFile::Text)) { - LOG_INFO(Frontend, "Loading style in: {}", theme_path.toStdString()); - QTextStream ts(&theme_file); - qApp->setStyleSheet(ts.readAll()); - setStyleSheet(ts.readAll()); - return true; +void GMainWindow::SetCustomStylesheet() { + setStyleSheet(QStringLiteral("QStatusBar::item { border: none; }")); + + // Set "dark" qss property value, that may be used in stylesheets + bool is_dark_mode = CheckDarkMode(); + if (renderer_status_button) { + renderer_status_button->setProperty("dark", is_dark_mode); } - // Opening the file failed + if (gpu_accuracy_button) { + gpu_accuracy_button->setProperty("dark", is_dark_mode); + } +#ifdef _WIN32 + // Windows dark mode uses "fusion" style. Make it look like more "windowsvista" light style + if (is_dark_mode) { + /* the groove expands to the size of the slider by default. by giving it a height, it has a + fixed size */ + /* handle is placed by default on the contents rect of the groove. Negative margin expands + it outside the groove */ + setStyleSheet(QStringLiteral("QSlider:horizontal{ height:30px; }\ + QSlider::sub-page:horizontal { background-color: palette(highlight); }\ + QSlider::add-page:horizontal { background-color: palette(midlight);}\ + QSlider::groove:horizontal { border-width: 1px; margin: 1px 0; height: 2px;}\ + QSlider::handle:horizontal { border-width: 1px; border-style: solid; border-color: palette(dark);\ + width: 10px; margin: -10px 0px; }\ + QSlider::handle { background-color: palette(button); }\ + QSlider::handle:hover { background-color: palette(highlight); }")); + } +#endif +} + +#ifdef __unix__ +bool GMainWindow::ListenColorSchemeChange() { + auto bus = QDBusConnection::sessionBus(); + if (bus.isConnected()) { + const QString dbus_service = QStringLiteral("org.freedesktop.portal.Desktop"); + const QString dbus_path = QStringLiteral("/org/freedesktop/portal/desktop"); + const QString dbus_interface = QStringLiteral("org.freedesktop.portal.Settings"); + const QString dbus_method = QStringLiteral("SettingChanged"); + QStringList dbus_arguments; + dbus_arguments << QStringLiteral("org.freedesktop.appearance") + << QStringLiteral("color-scheme"); + const QString dbus_signature = QStringLiteral("ssv"); + + LOG_INFO(Frontend, "Connected to DBus, listening for OS theme changes"); + return bus.connect(dbus_service, dbus_path, dbus_interface, dbus_method, dbus_arguments, + dbus_signature, this, SLOT(UpdateUITheme())); + } + LOG_WARNING(Frontend, "Unable to connect to DBus to listen for OS theme changes"); return false; } +#endif + +bool GMainWindow::CheckDarkMode() { + const QPalette current_palette(qApp->palette()); +#ifdef __unix__ + QProcess process; + QStringList gdbus_arguments; + + // Using the freedesktop specifications for checking dark mode + LOG_INFO(Frontend, "Retrieving theme from freedesktop color-scheme..."); + gdbus_arguments << QStringLiteral("--dest=org.freedesktop.portal.Desktop") + << QStringLiteral("--object-path /org/freedesktop/portal/desktop") + << QStringLiteral("--method org.freedesktop.portal.Settings.Read " + "org.freedesktop.appearance color-scheme"); + process.start(QStringLiteral("gdbus call --session"), gdbus_arguments); + process.waitForFinished(1000); + QByteArray dbus_output = process.readAllStandardOutput(); + + if (!dbus_output.isEmpty()) { + const int systemColorSchema = QString::fromUtf8(dbus_output).trimmed().right(1).toInt(); + return systemColorSchema == 1; + } + + // Try alternative for Gnome if the previous one failed + QStringList gsettings_arguments; + gsettings_arguments << QStringLiteral("get") + << QStringLiteral("org.gnome.desktop.interface") + << QStringLiteral("color-scheme"); + + LOG_DEBUG(Frontend, "failed, retrieving theme from gsettings color-scheme..."); + process.start(QStringLiteral("gsettings"), gsettings_arguments); + process.waitForFinished(1000); + QByteArray gsettings_output = process.readAllStandardOutput(); + + // Try older gtk-theme method if the previous one failed + if (gsettings_output.isEmpty()) { + LOG_INFO(Frontend, "failed, retrieving theme from gtk-theme..."); + gsettings_arguments.takeLast(); + gsettings_arguments << QStringLiteral("gtk-theme"); + + process.start(QStringLiteral("gsettings"), gsettings_arguments); + process.waitForFinished(1000); + gsettings_output = process.readAllStandardOutput(); + } + + // Interpret gsettings value if it succeeded + if (!gsettings_output.isEmpty()) { + QString systeme_theme = QString::fromUtf8(gsettings_output); + LOG_DEBUG(Frontend, "Gsettings output: {}", systeme_theme.toStdString()); + return systeme_theme.contains(QStringLiteral("dark"), Qt::CaseInsensitive); + } + LOG_DEBUG(Frontend, "failed, retrieving theme from palette"); +#endif + // Use default method based on palette swap by OS. + // It is the only method on Windows with Qt 5. + // Windows needs QT_QPA_PLATFORM env variable set to windows:darkmode=2 to force palette change + return (current_palette.color(QPalette::WindowText).lightness() > + current_palette.color(QPalette::Window).lightness()); +} + +void GMainWindow::changeEvent(QEvent* event) { + // PaletteChange event appears to only reach so far into the GUI, explicitly asking to + // UpdateUITheme is a decent work around + if (event->type() == QEvent::PaletteChange || + event->type() == QEvent::ApplicationPaletteChange) { + LOG_INFO(Frontend, + "Window color palette changed by event: {} (QEvent::PaletteChange is: {})", + event->type(), QEvent::PaletteChange); + const QPalette test_palette(qApp->palette()); + // Keeping eye on QPalette::Window to avoid looping. QPalette::Text might be useful too + const QColor window_color = test_palette.color(QPalette::Active, QPalette::Window); + + if (last_window_color != window_color) { + last_window_color = window_color; + + UpdateUITheme(); + } + } else QWidget::changeEvent(event); +} void GMainWindow::LoadTranslation() { bool loaded; @@ -4935,26 +5151,6 @@ void GMainWindow::SetGamemodeEnabled(bool state) { } #endif -void GMainWindow::changeEvent(QEvent* event) { -#ifdef __unix__ - // PaletteChange event appears to only reach so far into the GUI, explicitly asking to - // UpdateUITheme is a decent work around - if (event->type() == QEvent::PaletteChange) { - const QPalette test_palette(qApp->palette()); - const QString& current_theme = UISettings::values.theme; - // Keeping eye on QPalette::Window to avoid looping. QPalette::Text might be useful too - static QColor last_window_color; - const QColor window_color = test_palette.color(QPalette::Active, QPalette::Window); - if (last_window_color != window_color && (current_theme == QStringLiteral("default") || - current_theme == QStringLiteral("colorful"))) { - UpdateUITheme(); - } - last_window_color = window_color; - } -#endif // __unix__ - QWidget::changeEvent(event); -} - Service::AM::FrontendAppletParameters GMainWindow::ApplicationAppletParameters() { return Service::AM::FrontendAppletParameters{ .applet_id = Service::AM::AppletId::Application, diff --git a/src/suyu/main.h b/src/suyu/main.h index 6bbcdd7c58..d0f1bd96e6 100644 --- a/src/suyu/main.h +++ b/src/suyu/main.h @@ -25,9 +25,8 @@ #include "suyu/util/controller_navigation.h" #ifdef __unix__ +#include #include -#include -#include #endif class QtConfig; @@ -165,14 +164,9 @@ class GMainWindow : public QMainWindow { CREATE_SHORTCUT_MSGBOX_APPVOLATILE_WARNING, }; - /** - * Try to load a stylesheet from its path. If the path starts with ":/", its embedded in the app - * @returns true if the text file could be opened as read-only - */ - bool tryLoadStylesheet(const QString& theme_path); - public: void filterBarSetChecked(bool state); + static bool CheckDarkMode(); void UpdateUITheme(); explicit GMainWindow(std::unique_ptr config_, bool has_broken_vulkan); ~GMainWindow() override; @@ -265,12 +259,44 @@ private: void SetDefaultUIGeometry(); void RestoreUIState(); + /** + * Load the icons used by the current theme. Use dark icons if the current mode is dark + */ + void UpdateIcons(const QString& theme_used); + /** + * Set the palette used by the stylsheet for the dark/light mode selected, according to the OS + */ + void UpdateThemePalette(); + /** + * Try to load a stylesheet from its URI. + * If the path starts with ":/", its embedded in the app, otherwise its in a local directory + * @returns true if the text file could be opened as read-only + */ + bool TryLoadStylesheet(const QString& theme_uri); + /** + * Try to load a stylesheet from filesystem path + * @returns true if the text file could be opened as read-only + */ + bool TryLoadStylesheet(const std::filesystem::path& theme_path); + /** + * Default customizations to the stylesheets + */ + void SetCustomStylesheet(); +#ifdef __unix__ + /** + * Create a signal to update the UI theme when the OS color scheme is changed + * @returns true if we could connect to dbus + */ + bool ListenColorSchemeChange(); +#endif void ConnectWidgetEvents(); void ConnectMenuEvents(); void UpdateMenuState(); +#ifdef __unix__ void SetupPrepareForSleep(); +#endif void PreventOSSleep(); void AllowOSSleep(); @@ -401,6 +427,7 @@ private slots: void ResetWindowSize720(); void ResetWindowSize900(); void ResetWindowSize1080(); + void UpdateUITheme(); void OnAlbum(); void OnCabinet(Service::NFP::CabinetMode mode); void OnMiiEdit(); @@ -447,7 +474,7 @@ private: void OpenURL(const QUrl& url); void LoadTranslation(); void OpenPerGameConfiguration(u64 title_id, const std::string& file_name); - bool CheckDarkMode(); + bool CheckSystemArchiveDecryption(); bool CheckFirmwarePresence(); void SetFirmwareVersion(); void ConfigureFilesystemProvider(const std::string& filepath); @@ -531,7 +558,8 @@ private: QTimer update_input_timer; QString startup_icon_theme; - bool os_dark_mode = false; + bool alternate_base_modified = false; + QColor last_window_color; // FS std::shared_ptr vfs; diff --git a/src/suyu/startup_checks.cpp b/src/suyu/startup_checks.cpp index 292fbcbbaa..32011f6d5c 100644 --- a/src/suyu/startup_checks.cpp +++ b/src/suyu/startup_checks.cpp @@ -5,6 +5,8 @@ #ifdef _WIN32 #include +#include +#include #include #include #elif defined(SUYU_UNIX) @@ -36,6 +38,9 @@ void CheckVulkan() { bool CheckEnvVars(bool* is_child) { #ifdef _WIN32 + // Force adapting theme to follow Windows dark mode + qputenv("QT_QPA_PLATFORM", QByteArray("windows:darkmode=2")); + // Check environment variable to see if we are the child char variable_contents[8]; const DWORD startup_check_var = diff --git a/src/suyu/uisettings.cpp b/src/suyu/uisettings.cpp index e382afdf61..8d65905104 100644 --- a/src/suyu/uisettings.cpp +++ b/src/suyu/uisettings.cpp @@ -31,11 +31,6 @@ const Themes included_themes{{ {"Midnight Blue Colorful", ":/colorful_midnight_blue/"}, }}; -bool IsDarkTheme() { - return UISettings::values.theme.contains(QStringLiteral("dark")) || - UISettings::values.theme.contains(QStringLiteral("midnight")); -} - Values values = {}; u32 CalculateWidth(u32 height, Settings::AspectRatio ratio) { diff --git a/src/suyu/uisettings.h b/src/suyu/uisettings.h index 7713c8c73a..6bb903efa7 100644 --- a/src/suyu/uisettings.h +++ b/src/suyu/uisettings.h @@ -35,12 +35,6 @@ extern template class Setting; namespace UISettings { -/** - * Check if the theme is dark - * @returns true if the current theme contains the string "dark" in its name - */ -bool IsDarkTheme(); - struct ContextualShortcut { std::string keyseq; std::string controller_keyseq; @@ -54,13 +48,7 @@ struct Shortcut { ContextualShortcut shortcut; }; -static constexpr std::string_view default_theme{ -#ifdef _WIN32 - "colorful_dark" -#else - "colorful" -#endif -}; +static constexpr std::string_view default_theme{"colorful"}; using Themes = std::array, 6>; extern const Themes included_themes; From 9bba778d1540dddb6e46973731e6bd564f43a25b Mon Sep 17 00:00:00 2001 From: flodavid Date: Sun, 4 Feb 2024 04:05:50 +0100 Subject: [PATCH 080/165] Rework themes to easily use light/dark palette, using only different icons - Renamed themes: - "colorful" to "default" and "colorful_dark" to "default_dark" - "default" to "monochrome" and "default_dark" to "monochrome_dark" - "colorful_midnight_blue" to "qdarkstyle_midnight_blue" - "qdarkstyle_midnight_blue" to "qdarkstyle_midnight_blue_monochrome" - qdarkstyle is renamed from "Dark" to "Mine Shaft" in the UI - default and monochrome themes all use the same qss stylesheet - Remove the ability to select "default_dark" directly - Default has better support for light and dark - Controller and Keyboard applets icons and style adapt to dark mode - Add "qdarkstyle_monochrome" theme - Remove duplicated icon files --- .reuse/dep5 | 52 +- dist/icons/overlay/osk_button_backspace.png | Bin 1272 -> 2938 bytes dist/icons/overlay/overlay.qrc | 60 +- .../arrow_left.png} | Bin .../arrow_right.png} | Bin .../button_A.png} | Bin .../button_B.png} | Bin .../button_L.png} | Bin .../button_R.png} | Bin .../button_X.png} | Bin .../button_Y.png} | Bin .../button_minus.png} | Bin .../button_plus.png} | Bin .../button_press_stick.png} | Bin .../controller_dual_joycon.png} | Bin .../controller_handheld.png} | Bin .../controller_pro.png} | Bin .../controller_single_joycon_left.png} | Bin .../controller_single_joycon_left_a.png} | Bin .../controller_single_joycon_left_b.png} | Bin .../controller_single_joycon_left_x.png} | Bin .../controller_single_joycon_left_y.png} | Bin .../controller_single_joycon_right.png} | Bin .../osk_button_B.png} | Bin .../osk_button_B_disabled.png} | Bin .../osk_button_Y.png} | Bin .../osk_button_Y_disabled.png} | Bin .../osk_button_backspace.png} | Bin .../osk_button_plus.png} | Bin .../osk_button_plus_disabled.png} | Bin .../osk_button_shift.png} | Bin .../osk_button_shift_on.png} | Bin .../colorful/icons/16x16/connected.png | Bin 575 -> 0 bytes .../icons/16x16/connected_notification.png | Bin 760 -> 0 bytes .../colorful/icons/16x16/disconnected.png | Bin 648 -> 0 bytes dist/qt_themes/colorful/icons/16x16/lock.png | Bin 330 -> 0 bytes .../colorful/icons/256x256/plus_folder.png | Bin 4643 -> 0 bytes .../colorful/icons/48x48/bad_folder.png | Bin 528 -> 0 bytes dist/qt_themes/colorful/icons/48x48/chip.png | Bin 582 -> 0 bytes .../qt_themes/colorful/icons/48x48/folder.png | Bin 460 -> 0 bytes .../colorful/icons/48x48/list-add.png | Bin 204 -> 0 bytes .../colorful/icons/48x48/sd_card.png | Bin 228 -> 0 bytes dist/qt_themes/colorful/icons/48x48/star.png | Bin 1108 -> 0 bytes dist/qt_themes/colorful/style.qrc | 30 - .../qt_themes/colorful_dark/icons/index.theme | 8 - dist/qt_themes/colorful_dark/style.qrc | 57 -- .../colorful_midnight_blue/icons/index.theme | 8 - .../colorful_midnight_blue/style.qrc | 63 -- dist/qt_themes/default/default.qrc | 20 +- .../icons/16x16/checked.png | Bin .../icons/16x16/failed.png | Bin .../icons/16x16/info.png | Bin dist/qt_themes/default/icons/16x16/lock.png | Bin 318 -> 330 bytes .../icons/16x16/sync.png | Bin .../icons/16x16/view-refresh.png | Bin .../default/icons/256x256/plus_folder.png | Bin 1948 -> 4643 bytes .../default/icons/48x48/bad_folder.png | Bin 1007 -> 528 bytes dist/qt_themes/default/icons/48x48/chip.png | Bin 511 -> 582 bytes dist/qt_themes/default/icons/48x48/folder.png | Bin 535 -> 460 bytes .../default/icons/48x48/list-add.png | Bin 204 -> 204 bytes .../icons/48x48/no_avatar.png | Bin .../qt_themes/default/icons/48x48/sd_card.png | Bin 198 -> 228 bytes dist/qt_themes/default/icons/48x48/star.png | Bin 1029 -> 1108 bytes dist/qt_themes/default/icons/index.theme | 5 +- dist/qt_themes/default/style.qss | 116 +-- .../icons/16x16/lock.png | Bin .../icons/16x16/view-refresh.png | Bin dist/qt_themes/default_dark/icons/index.theme | 2 +- dist/qt_themes/default_dark/style.qrc | 25 - dist/qt_themes/default_dark/style.qss | 687 ------------------ dist/qt_themes/monochrome/icons.qrc | 32 + .../qt_themes/monochrome/icons/16x16/lock.png | Bin 0 -> 318 bytes .../monochrome/icons/256x256/plus_folder.png | Bin 0 -> 1948 bytes .../monochrome/icons/48x48/bad_folder.png | Bin 0 -> 1007 bytes .../qt_themes/monochrome/icons/48x48/chip.png | Bin 0 -> 511 bytes .../monochrome/icons/48x48/folder.png | Bin 0 -> 535 bytes .../monochrome/icons/48x48/list-add.png | Bin 0 -> 204 bytes .../monochrome/icons/48x48/sd_card.png | Bin 0 -> 198 bytes .../qt_themes/monochrome/icons/48x48/star.png | Bin 0 -> 1029 bytes .../icons/index.theme | 7 +- dist/qt_themes/monochrome/style.qrc | 5 + .../icons/16x16/lock.png | Bin .../icons/256x256/plus_folder.png | Bin .../icons/48x48/bad_folder.png | Bin .../icons/48x48/chip.png | Bin .../icons/48x48/folder.png | Bin .../icons/48x48/list-add.png | Bin .../icons/48x48/no_avatar.png | Bin .../icons/48x48/sd_card.png | Bin .../icons/48x48/star.png | Bin .../monochrome_dark/icons/index.theme | 14 + .../qdarkstyle/{style.qss => dark.qss} | 85 --- dist/qt_themes/qdarkstyle/icons.qrc | 51 ++ .../qdarkstyle/icons/16x16/connected.png | Bin 575 -> 0 bytes .../icons/16x16/connected_notification.png | Bin 760 -> 0 bytes .../qdarkstyle/icons/16x16/disconnected.png | Bin 648 -> 0 bytes .../qdarkstyle/icons/16x16/view-refresh.png | Bin 362 -> 0 bytes dist/qt_themes/qdarkstyle/icons/index.theme | 14 +- dist/qt_themes/qdarkstyle/style.qrc | 63 +- .../{style.qss => dark.qss} | 89 --- .../qdarkstyle_midnight_blue/icons.qrc | 224 ++++++ .../icons/index.theme | 14 +- .../qdarkstyle_midnight_blue/style.qrc | 229 +----- .../icons.qrc | 33 + .../icons/index.theme | 14 + .../style.qrc | 8 + .../qt_themes/qdarkstyle_monochrome/icons.qrc | 33 + .../qdarkstyle_monochrome/icons/index.theme | 14 + .../qt_themes/qdarkstyle_monochrome/style.qrc | 8 + src/suyu/applets/qt_software_keyboard.cpp | 160 ++-- src/suyu/applets/qt_software_keyboard.h | 9 + src/suyu/main.cpp | 17 +- src/suyu/main.h | 1 - src/suyu/uisettings.cpp | 12 +- src/suyu/uisettings.h | 2 +- 115 files changed, 685 insertions(+), 1586 deletions(-) rename dist/icons/{overlay/arrow_left_dark.png => overlay_dark/arrow_left.png} (100%) rename dist/icons/{overlay/arrow_right_dark.png => overlay_dark/arrow_right.png} (100%) rename dist/icons/{overlay/button_A_dark.png => overlay_dark/button_A.png} (100%) rename dist/icons/{overlay/button_B_dark.png => overlay_dark/button_B.png} (100%) rename dist/icons/{overlay/button_L_dark.png => overlay_dark/button_L.png} (100%) rename dist/icons/{overlay/button_R_dark.png => overlay_dark/button_R.png} (100%) rename dist/icons/{overlay/button_X_dark.png => overlay_dark/button_X.png} (100%) rename dist/icons/{overlay/button_Y_dark.png => overlay_dark/button_Y.png} (100%) rename dist/icons/{overlay/button_minus_dark.png => overlay_dark/button_minus.png} (100%) rename dist/icons/{overlay/button_plus_dark.png => overlay_dark/button_plus.png} (100%) rename dist/icons/{overlay/button_press_stick_dark.png => overlay_dark/button_press_stick.png} (100%) rename dist/icons/{overlay/controller_dual_joycon_dark.png => overlay_dark/controller_dual_joycon.png} (100%) rename dist/icons/{overlay/controller_handheld_dark.png => overlay_dark/controller_handheld.png} (100%) rename dist/icons/{overlay/controller_pro_dark.png => overlay_dark/controller_pro.png} (100%) rename dist/icons/{overlay/controller_single_joycon_left_dark.png => overlay_dark/controller_single_joycon_left.png} (100%) rename dist/icons/{overlay/controller_single_joycon_left_a_dark.png => overlay_dark/controller_single_joycon_left_a.png} (100%) rename dist/icons/{overlay/controller_single_joycon_left_b_dark.png => overlay_dark/controller_single_joycon_left_b.png} (100%) rename dist/icons/{overlay/controller_single_joycon_left_x_dark.png => overlay_dark/controller_single_joycon_left_x.png} (100%) rename dist/icons/{overlay/controller_single_joycon_left_y_dark.png => overlay_dark/controller_single_joycon_left_y.png} (100%) rename dist/icons/{overlay/controller_single_joycon_right_dark.png => overlay_dark/controller_single_joycon_right.png} (100%) rename dist/icons/{overlay/osk_button_B_dark.png => overlay_dark/osk_button_B.png} (100%) rename dist/icons/{overlay/osk_button_B_dark_disabled.png => overlay_dark/osk_button_B_disabled.png} (100%) rename dist/icons/{overlay/osk_button_Y_dark.png => overlay_dark/osk_button_Y.png} (100%) rename dist/icons/{overlay/osk_button_Y_dark_disabled.png => overlay_dark/osk_button_Y_disabled.png} (100%) rename dist/icons/{overlay/osk_button_backspace_dark.png => overlay_dark/osk_button_backspace.png} (100%) rename dist/icons/{overlay/osk_button_plus_dark.png => overlay_dark/osk_button_plus.png} (100%) rename dist/icons/{overlay/osk_button_plus_dark_disabled.png => overlay_dark/osk_button_plus_disabled.png} (100%) rename dist/icons/{overlay/osk_button_shift_dark.png => overlay_dark/osk_button_shift.png} (100%) rename dist/icons/{overlay/osk_button_shift_on_dark.png => overlay_dark/osk_button_shift_on.png} (100%) delete mode 100644 dist/qt_themes/colorful/icons/16x16/connected.png delete mode 100644 dist/qt_themes/colorful/icons/16x16/connected_notification.png delete mode 100644 dist/qt_themes/colorful/icons/16x16/disconnected.png delete mode 100644 dist/qt_themes/colorful/icons/16x16/lock.png delete mode 100644 dist/qt_themes/colorful/icons/256x256/plus_folder.png delete mode 100644 dist/qt_themes/colorful/icons/48x48/bad_folder.png delete mode 100644 dist/qt_themes/colorful/icons/48x48/chip.png delete mode 100644 dist/qt_themes/colorful/icons/48x48/folder.png delete mode 100644 dist/qt_themes/colorful/icons/48x48/list-add.png delete mode 100644 dist/qt_themes/colorful/icons/48x48/sd_card.png delete mode 100644 dist/qt_themes/colorful/icons/48x48/star.png delete mode 100644 dist/qt_themes/colorful/style.qrc delete mode 100644 dist/qt_themes/colorful_dark/icons/index.theme delete mode 100644 dist/qt_themes/colorful_dark/style.qrc delete mode 100644 dist/qt_themes/colorful_midnight_blue/icons/index.theme delete mode 100644 dist/qt_themes/colorful_midnight_blue/style.qrc rename dist/qt_themes/{colorful => default}/icons/16x16/checked.png (100%) rename dist/qt_themes/{colorful => default}/icons/16x16/failed.png (100%) rename dist/qt_themes/{colorful => default}/icons/16x16/info.png (100%) rename dist/qt_themes/{colorful => default}/icons/16x16/sync.png (100%) rename dist/qt_themes/{colorful => default}/icons/16x16/view-refresh.png (100%) rename dist/qt_themes/{colorful => default}/icons/48x48/no_avatar.png (100%) rename dist/qt_themes/{colorful_dark => default_dark}/icons/16x16/lock.png (100%) rename dist/qt_themes/{colorful_dark => default_dark}/icons/16x16/view-refresh.png (100%) delete mode 100644 dist/qt_themes/default_dark/style.qrc delete mode 100644 dist/qt_themes/default_dark/style.qss create mode 100644 dist/qt_themes/monochrome/icons.qrc create mode 100644 dist/qt_themes/monochrome/icons/16x16/lock.png create mode 100644 dist/qt_themes/monochrome/icons/256x256/plus_folder.png create mode 100644 dist/qt_themes/monochrome/icons/48x48/bad_folder.png create mode 100644 dist/qt_themes/monochrome/icons/48x48/chip.png create mode 100644 dist/qt_themes/monochrome/icons/48x48/folder.png create mode 100644 dist/qt_themes/monochrome/icons/48x48/list-add.png create mode 100644 dist/qt_themes/monochrome/icons/48x48/sd_card.png create mode 100644 dist/qt_themes/monochrome/icons/48x48/star.png rename dist/qt_themes/{colorful => monochrome}/icons/index.theme (60%) create mode 100644 dist/qt_themes/monochrome/style.qrc rename dist/qt_themes/{qdarkstyle => monochrome_dark}/icons/16x16/lock.png (100%) rename dist/qt_themes/{qdarkstyle => monochrome_dark}/icons/256x256/plus_folder.png (100%) rename dist/qt_themes/{qdarkstyle => monochrome_dark}/icons/48x48/bad_folder.png (100%) rename dist/qt_themes/{qdarkstyle => monochrome_dark}/icons/48x48/chip.png (100%) rename dist/qt_themes/{qdarkstyle => monochrome_dark}/icons/48x48/folder.png (100%) rename dist/qt_themes/{qdarkstyle => monochrome_dark}/icons/48x48/list-add.png (100%) rename dist/qt_themes/{qdarkstyle => monochrome_dark}/icons/48x48/no_avatar.png (100%) rename dist/qt_themes/{qdarkstyle => monochrome_dark}/icons/48x48/sd_card.png (100%) rename dist/qt_themes/{qdarkstyle => monochrome_dark}/icons/48x48/star.png (100%) create mode 100644 dist/qt_themes/monochrome_dark/icons/index.theme rename dist/qt_themes/qdarkstyle/{style.qss => dark.qss} (93%) create mode 100644 dist/qt_themes/qdarkstyle/icons.qrc delete mode 100644 dist/qt_themes/qdarkstyle/icons/16x16/connected.png delete mode 100644 dist/qt_themes/qdarkstyle/icons/16x16/connected_notification.png delete mode 100644 dist/qt_themes/qdarkstyle/icons/16x16/disconnected.png delete mode 100644 dist/qt_themes/qdarkstyle/icons/16x16/view-refresh.png rename dist/qt_themes/qdarkstyle_midnight_blue/{style.qss => dark.qss} (95%) create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/icons.qrc create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue_monochrome/icons.qrc create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue_monochrome/icons/index.theme create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue_monochrome/style.qrc create mode 100644 dist/qt_themes/qdarkstyle_monochrome/icons.qrc create mode 100644 dist/qt_themes/qdarkstyle_monochrome/icons/index.theme create mode 100644 dist/qt_themes/qdarkstyle_monochrome/style.qrc diff --git a/.reuse/dep5 b/.reuse/dep5 index baf1354bf6..9779726e3f 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -5,10 +5,13 @@ Comment: It is best to use this file to record copyright information about Files: dist/english_plurals/* dist/icons/controller/*.png dist/icons/overlay/*.png + dist/icons/overlay_dark/*.png dist/languages/* dist/qt_themes/*/icons/48x48/sd_card.png dist/qt_themes/*/icons/index.theme dist/qt_themes/default/style.qss + dist/qt_themes/*/icons.qrc + dist/qt_themes/*/style.qrc Copyright: yuzu Emulator Project suyu Emulator Project License: GPL-2.0-or-later @@ -22,8 +25,7 @@ Copyright: suyu Emulator Project License: GPL-2.0-or-later Files: dist/qt_themes/qdarkstyle*/LICENSE.* - dist/qt_themes/qdarkstyle*/style.qrc - dist/qt_themes/qdarkstyle*/style.qss + dist/qt_themes/qdarkstyle*/dark.qss Copyright: 2013 Colin Duquesnoy 2019 Daniel Cosmo Pizetta License: MIT @@ -33,28 +35,28 @@ Copyright: 2013 Colin Duquesnoy 2019 Daniel Cosmo Pizetta License: CC-BY-4.0 -Files: dist/qt_themes/default/icons/256x256/plus_folder.png - dist/qt_themes/default/icons/48x48/bad_folder.png - dist/qt_themes/default/icons/48x48/chip.png - dist/qt_themes/default/icons/48x48/folder.png - dist/qt_themes/default/icons/48x48/star.png - dist/qt_themes/qdarkstyle/icons/256x256/plus_folder.png - dist/qt_themes/qdarkstyle/icons/48x48/bad_folder.png - dist/qt_themes/qdarkstyle/icons/48x48/chip.png - dist/qt_themes/qdarkstyle/icons/48x48/folder.png - dist/qt_themes/qdarkstyle/icons/48x48/star.png +Files: dist/qt_themes/monochrome/icons/256x256/plus_folder.png + dist/qt_themes/monochrome/icons/48x48/bad_folder.png + dist/qt_themes/monochrome/icons/48x48/chip.png + dist/qt_themes/monochrome/icons/48x48/folder.png + dist/qt_themes/monochrome/icons/48x48/star.png + dist/qt_themes/monochrome_dark/icons/48x48/bad_folder.png + dist/qt_themes/monochrome_dark/icons/48x48/chip.png + dist/qt_themes/monochrome_dark/icons/48x48/folder.png + dist/qt_themes/monochrome_dark/icons/48x48/star.png + dist/qt_themes/monochrome_dark/icons/256x256/plus_folder.png Copyright: Refactoring UI Inc. License: MIT Comment: https://github.com/tailwindlabs/heroicons -Files: dist/qt_themes/colorful/icons/16x16/lock.png - dist/qt_themes/colorful/icons/256x256/plus_folder.png - dist/qt_themes/colorful/icons/48x48/bad_folder.png - dist/qt_themes/colorful/icons/48x48/chip.png - dist/qt_themes/colorful/icons/48x48/folder.png - dist/qt_themes/colorful_dark/icons/16x16/lock.png - dist/qt_themes/colorful/icons/16x16/info.png - dist/qt_themes/colorful/icons/16x16/sync.png +Files: dist/qt_themes/default/icons/16x16/lock.png + dist/qt_themes/default/icons/256x256/plus_folder.png + dist/qt_themes/default/icons/48x48/bad_folder.png + dist/qt_themes/default/icons/48x48/chip.png + dist/qt_themes/default/icons/48x48/folder.png + dist/qt_themes/default_dark/icons/16x16/lock.png + dist/qt_themes/default/icons/16x16/info.png + dist/qt_themes/default/icons/16x16/sync.png Copyright: Icons8 License: MIT Comment: https://github.com/icons8/flat-color-icons @@ -70,15 +72,15 @@ Files: dist/qt_themes/*/icons/48x48/no_avatar.png Copyright: Ionic (http://ionic.io/) License: MIT -Files: dist/qt_themes/colorful/icons/48x48/star.png - dist/qt_themes/colorful/icons/16x16/checked.png - dist/qt_themes/colorful/icons/16x16/failed.png +Files: dist/qt_themes/default/icons/48x48/star.png + dist/qt_themes/default/icons/16x16/checked.png + dist/qt_themes/default/icons/16x16/failed.png Copyright: SVG Repo License: CC0-1.0 Files: dist/qt_themes/*/icons/16x16/view-refresh.png - dist/qt_themes/default/icons/16x16/lock.png - dist/qt_themes/qdarkstyle/icons/16x16/lock.png + dist/qt_themes/monochrome/icons/16x16/lock.png + dist/qt_themes/monochrome_dark/icons/16x16/lock.png Copyright: Google, Inc. License: Apache-2.0 diff --git a/dist/icons/overlay/osk_button_backspace.png b/dist/icons/overlay/osk_button_backspace.png index b7dc33228250bc2af38d43d24d05c2c25cd73a2b..b212efbbc3301cb6cf45863ef2defefd7cfc69ae 100644 GIT binary patch literal 2938 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 delta 1263 zcmVCEmkaxCG}RWF%OnckANy6U%_W+heyPsJ_)Bnp(R%b9}bm&zm{ zQ6Re|=lFTdPv!AIqCj?A&h_)~YYqnz1>#MJnGdJ;1ri0)JbWYT z4kQWWO7<+pV}GA3cLI_GawT)V;^9-jbwFS$ox>JYT^j_(EYEUf zy@lp!$-DWie39YPipS9jqWD0rwY^vInCo4ONIXsu2_8Wd zALy6%d_wW?BG)Vyk025}f+#+a>B5&J&nZAG9zi5{1bjLV(mdfnu4K-Y#edKI-Vq}8K%{xXfn0N5C5s;vy9D(^ zqn0ATkO)n88U3ncm_{cp^1qWXQ?4M_86{=dkPgqMHo0Hpax@t?So zJbymg?lk}L2>e}3h!_Uy!`uxJl(IDZzy3OfNnvfDmDWg^RBM}A`fNOt28 zuuF?=@71vYknH#iV0I82K|h!wh!V3r zt9cGk{n9?K39|#lYx8-nPfkSPBY2ue1L^Q&LG&KG=0p@e#Ho40fn14~sHKo!+UG(P zJ_f9LG?0#KCci=-cdg?Qg$cmjZAv3Woc-RYXgBMLi;AbH{g0pGXfvwk9bwSOzc zBMLjrB6;Ei0p(77(@(^c5sdFK7jTdMEcZVkl9LcmJ z`HPomKDS632r!dr{F~Kw?WBQ#Y-!f~OCgozk_G~@b;YPKIW1`*z-}!@9)8QlBn<>` zFY%NAof(`o5MYlLM4#1qCk+J1*=X2zOqZmAT#1)^fr^{Fx#qmH08%%sc(?!(caOHu z7eM0Ln{O9D;y%Fqq5$%yGKk+5K;D$c^N#|^8@o8O0>~S#%$Ws{H)eg#Er2``r#~9m Z<4=bU9t_=IpXdMp002ovPDHLkV1g|JP>28k diff --git a/dist/icons/overlay/overlay.qrc b/dist/icons/overlay/overlay.qrc index 8d7833aca0..2319e6dd28 100644 --- a/dist/icons/overlay/overlay.qrc +++ b/dist/icons/overlay/overlay.qrc @@ -6,64 +6,66 @@ SPDX-License-Identifier: GPL-2.0-or-later arrow_left.png - arrow_left_dark.png arrow_right.png - arrow_right_dark.png button_minus.png - button_minus_dark.png button_plus.png - button_plus_dark.png button_A.png - button_A_dark.png button_B.png - button_B_dark.png button_X.png - button_X_dark.png button_Y.png - button_Y_dark.png button_L.png - button_L_dark.png button_R.png - button_R_dark.png button_press_stick.png - button_press_stick_dark.png osk_button_B.png osk_button_B_disabled.png - osk_button_B_dark.png - osk_button_B_dark_disabled.png osk_button_Y.png osk_button_Y_disabled.png - osk_button_Y_dark.png - osk_button_Y_dark_disabled.png osk_button_backspace.png - osk_button_backspace_dark.png osk_button_plus.png osk_button_plus_disabled.png - osk_button_plus_dark.png - osk_button_plus_dark_disabled.png osk_button_shift.png - osk_button_shift_dark.png osk_button_shift_on.png - osk_button_shift_on_dark.png osk_button_shift_lock_on.png osk_button_shift_lock_off.png controller_dual_joycon.png - controller_dual_joycon_dark.png controller_pro.png - controller_pro_dark.png controller_handheld.png - controller_handheld_dark.png controller_single_joycon_left.png - controller_single_joycon_left_dark.png controller_single_joycon_right.png - controller_single_joycon_right_dark.png controller_single_joycon_left_a.png - controller_single_joycon_left_a_dark.png controller_single_joycon_left_b.png - controller_single_joycon_left_b_dark.png controller_single_joycon_left_x.png - controller_single_joycon_left_x_dark.png controller_single_joycon_left_y.png - controller_single_joycon_left_y_dark.png + + + ../overlay_dark/arrow_left.png + ../overlay_dark/arrow_right.png + ../overlay_dark/button_minus.png + ../overlay_dark/button_plus.png + ../overlay_dark/button_A.png + ../overlay_dark/button_B.png + ../overlay_dark/button_X.png + ../overlay_dark/button_Y.png + ../overlay_dark/button_L.png + ../overlay_dark/button_R.png + ../overlay_dark/button_press_stick.png + ../overlay_dark/osk_button_B.png + ../overlay_dark/osk_button_B.png + ../overlay_dark/osk_button_Y.png + ../overlay_dark/osk_button_Y.png + ../overlay_dark/osk_button_backspace.png + ../overlay_dark/osk_button_plus.png + ../overlay_dark/osk_button_plus.png + ../overlay_dark/osk_button_shift.png + ../overlay_dark/osk_button_shift_on.png + ../overlay_dark/controller_dual_joycon.png + ../overlay_dark/controller_pro.png + ../overlay_dark/controller_handheld.png + ../overlay_dark/controller_single_joycon_left.png + ../overlay_dark/controller_single_joycon_right.png + ../overlay_dark/controller_single_joycon_left_a.png + ../overlay_dark/controller_single_joycon_left_b.png + ../overlay_dark/controller_single_joycon_left_x.png + ../overlay_dark/controller_single_joycon_left_y.png diff --git a/dist/icons/overlay/arrow_left_dark.png b/dist/icons/overlay_dark/arrow_left.png similarity index 100% rename from dist/icons/overlay/arrow_left_dark.png rename to dist/icons/overlay_dark/arrow_left.png diff --git a/dist/icons/overlay/arrow_right_dark.png b/dist/icons/overlay_dark/arrow_right.png similarity index 100% rename from dist/icons/overlay/arrow_right_dark.png rename to dist/icons/overlay_dark/arrow_right.png diff --git a/dist/icons/overlay/button_A_dark.png b/dist/icons/overlay_dark/button_A.png similarity index 100% rename from dist/icons/overlay/button_A_dark.png rename to dist/icons/overlay_dark/button_A.png diff --git a/dist/icons/overlay/button_B_dark.png b/dist/icons/overlay_dark/button_B.png similarity index 100% rename from dist/icons/overlay/button_B_dark.png rename to dist/icons/overlay_dark/button_B.png diff --git a/dist/icons/overlay/button_L_dark.png b/dist/icons/overlay_dark/button_L.png similarity index 100% rename from dist/icons/overlay/button_L_dark.png rename to dist/icons/overlay_dark/button_L.png diff --git a/dist/icons/overlay/button_R_dark.png b/dist/icons/overlay_dark/button_R.png similarity index 100% rename from dist/icons/overlay/button_R_dark.png rename to dist/icons/overlay_dark/button_R.png diff --git a/dist/icons/overlay/button_X_dark.png b/dist/icons/overlay_dark/button_X.png similarity index 100% rename from dist/icons/overlay/button_X_dark.png rename to dist/icons/overlay_dark/button_X.png diff --git a/dist/icons/overlay/button_Y_dark.png b/dist/icons/overlay_dark/button_Y.png similarity index 100% rename from dist/icons/overlay/button_Y_dark.png rename to dist/icons/overlay_dark/button_Y.png diff --git a/dist/icons/overlay/button_minus_dark.png b/dist/icons/overlay_dark/button_minus.png similarity index 100% rename from dist/icons/overlay/button_minus_dark.png rename to dist/icons/overlay_dark/button_minus.png diff --git a/dist/icons/overlay/button_plus_dark.png b/dist/icons/overlay_dark/button_plus.png similarity index 100% rename from dist/icons/overlay/button_plus_dark.png rename to dist/icons/overlay_dark/button_plus.png diff --git a/dist/icons/overlay/button_press_stick_dark.png b/dist/icons/overlay_dark/button_press_stick.png similarity index 100% rename from dist/icons/overlay/button_press_stick_dark.png rename to dist/icons/overlay_dark/button_press_stick.png diff --git a/dist/icons/overlay/controller_dual_joycon_dark.png b/dist/icons/overlay_dark/controller_dual_joycon.png similarity index 100% rename from dist/icons/overlay/controller_dual_joycon_dark.png rename to dist/icons/overlay_dark/controller_dual_joycon.png diff --git a/dist/icons/overlay/controller_handheld_dark.png b/dist/icons/overlay_dark/controller_handheld.png similarity index 100% rename from dist/icons/overlay/controller_handheld_dark.png rename to dist/icons/overlay_dark/controller_handheld.png diff --git a/dist/icons/overlay/controller_pro_dark.png b/dist/icons/overlay_dark/controller_pro.png similarity index 100% rename from dist/icons/overlay/controller_pro_dark.png rename to dist/icons/overlay_dark/controller_pro.png diff --git a/dist/icons/overlay/controller_single_joycon_left_dark.png b/dist/icons/overlay_dark/controller_single_joycon_left.png similarity index 100% rename from dist/icons/overlay/controller_single_joycon_left_dark.png rename to dist/icons/overlay_dark/controller_single_joycon_left.png diff --git a/dist/icons/overlay/controller_single_joycon_left_a_dark.png b/dist/icons/overlay_dark/controller_single_joycon_left_a.png similarity index 100% rename from dist/icons/overlay/controller_single_joycon_left_a_dark.png rename to dist/icons/overlay_dark/controller_single_joycon_left_a.png diff --git a/dist/icons/overlay/controller_single_joycon_left_b_dark.png b/dist/icons/overlay_dark/controller_single_joycon_left_b.png similarity index 100% rename from dist/icons/overlay/controller_single_joycon_left_b_dark.png rename to dist/icons/overlay_dark/controller_single_joycon_left_b.png diff --git a/dist/icons/overlay/controller_single_joycon_left_x_dark.png b/dist/icons/overlay_dark/controller_single_joycon_left_x.png similarity index 100% rename from dist/icons/overlay/controller_single_joycon_left_x_dark.png rename to dist/icons/overlay_dark/controller_single_joycon_left_x.png diff --git a/dist/icons/overlay/controller_single_joycon_left_y_dark.png b/dist/icons/overlay_dark/controller_single_joycon_left_y.png similarity index 100% rename from dist/icons/overlay/controller_single_joycon_left_y_dark.png rename to dist/icons/overlay_dark/controller_single_joycon_left_y.png diff --git a/dist/icons/overlay/controller_single_joycon_right_dark.png b/dist/icons/overlay_dark/controller_single_joycon_right.png similarity index 100% rename from dist/icons/overlay/controller_single_joycon_right_dark.png rename to dist/icons/overlay_dark/controller_single_joycon_right.png diff --git a/dist/icons/overlay/osk_button_B_dark.png b/dist/icons/overlay_dark/osk_button_B.png similarity index 100% rename from dist/icons/overlay/osk_button_B_dark.png rename to dist/icons/overlay_dark/osk_button_B.png diff --git a/dist/icons/overlay/osk_button_B_dark_disabled.png b/dist/icons/overlay_dark/osk_button_B_disabled.png similarity index 100% rename from dist/icons/overlay/osk_button_B_dark_disabled.png rename to dist/icons/overlay_dark/osk_button_B_disabled.png diff --git a/dist/icons/overlay/osk_button_Y_dark.png b/dist/icons/overlay_dark/osk_button_Y.png similarity index 100% rename from dist/icons/overlay/osk_button_Y_dark.png rename to dist/icons/overlay_dark/osk_button_Y.png diff --git a/dist/icons/overlay/osk_button_Y_dark_disabled.png b/dist/icons/overlay_dark/osk_button_Y_disabled.png similarity index 100% rename from dist/icons/overlay/osk_button_Y_dark_disabled.png rename to dist/icons/overlay_dark/osk_button_Y_disabled.png diff --git a/dist/icons/overlay/osk_button_backspace_dark.png b/dist/icons/overlay_dark/osk_button_backspace.png similarity index 100% rename from dist/icons/overlay/osk_button_backspace_dark.png rename to dist/icons/overlay_dark/osk_button_backspace.png diff --git a/dist/icons/overlay/osk_button_plus_dark.png b/dist/icons/overlay_dark/osk_button_plus.png similarity index 100% rename from dist/icons/overlay/osk_button_plus_dark.png rename to dist/icons/overlay_dark/osk_button_plus.png diff --git a/dist/icons/overlay/osk_button_plus_dark_disabled.png b/dist/icons/overlay_dark/osk_button_plus_disabled.png similarity index 100% rename from dist/icons/overlay/osk_button_plus_dark_disabled.png rename to dist/icons/overlay_dark/osk_button_plus_disabled.png diff --git a/dist/icons/overlay/osk_button_shift_dark.png b/dist/icons/overlay_dark/osk_button_shift.png similarity index 100% rename from dist/icons/overlay/osk_button_shift_dark.png rename to dist/icons/overlay_dark/osk_button_shift.png diff --git a/dist/icons/overlay/osk_button_shift_on_dark.png b/dist/icons/overlay_dark/osk_button_shift_on.png similarity index 100% rename from dist/icons/overlay/osk_button_shift_on_dark.png rename to dist/icons/overlay_dark/osk_button_shift_on.png diff --git a/dist/qt_themes/colorful/icons/16x16/connected.png b/dist/qt_themes/colorful/icons/16x16/connected.png deleted file mode 100644 index 0afc18cb7a19028fd567a7ca7ced62cd164657de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 575 zcmV-F0>J%=P)0k{|sIn0V`B1xGGFnerg>I4!7^B>UM&p)aM9vQI<{ZJ4 z8HZ4p+_%{7AT1;1-`r}Q8XRRVYW9}G=D3HXRO!FFg z<>v6FfXkm66-$M=OnPPtTpl}lK!#o^J26y#00VLkV5Ig4hAIxCZ~AU@6mMaG2|$+zA&;BarDZyi@16B z4lE8kTwX8y!4LxB2>hW4yn!GbZg+WiA%P|k^Ip;o774}ts6fO6U&y7=hp3TO@-WL? z{^Mh)gLW3&bGqIiV!1gSPQ{V|zW{P&fJjHVbAtc? N002ovPDHLkV1hH82Xp`c diff --git a/dist/qt_themes/colorful/icons/16x16/connected_notification.png b/dist/qt_themes/colorful/icons/16x16/connected_notification.png deleted file mode 100644 index 72466e098e471ae5a97c49a56536dd4bf62b3a08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 760 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0*y&TK~y+Tl~Y|v z6j2oZ?(CguoZVz~OB-RWz#nLd9z^@Yo&q%@j2=qtp^PLV$cmEeAL_xE^2wfrs242~ zp$Ef$h%#S%kW`EcLR4x6ZEJVk8F%j7>CU(tNkRF+;a<+Y=R4my_gvyQ4zjp<{ql`; zI^D*(O+BwTbI<>_2MD8-wl5<%-+In!I@(0@^Fzo{bD*j!D3xKFhG&Lp!dzV1$6_(` z^gLuV6YIgUEb0c8*Ie*2x#lAhY;J={1gb21z6E0ugAZC@F^euEux;jDmV`UFz7l>- zK|xT%#N<56!g^D3Wwr@)QUY z@d)MRLDK?Qog0L{ZY_3>K0_%MP_m~6ird7|QOF|6#=1I$H9tA_=53H>6>z~YHTJ@7 zb_Nd4PV}Lux(a+|27GF2$(u@fs~(9UHZ*jca>r)zc$_}(It@ippva0SLlzB`5RY_2 zDJ%pZ9`=H=;M3EPtE-_V5`;>`*WTHAw^h71&5pJA_QIN1DX?Z|p%fSYQs6=ghhYg- zVhSf|d1>iW;`5ymOPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0v$<2K~y+Tl~PS> zQ$Z9x^WL<1ZG=jLsqtf@CIu;o=wGnd1VlHD;-XFKLZw(mq)@*>1VJ>!or+OVq^`wu znJxuC&?1zmaamnO1NME*%5JoAzwQ9hHiSzzQVT5*fC(vPaz_Kh*+6Kq5b=Zyr$6d-BjRvNsUN9r<)$o0v zs;137DRgyhL@Z{(G)=_g8<0qB!nUp3v1>;LeY^L_vp9U_(^UgFXW)W|)!HD0fHMwq z`Rc|0_8q`L@sq zk>1%G63fVBGANuFmY*(fDuPllKmS8eCS`Em`r?L1hp>O&UTLdSRsk4e>gLt9;4C;0 zLcq{BFQXMa*Fk%G45d;@#y$LM{=|d(5AnGC1hkF9bzQ?)OM&Zp`Y#clJ$)W#YAJ!{ z4H0nGY&P-w?HjzG{fJLxahf`;55)a!M*cR#Fvf$Tw4UQO#< z+13h9kDdH|_{gEo)RvScR^ra>BKrFe$hQ&GwNfR74B5P3+o;Y|898=5|6Tg*(O>)p iN=@~G{{?26=FLU_5=aXOVS_yY0000ROSwGo6XvJPv zzlZ+oGn97-o-r-r&$VfgJ0KmA>2yufc!z{~qGQbm$8Tq=^*@-iIzITdZ+^wR?aTAG zy=^&a8Kl52V{ys6@63-oYYcdPN9cVtn5|nNv)ozk?u}LA z|1=jF*xy&`&-?QyY@&mH_rsJ||S^eTg=tDnm{r-UW|<05{U diff --git a/dist/qt_themes/colorful/icons/256x256/plus_folder.png b/dist/qt_themes/colorful/icons/256x256/plus_folder.png deleted file mode 100644 index 760fe6245e72cd0144b4dd198465db6c902ad400..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4643 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 N&`{A*F1u|N`hPMhH%|Zn diff --git a/dist/qt_themes/colorful/icons/48x48/bad_folder.png b/dist/qt_themes/colorful/icons/48x48/bad_folder.png deleted file mode 100644 index 34069c6b230de579d436fa9f0c21ae37af905b2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 528 zcmV+r0`L8aP)D=(%e@MHK8fkB=Bj zAo71N_TM-+BcNWZW5yA1JUFhvNgbx+#t;a7*^hmf6*R3n7W%qhe}R$vr)HtS?Z$}H zG4o!X(_6sz@(}sdBcmf285ttS{PG$t1;D%q2XCGsu;Kn*4EJ`EV}rNOsB1G50Q+ud zk;W!zsIv`2?JeY3^jMW_j?@CSU7w3IHc5j`^%!idCC8%2D%f^^N-bd7vjgnAMv6H$ zRRc8@7^o_rcZ`lz$ux@g9a}{@0rQS^^6Ppp>nQlxOkH&kI3Aw3BuX6#@;?!z_y14T zWD@^HDbsuT!ZivN`yU9kwIux}`Y&I&S~39%P%Vo&wyKl@Ww{HS`zJUY4#@7Hv$NlKH@gFOfWh#;p`a7> zHS|=Xi|Jg_aj&Q#lU501AZa|+UAa*$TBPeBeF7jKv8Dk59qm|`?ej*L3uX^12YbBVuC(8l1+gV$k**_t@c>ZJWBZB=;`hL$Y!X2M?Al&7anv=x5Djc` zF{wX=?AZ&m9kLRimbq{p`;P&?xFf(F2AivLfXd3&7a92KYV;p~>3ie@1>}zj8+*Yu zi1xtn5y8a+fD4SCBnjp`f!P{6Z7!DRe2Uhd-S73pU@#lExS?7!1ks16+4{ U)=xYDaR2}S07*qoM6N<$f@LZ5LI3~& diff --git a/dist/qt_themes/colorful/icons/48x48/folder.png b/dist/qt_themes/colorful/icons/48x48/folder.png deleted file mode 100644 index 498de4c62940559bcfa3c609f7e7474ee8d86ae3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!hD1*n$B+!?x05z{F*}O5F27(eFndMoj+0rh z&40xH>tws))HAoNDb{TF1AmTbg1vvM{SK{ta!*3~yJ+!)lAVWV&RycPFhE13E=fG| z{;|wSu|F(+sy(|uFZrH++0<`EXXd#6OY88yk-96naQ3a=s-IZ*Mcjyg^Hped$L!qi z%Nu{^ytsFDZ`S68H$NYoZToJXVxeu_-lz9MzHG4Dnwk1|k- z)~iH;!ZoYKb0iMl`PS*vyLEB3S>J-KUs+~KW%p^nb}KG(nEz~9`TJGQDeI0eyQ*M+ z{q3idHxmD6Mc3=>-?Mj)jN*D=sBp1PxMbenmA6-}RqQ-41{geD{an^LB{Ts5V+X_j diff --git a/dist/qt_themes/colorful/icons/48x48/list-add.png b/dist/qt_themes/colorful/icons/48x48/list-add.png deleted file mode 100644 index 74e4882aaedc98b57cce65ae5c0a2683bab31279..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCils0(?ST_0ALmnd!^rR{<%ek|4j}{|ryJ8+ZYEoCO|{#S9F5he4R}c>anM zprE6ti(`m~_uJEkTnq|4&KIBkn;y0>KuJVP%j$`*d51w2Hv=64#i!@TrNPv7(8A5T-G@yGywoSu{iDk diff --git a/dist/qt_themes/colorful/icons/48x48/sd_card.png b/dist/qt_themes/colorful/icons/48x48/sd_card.png deleted file mode 100644 index 652d61bc325bb1aad05f0cf316a540539007db27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC&H|6fVg?31We{epSZZGe6rASi z;uw-~@9nLFybTIGtq-ro-Z`MmY&og?*g;+yH}?gKEOH;;pFMK;H`B`8MbXZ(*FWEC z*meGH_WK=KKQs&offQDYsv`dLmWMB|uJoCySmSNRH zXNIRALK~_ob_p;r)JrZ;FIPU6$&C&jo{= O&EVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGff&c&uf&sqz;-vrp1L;XbK~!i%?U~PS zOi>ia&v{dXiliH?Ea>m5YV=J@_#cF(BsMmFOT@16TZoX5NLUE55E8}4qVW$P%nb1( zn$EO{AYwr)%!F#a<9pxSl&Kl>?zm68m``)xJLk-u`|dgC{+d@RQ>ILKNUVOj#2Qy= zH543u4+o~h}$Yl66AKfZVTN z1_u%lf3?qEJG%pMtyv?S3^;TM*WBQU6Utn$o&iZTwvu=cA^zF6h|BG%2U@d&{S0_= z5ZC;HacHlWtYI|+602FVnIO`WGQ!~RNa5ZVg^L5`$5`c)UviOSjm9gt7)J}8Ennd_IIhAYjbzV_$ z-R3U(L9hBZLcElHUSGJ0}_t za#K6u#u;t;A6y91c|}nN6uuK}$z90DX>AG*=5ypGw*=|DB9H?LhAYw#E3y`AjA6H(U1-B9gn0&roO)bscV1CJA0u^I4ve`2%!{>TpAy09=b-!WT>Oda@r{HvE!H;BCkj^gxa@IHsz20kcfvGmtMh4a|N#xYyvOee95 zjyfs!k|(V=Id - - - - icons/index.theme - icons/16x16/checked.png - icons/16x16/connected.png - icons/16x16/connected_notification.png - icons/16x16/disconnected.png - icons/16x16/failed.png - icons/16x16/info.png - icons/16x16/lock.png - icons/16x16/sync.png - icons/16x16/view-refresh.png - icons/48x48/bad_folder.png - icons/48x48/chip.png - icons/48x48/folder.png - icons/48x48/list-add.png - icons/48x48/no_avatar.png - icons/48x48/sd_card.png - icons/48x48/star.png - icons/256x256/plus_folder.png - - - ../default/style.qss - - diff --git a/dist/qt_themes/colorful_dark/icons/index.theme b/dist/qt_themes/colorful_dark/icons/index.theme deleted file mode 100644 index b37a06df78..0000000000 --- a/dist/qt_themes/colorful_dark/icons/index.theme +++ /dev/null @@ -1,8 +0,0 @@ -[Icon Theme] -Name=colorful_dark -Comment=Colorful theme (Dark style) -Inherits=colorful -Directories=16x16 - -[16x16] -Size=16 diff --git a/dist/qt_themes/colorful_dark/style.qrc b/dist/qt_themes/colorful_dark/style.qrc deleted file mode 100644 index 72451ef023..0000000000 --- a/dist/qt_themes/colorful_dark/style.qrc +++ /dev/null @@ -1,57 +0,0 @@ - - - - - icons/index.theme - icons/16x16/lock.png - icons/16x16/view-refresh.png - - - - ../qdarkstyle/rc/up_arrow_disabled.png - ../qdarkstyle/rc/Hmovetoolbar.png - ../qdarkstyle/rc/stylesheet-branch-end.png - ../qdarkstyle/rc/branch_closed-on.png - ../qdarkstyle/rc/stylesheet-vline.png - ../qdarkstyle/rc/branch_closed.png - ../qdarkstyle/rc/branch_open-on.png - ../qdarkstyle/rc/transparent.png - ../qdarkstyle/rc/right_arrow_disabled.png - ../qdarkstyle/rc/sizegrip.png - ../qdarkstyle/rc/close.png - ../qdarkstyle/rc/close-hover.png - ../qdarkstyle/rc/close-pressed.png - ../qdarkstyle/rc/down_arrow.png - ../qdarkstyle/rc/Vmovetoolbar.png - ../qdarkstyle/rc/left_arrow.png - ../qdarkstyle/rc/stylesheet-branch-more.png - ../qdarkstyle/rc/up_arrow.png - ../qdarkstyle/rc/right_arrow.png - ../qdarkstyle/rc/left_arrow_disabled.png - ../qdarkstyle/rc/Hsepartoolbar.png - ../qdarkstyle/rc/branch_open.png - ../qdarkstyle/rc/Vsepartoolbar.png - ../qdarkstyle/rc/down_arrow_disabled.png - ../qdarkstyle/rc/undock.png - ../qdarkstyle/rc/checkbox_checked_disabled.png - ../qdarkstyle/rc/checkbox_checked_focus.png - ../qdarkstyle/rc/checkbox_checked.png - ../qdarkstyle/rc/checkbox_indeterminate.png - ../qdarkstyle/rc/checkbox_indeterminate_focus.png - ../qdarkstyle/rc/checkbox_unchecked_disabled.png - ../qdarkstyle/rc/checkbox_unchecked_focus.png - ../qdarkstyle/rc/checkbox_unchecked.png - ../qdarkstyle/rc/radio_checked_disabled.png - ../qdarkstyle/rc/radio_checked_focus.png - ../qdarkstyle/rc/radio_checked.png - ../qdarkstyle/rc/radio_unchecked_disabled.png - ../qdarkstyle/rc/radio_unchecked_focus.png - ../qdarkstyle/rc/radio_unchecked.png - - - ../qdarkstyle/style.qss - - diff --git a/dist/qt_themes/colorful_midnight_blue/icons/index.theme b/dist/qt_themes/colorful_midnight_blue/icons/index.theme deleted file mode 100644 index dcb2c50d68..0000000000 --- a/dist/qt_themes/colorful_midnight_blue/icons/index.theme +++ /dev/null @@ -1,8 +0,0 @@ -[Icon Theme] -Name=colorful_midnight_blue -Comment=Colorful theme (Midnight Blue style) -Inherits=colorful -Directories=16x16 - -[16x16] -Size=16 diff --git a/dist/qt_themes/colorful_midnight_blue/style.qrc b/dist/qt_themes/colorful_midnight_blue/style.qrc deleted file mode 100644 index b9821c6722..0000000000 --- a/dist/qt_themes/colorful_midnight_blue/style.qrc +++ /dev/null @@ -1,63 +0,0 @@ - - - - - icons/index.theme - ../colorful_dark/icons/16x16/lock.png - ../qdarkstyle/icons/16x16/view-refresh.png - ../colorful/icons/48x48/bad_folder.png - ../colorful/icons/48x48/chip.png - ../colorful/icons/48x48/folder.png - ../colorful/icons/48x48/list-add.png - ../colorful/icons/48x48/sd_card.png - ../colorful/icons/256x256/plus_folder.png - - - - ../qdarkstyle_midnight_blue/rc/up_arrow_disabled.png - ../qdarkstyle_midnight_blue/rc/Hmovetoolbar.png - ../qdarkstyle_midnight_blue/rc/stylesheet-branch-end.png - ../qdarkstyle_midnight_blue/rc/branch_closed-on.png - ../qdarkstyle_midnight_blue/rc/stylesheet-vline.png - ../qdarkstyle_midnight_blue/rc/branch_closed.png - ../qdarkstyle_midnight_blue/rc/branch_open-on.png - ../qdarkstyle_midnight_blue/rc/transparent.png - ../qdarkstyle_midnight_blue/rc/right_arrow_disabled.png - ../qdarkstyle_midnight_blue/rc/sizegrip.png - ../qdarkstyle_midnight_blue/rc/close.png - ../qdarkstyle_midnight_blue/rc/close-hover.png - ../qdarkstyle_midnight_blue/rc/close-pressed.png - ../qdarkstyle_midnight_blue/rc/down_arrow.png - ../qdarkstyle_midnight_blue/rc/Vmovetoolbar.png - ../qdarkstyle_midnight_blue/rc/left_arrow.png - ../qdarkstyle_midnight_blue/rc/stylesheet-branch-more.png - ../qdarkstyle_midnight_blue/rc/up_arrow.png - ../qdarkstyle_midnight_blue/rc/right_arrow.png - ../qdarkstyle_midnight_blue/rc/left_arrow_disabled.png - ../qdarkstyle_midnight_blue/rc/Hsepartoolbar.png - ../qdarkstyle_midnight_blue/rc/branch_open.png - ../qdarkstyle_midnight_blue/rc/Vsepartoolbar.png - ../qdarkstyle_midnight_blue/rc/down_arrow_disabled.png - ../qdarkstyle_midnight_blue/rc/undock.png - ../qdarkstyle_midnight_blue/rc/checkbox_checked_disabled.png - ../qdarkstyle_midnight_blue/rc/checkbox_checked_focus.png - ../qdarkstyle_midnight_blue/rc/checkbox_checked.png - ../qdarkstyle_midnight_blue/rc/checkbox_indeterminate.png - ../qdarkstyle_midnight_blue/rc/checkbox_indeterminate_focus.png - ../qdarkstyle_midnight_blue/rc/checkbox_unchecked_disabled.png - ../qdarkstyle_midnight_blue/rc/checkbox_unchecked_focus.png - ../qdarkstyle_midnight_blue/rc/checkbox_unchecked.png - ../qdarkstyle_midnight_blue/rc/radio_checked_disabled.png - ../qdarkstyle_midnight_blue/rc/radio_checked_focus.png - ../qdarkstyle_midnight_blue/rc/radio_checked.png - ../qdarkstyle_midnight_blue/rc/radio_unchecked_disabled.png - ../qdarkstyle_midnight_blue/rc/radio_unchecked_focus.png - ../qdarkstyle_midnight_blue/rc/radio_unchecked.png - - - ../qdarkstyle_midnight_blue/style.qss - - diff --git a/dist/qt_themes/default/default.qrc b/dist/qt_themes/default/default.qrc index 4522865b4c..125bc3f342 100644 --- a/dist/qt_themes/default/default.qrc +++ b/dist/qt_themes/default/default.qrc @@ -4,23 +4,37 @@ SPDX-License-Identifier: GPL-2.0-or-later --> + + + style.qss + + + - icons/index.theme icons/16x16/connected.png icons/16x16/connected_notification.png icons/16x16/disconnected.png + icons/16x16/failed.png + icons/16x16/info.png icons/16x16/lock.png + icons/16x16/sync.png + icons/16x16/view-refresh.png icons/48x48/bad_folder.png icons/48x48/chip.png icons/48x48/folder.png icons/48x48/list-add.png + icons/48x48/no_avatar.png icons/48x48/sd_card.png icons/48x48/star.png icons/256x256/plus_folder.png icons/256x256/suyu.png - - style.qss + + + + ../default_dark/icons/index.theme + ../default_dark/icons/16x16/lock.png + ../default_dark/icons/16x16/view-refresh.png diff --git a/dist/qt_themes/colorful/icons/16x16/checked.png b/dist/qt_themes/default/icons/16x16/checked.png similarity index 100% rename from dist/qt_themes/colorful/icons/16x16/checked.png rename to dist/qt_themes/default/icons/16x16/checked.png diff --git a/dist/qt_themes/colorful/icons/16x16/failed.png b/dist/qt_themes/default/icons/16x16/failed.png similarity index 100% rename from dist/qt_themes/colorful/icons/16x16/failed.png rename to dist/qt_themes/default/icons/16x16/failed.png diff --git a/dist/qt_themes/colorful/icons/16x16/info.png b/dist/qt_themes/default/icons/16x16/info.png similarity index 100% rename from dist/qt_themes/colorful/icons/16x16/info.png rename to dist/qt_themes/default/icons/16x16/info.png diff --git a/dist/qt_themes/default/icons/16x16/lock.png b/dist/qt_themes/default/icons/16x16/lock.png index 69d399050804cfa45e00850d4330a5b7cfaa3a43..fd27069d807e26186c8a610bdbcc0ce172562af6 100644 GIT binary patch delta 252 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 N&`{A*F1u|N`hPMhH%|Zn literal 1948 zcma)-eKZsLAIHD5nN5aU-9;WUY$P#{Ym?Uzu!5(^E>B#&inOwpZ8zye?IvXKW~)!Ms)xH zinPlk0077;LI47`YG2aBX8=%(Bzd?~Q{*$RpiC?YcqtZz=o>c=z5GXg`t?63-4fe! zbFgeWf%WwJvdQ=(-W<2)YQ8C{o& zg%KN&u{8KkWTW87Pi~m!JOZ~0vCs!|#E3H1>6G~+t=_=;aI0LIErC@esf7Lra1lT< zUL{8U2vAuo{Vtqwgu!s|aBrP{@QutN5^`F0_o6&8;gQ@@I?pWGjd-lrrD{pw+McyA z<{Ydy^Jk#r2UV2syE+EOj$OiLBbl@NQp?+UMdpXKjail`u+IF!iDa{DftUI1h+kZE z0GS_^&O^mf2*W1qiNGM7b_(}mY%2?y`xRqy99f!HVTYN)XAGU`*d|ya^VQ;K8|kM- z3jerlBsC(&R(~b-X`bGWviEq7Ot&ga$msHIAeU8&^~lmUa?B{)?D9VH$U6Glq-j0I zVG~O986~Y8NtT8=+mA}G-v6l5Xy=%v5EiO@dM;7SYKk|(E>9S;k=Kh^VA*K0504J-a*hl;+5T^(q55GJg8L zGrVw>)<4d=*HGgH&Kl3&7W3+0{OI$?Hl(;#17=+B&dzr*eq8Ocx&Cu7$Vloc3+V!b zP5W29IX^(D)6G2y-le$U*necf?0F{^?!L6QC%M~=`WTkR0F&k&tS2iKEB;v@=;>aU z-V+rDpKb4vQb{)wg-;N~kLg`4QvOemgBk}HJ|)X2qj0LNQ2wtP0Y>E&w! zprWFIzR*eh{r&s!Yj?tGiji5!4`ydL~0$sKS0scSF>V;8?|7YEM!LB`Z zmR?&w2CJplJim6mDjn2JvbJo64=~OI&6E3Cl|#V!5_WX9Vhaa7s!LFjwY@$Fl+UoH z!XufdDz`gmVpLBCenlBaSoUaK2;YacVe4EgDcFNDl4e|pph5F&ey*#OgNQ;e3okpi z4wTdlpm|Ewy7@s6ac7qW&7Q5pDlTwYt+!~HszTdNn=fl7+iVt9T5A~fapw5%(-^z@ z`jK-=F<0UZ9SfCUs4p-fZ=17S4zl3uEJTv&55+ds3MzUm`s!cN=rO8R;iUfWc$X<9 zsHeJb(GnUqf6lYkc$cu%veQrhJ|p)lL@?r(Hy^ASWmYcejvVWma3e}yRmhqczNHRO z{Qt4szjrOkIM=WYFDgk~|MV3Im{s>|PXL=!^J)zp*`=;MF@^q%nbPwfpN7S=&TLA! z8pY?XtLtm?407y*TQt>JhtO6}*dj29k5*mfg&F@?*%z~H2o=l8TDBV4$XGz}1A^vH zzEO3f|0uK+_ChkgZRnUc5Z^Bf11ISl0O5G96Z=%#_uHYp5KA)D=r+*I%`|aKfKlB{ zJVPF|PtDbeloVc9See_AZ0NV*!?2-@vmgV5Y)oyzM`0m??Zw;f;=2m$5-iYGG0_Ua4T1^8k)8-V#duMR9 zXIl;?XR=ymU5;TUze(1MNnXErYbC>*;oPc336Ad{ZFR^bC;vJVxp7IVgjGB}tzbzn z|4S0x3?Yj*F|neAqv$MK)#FI3Q>ci5<$JoYif+Gx6oLfX?61r1Xu?Ra9W4v{9TJU1 z7g$?YVl`fyh@!qiB4@4tI$$Khwz>EEyCjhGB-mC*$NZF^>vz)^DdIR-#gN}6ekRh2 zXW-4fceM7Yf2c})q?U2LpH}v@xm!)PT~#?UM8l2rg3XhB#r7I^Sa2I^bnl6af#l9= zSa97AF_~Graq9C%$({)7W-ABh(CV_(f)Stg4S(jqR|HN@)z*jx=9Dzo(vvF)-y8In zN;B_{gg0;}oOt89<$}b7@)%a%IE|*ryp<|@O!;-otCVvUqLYVTaL0Al{MS!3CGi%} Yh89WFHBF|yt6vw8JpDWxh~e3P1CC-@r2qf` diff --git a/dist/qt_themes/default/icons/48x48/bad_folder.png b/dist/qt_themes/default/icons/48x48/bad_folder.png index 364ec646f6f1c6b5b632fb68efd2602aa2c87f25..34069c6b230de579d436fa9f0c21ae37af905b2e 100644 GIT binary patch delta 503 zcmVMLN`2`L5i1E*bZ0xZA+EWiRRzyd75 z0+!u4eEZa7(PBUW_oJiOcj^3O-H(qLOCa)pFZSO!HzS~4t7FCya6CA!z)2mZY~eTSYnn^Nw}$ z>v}KiDEQb+U3CvQ9-g=)N*xLEKM|z&|4-Fq68}Xh(|h^CH3}8`9|*OzB>g7(FJHJ? tG64xtEsHs}s+0m{xeJ{8Cpa7q$popE`M?eo;{B1n&osBYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vG$ zaR2}!aRGnSI!pin1B6LLK~!i%?U_qx6G0fqceY8JQfje^v^`Z?C}^vKU~SWss8#7B zq7>^BQS_o%D&FixC}>dx@paXk2fb`ZDZ`N1#yeVg56zU<8GBU+9eIp#J@EUkFq1{j3pFdw?%DLe;9&1{xf4~HRFVJbWs4gO*0WZOnAGQDDfvngJ|B@|Er_CrMLvI&}KUPF63tDU+} zHu4pokB2E_rhtzd8%iVXf$ngJ|1ia3wJcx6(n_)N0)IwY>*smAo+q4f{9^0^#k5Ym ztsLbAOnAJ#=$_Rg1-yDZ&wETH%28TCcyq84L#s!mNifwNjkY#ciBu_Sk3cNek5?c3 zsWD#541F15Iv?a4d3h(WRF1L&A|d~3Ea>`)7%IQ{_+{Dc2QLu6iLc^a(T>K3c&rX3 z1zsWj3B_=;jZ8e^3rO;8hQYp#oK3eX^~iLVl1+rr`)T^lJu zs({Fr#zpu9r#Zfe>&A1#;Lj+IubP5$t@m?VuzyUXQpg>F3B3<}qC{lrP&}zm9v86` zt_ui<{7W%#_ltBIm~H4%;-W|$;0Ne4MB*CvM}X_6@#={usi5)06$6iY$_E~HqlmX+ zwH@rsPKnqx5?zS5ieMU;b{2<2fxY35rhVAXKES8oTAPSmy9)Xt1OR#6SL$==RR>Ov#XPMuh06U)WY3f(Jf3*aAUt?W0XXD{?frwy}FYEx@1Okp>)ccpBU+GsvjbfN_gL8l$FL3%p3 z7AA3;zv7H zv$NlKH@gFOfWh#;p`a7>HS|=Xi|Jg_aj&Q#lU501AZa|+UAa*$TBPeBeF7jKv8Dk5 ze;w^um+kXLmkVYMlpEEerQBx#g;3;qrw4ny->$UZmIbjTWRb2Te(?ZM&|~|G3*z^{ zq-+vF0qojdHgVK7zYq;~zqlj79R{1La)8Rp))yK0 z>T2{Kfa!bW0|n%d2^)LCHHh}W@Dahqe*=IEjGiP3<~)Jf8ar(+mgszn)}G`TEFb57 zrOHkr+06?jN9vE!)Eh{BA4vTZFb0xF)Cb}q+CH!X7z0To>I0Mk^tVg^WtNXe+6UHl z0>7F3WqnsRU-W+9EdCE@3Mha(U=39Kwt-~tF_(V@tbhe@rpPOZE8smK ze>p4rtoJlw(sS~Sy_Ung-iEwoLv)`?aNS?OM9DdRze{bt7Y*)v=M)A$(H#DiS)^wYk?h>bk0U9E8N#dFJ zk7Z7Z{bBJ_?b-c#$@lcjrhY3rGspE`T8H<(#ta z__C`C_SfHjI(Z}Ue^zw8&i*}n=g26o2Zjq5>x4_@{atx`@A(p6txs?A`x& zH+P$zDR?}dd{Y-5qcq?&j$$V^VkMm620jJ78Zm`e_>qz)*nf;QVHMxeR!9z)a0X9MeSdR~J!&X``4#E0ETKP|3pDHOwoRWba)+CxW{lhf5VzqmN=u#sSn&Z| z;{&+H2XKuK;2IymH9mlAd;r(@0IpF0t+klgR;^uQtEs2}_oa4>zVMhO2Et<$-76Q` z@eQMQ`;Vx#7cGgnMl~#>_8Fozs^&HfIKb$Wd2k=g^itz9+6HD()!K_OR?wVESyVL! z%ZfH8@e*w(W;ppv)}K?`k`@X>S1?**}8GQ4U;xaoziYw&aP9>#K6FCLDMcJ zMv;L*jPcAXhggPH51kpFeh6)-s@NsKz)&x_JiT1`SSCY{P>+xfP&EvkxzRcGd*aWf ccAs{iWzSA@?$SRO+zyiTboFyt=akR{02`=D;Q#;t delta 149 zcmaFDc#Ls^WqpOGi(^Q}y|>pL`5Fv3SR6k5uRo@K6Ysy;;tX-dvfr70TTlQgYD^lA8tm5GmKYK9DMB>XWemnD#Xmdutj3| x>TEw(y-SO~EY62-=%@ed%(4DlnH&a{XiVnHj+glfIxdw<{Dl&Kl>?zm68m``)x zJLk-u`|dgC{+d@RQ>ILKNUVOj#2Qy=H543u4+o~h}$Yl66AKfZVTN1_u%lf3?qEJG%pMtyv?S3^;TM*WBQU6Utn$ zo&iZTwvu=cA%FhawusB^sRvrKg8dA5auC=2fpKWBmaJhl0}`ukA$A@?EYz-GLc83N zR2i~@-3+j^UtP0GUKoGfTDF3<3`o4O3FGG}#9~1~7Gx=Rq*UF1#$pCUt@}aRW7M*? zFIdTd+^cDzNaPvBpaJoSxrN<+^__ph*a3+*&Bya=F@F$haL%bA;cA#&lm&i;;Jijj z;F$58JZBI+8HE1>9PN9b{WutT9gy42RWxmMAsSzZM)jRA#;F-)j;a$PBPcJBp*{ra zCAz4~kC)iVanB{k0g2ZigJmnCTcu4?3#MW8?Hosw<8vr?%vOyZMuj_Cn|cVvX)Jw2 zYd$#+aDUD75vq)IV#wUorm2I-Ey{db%`4u1)fS)pbKt?UY2;AG*=5ypGw*=|DB9H?LhAYw#E3y`AjA6H(U1-B9gn0&r zoPT;;ZFgQ#K_4S^S`Li41I&xHWS;Hp;0--D^p*T0lzP1k(b_t$Elx!bCsZtp)qj<*O-oPg=d**0_9}GA%|M|Xej&tVxXD-ZPc9DpYdjqf?NCHoQ zS21cCMHX-wW!zdW0rO_jS7;o=X+Bks&Z4hSNC5qKPoST8mu+NJV>djmi?yxVq@d|F zxlh#Z0}n*oUVp=yM)4l|)2;^^MB9g1a~FX1*o{sA`M^Tpr|4T}O4Q^MlFR22Fot>u z9tXt!6L^FDDIc=*9Tt6WXWU%?)?ha{2^3lS7XiOT%xV+Drk0Rg65YU%r9O;GC;Y}_ zglv!Y1wak3EF{lCQNQgHa|_sEsW$@OLh=s)&rlmfAb++2pYi^h29-ZRi3@Lu?#q<- z6RNkNi5e1&2_I@uEpq4@ujnh^_`3|fS^c&gka;sZN^$|~JHSj|z0HJWjM@5Z#Y5tIWjT|}m^rw8d` z7tUQKskO>|#$|+Dpv^^4=KATN8|MRQBj#;e9)A%(M&Ob;SLj_Pg-p`v98v$80Y?g7 z0=NT_$prR`dXyzJ<3~-?2XwECfY?wk1p9nqi-DcG6#K;W3C?;WPCd{i#9CcqvQR0n z_1iH9oYH*~t%9@5xND91I1fAWns6y9{r1Y`UjWO+n2jQ449JUP0(*qeC+rusb-;HY z^M9!_jD5RIpi&cSOkErk=oBLDx;+o*@Gv{5i(6j@(@(lx^mUpxpM$z4v5M3HYk?jQ zgAY;X*HZnrTTGAUs1fZ$WbjS!gWT>0ffk%wY7%vUbsYQhO6WFuxs}u$Eja&E#_msH z`nN7?ChGP?dx1(Ho=P3#Hdb=hnw&r}@Mz0JI909@?jw}1WBs@$2zTI53+Ft7r4Ob>lo6-L4Y};3R4rOrlcXJ3v_k&NARG(<%BeaDteBN6Q9Q0EGrQ3sIBtx~rYT d9Om%9;xE_n=@mA1l}`Ww002ovPDHLkV1gj%$m9S3 diff --git a/dist/qt_themes/default/icons/index.theme b/dist/qt_themes/default/icons/index.theme index 21b35e3e3c..6c455463ee 100644 --- a/dist/qt_themes/default/icons/index.theme +++ b/dist/qt_themes/default/icons/index.theme @@ -1,7 +1,6 @@ [Icon Theme] Name=default -Comment=default theme -Inherits=colorful +Comment=Colorful theme Directories=16x16,48x48,256x256 [16x16] @@ -9,6 +8,6 @@ Size=16 [48x48] Size=48 - + [256x256] Size=256 diff --git a/dist/qt_themes/default/style.qss b/dist/qt_themes/default/style.qss index bd9c1964cf..16b779b1b8 100644 --- a/dist/qt_themes/default/style.qss +++ b/dist/qt_themes/default/style.qss @@ -22,7 +22,7 @@ QPushButton#TogglableStatusBarButton { } QPushButton#TogglableStatusBarButton:checked { - color: #000000; + color: palette(text); } QPushButton#TogglableStatusBarButton:hover { @@ -49,6 +49,10 @@ QPushButton#RendererStatusBarButton:!checked { color: #0066ff; } +QPushButton#RendererStatusBarButton:!checked[dark=true] { + color: #00ccdd; +} + QPushButton#GPUStatusBarButton { color: #656565; border: 1px solid transparent; @@ -65,13 +69,21 @@ QPushButton#GPUStatusBarButton:checked { color: #b06020; } +QPushButton#GPUStatusBarButton:checked[dark=true] { + color: #ff8040; +} + QPushButton#GPUStatusBarButton:!checked { color: #109010; } +QPushButton#GPUStatusBarButton:!checked[dark=true] { + color: #40dd40; +} + QPushButton#DockingStatusBarButton { min-width: 0px; - color: #000000; + color: palette(text); border: 1px solid transparent; background-color: transparent; padding: 0px 3px 0px 3px; @@ -131,10 +143,6 @@ QWidget#connectedControllers { background: transparent; } -QWidget#closeButtons { - background: transparent; -} - QWidget#playersSupported, QWidget#controllersSupported, QWidget#controllerSupported1, @@ -383,7 +391,7 @@ QStackedWidget#stackedDialog QTextBrowser QScrollBar::vertical { border-radius: 4px; } -QStackedWidget#stackedDialog QTextBrowser QScrollBar::horizoncal { +QStackedWidget#stackedDialog QTextBrowser QScrollBar::horizontal { background: #cdcdcd; height: 15px; margin: 3px 15px 3px 15px; @@ -592,42 +600,6 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:pressed { border-radius: 6px; } -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { - image: url(:/overlay/osk_button_B.png); - image-position: right; - qproperty-icon: url(:/overlay/osk_button_backspace.png); - qproperty-iconSize: 36px; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { - image: url(:/overlay/osk_button_Y.png); - image-position: right; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { - image: url(:/overlay/osk_button_plus.png); - image-position: right; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift { - image: url(:/overlay/osk_button_shift_lock_off.png); - image-position: left; - qproperty-icon: url(:/overlay/osk_button_shift.png); - qproperty-iconSize: 36px; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift { - image: url(:/overlay/osk_button_shift_lock_off.png); - image-position: left; - qproperty-icon: url(:/overlay/osk_button_shift_on.png); - qproperty-iconSize: 36px; -} - QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_bracket, QDialog#QtSoftwareKeyboardDialog QPushButton#button_right_bracket, QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_parenthesis, @@ -640,47 +612,6 @@ QDialog#QtSoftwareKeyboardDialog QWidget#titleOSK QLabel { color: #ccc; } -QDialog#QtSoftwareKeyboardDialog QWidget#button_L, -QDialog#QtSoftwareKeyboardDialog QWidget#button_L_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_L_num { - image: url(:/overlay/button_L.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_num { - image: url(:/overlay/arrow_left.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_R, -QDialog#QtSoftwareKeyboardDialog QWidget#button_R_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_R_num { - image: url(:/overlay/button_R.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_num { - image: url(:/overlay/arrow_right.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick, -QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick_shift { - image: url(:/overlay/button_press_stick.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_X, -QDialog#QtSoftwareKeyboardDialog QWidget#button_X_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_X_num { - image: url(:/overlay/button_X.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_A, -QDialog#QtSoftwareKeyboardDialog QWidget#button_A_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_A_num { - image: url(:/overlay/button_A.png); -} - QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled, @@ -711,20 +642,3 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_0:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled { color: palette(midlight); } - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled { - image: url(:/overlay/osk_button_plus_disabled.png); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { - image: url(:/overlay/osk_button_B_disabled.png); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled { - image: url(:/overlay/osk_button_Y_disabled.png); -} diff --git a/dist/qt_themes/colorful_dark/icons/16x16/lock.png b/dist/qt_themes/default_dark/icons/16x16/lock.png similarity index 100% rename from dist/qt_themes/colorful_dark/icons/16x16/lock.png rename to dist/qt_themes/default_dark/icons/16x16/lock.png diff --git a/dist/qt_themes/colorful_dark/icons/16x16/view-refresh.png b/dist/qt_themes/default_dark/icons/16x16/view-refresh.png similarity index 100% rename from dist/qt_themes/colorful_dark/icons/16x16/view-refresh.png rename to dist/qt_themes/default_dark/icons/16x16/view-refresh.png diff --git a/dist/qt_themes/default_dark/icons/index.theme b/dist/qt_themes/default_dark/icons/index.theme index 60a072d1d6..32d84fa9bd 100644 --- a/dist/qt_themes/default_dark/icons/index.theme +++ b/dist/qt_themes/default_dark/icons/index.theme @@ -1,7 +1,7 @@ [Icon Theme] Name=default_dark Comment=Colorful theme (Dark style) -Inherits=colorful +Inherits=default Directories=16x16 [16x16] diff --git a/dist/qt_themes/default_dark/style.qrc b/dist/qt_themes/default_dark/style.qrc deleted file mode 100644 index 7de4737c2c..0000000000 --- a/dist/qt_themes/default_dark/style.qrc +++ /dev/null @@ -1,25 +0,0 @@ - - - - ../colorful/icons/16x16/connected.png - ../colorful/icons/16x16/connected_notification.png - ../colorful/icons/16x16/disconnected.png - icons/index.theme - ../colorful_dark/icons/16x16/lock.png - ../colorful_dark/icons/16x16/view-refresh.png - ../colorful/icons/48x48/bad_folder.png - ../colorful/icons/48x48/chip.png - ../colorful/icons/48x48/folder.png - ../qdarkstyle/icons/48x48/no_avatar.png - ../colorful/icons/48x48/list-add.png - ../colorful/icons/48x48/sd_card.png - ../colorful/icons/256x256/plus_folder.png - - - - style.qss - - diff --git a/dist/qt_themes/default_dark/style.qss b/dist/qt_themes/default_dark/style.qss deleted file mode 100644 index ca6daa2d52..0000000000 --- a/dist/qt_themes/default_dark/style.qss +++ /dev/null @@ -1,687 +0,0 @@ -/* -* SPDX-FileCopyrightText: 2018 yuzu Emulator Project -* SPDX-License-Identifier: GPL-2.0-or-later -*/ -QAbstractSpinBox { - min-height: 19px; -} - -QPushButton#TogglableStatusBarButton { - color: #959595; - border: 1px solid transparent; - background-color: transparent; - padding: 0px 3px 0px 3px; - text-align: center; -} - -QPushButton#TogglableStatusBarButton:checked { - color: palette(text); -} - -QPushButton#TogglableStatusBarButton:hover { - border: 1px solid #76797C; -} - -QPushButton#RendererStatusBarButton { - color: #656565; - border: 1px solid transparent; - background-color: transparent; - padding: 0px 3px 0px 3px; - text-align: center; -} - -QPushButton#RendererStatusBarButton:hover { - border: 1px solid #76797C; -} - -QPushButton#RendererStatusBarButton:checked { - color: #e85c00; -} - -QPushButton#RendererStatusBarButton:!checked { - color: #00ccdd; -} - -QPushButton#GPUStatusBarButton { - color: #656565; - border: 1px solid transparent; - background-color: transparent; - padding: 0px 3px 0px 3px; - text-align: center; -} - -QPushButton#GPUStatusBarButton:hover { - border: 1px solid #76797C; -} - -QPushButton#GPUStatusBarButton:checked { - color: #ff8040; -} - -QPushButton#GPUStatusBarButton:!checked { - color: #40dd40; -} - -QPushButton#DockingStatusBarButton { - min-width: 0px; - color: palette(text); - border: 1px solid transparent; - background-color: transparent; - padding: 0px 3px 0px 3px; - text-align: center; -} - -QPushButton#DockingStatusBarButton:hover { - border: 1px solid #76797C; -} - -QPushButton#buttonRefreshDevices { - min-width: 21px; - min-height: 21px; - max-width: 21px; - max-height: 21px; -} - -QWidget#bottomPerGameInput, -QWidget#topControllerApplet, -QWidget#bottomControllerApplet, -QGroupBox#groupPlayer1Connected:checked, -QGroupBox#groupPlayer2Connected:checked, -QGroupBox#groupPlayer3Connected:checked, -QGroupBox#groupPlayer4Connected:checked, -QGroupBox#groupPlayer5Connected:checked, -QGroupBox#groupPlayer6Connected:checked, -QGroupBox#groupPlayer7Connected:checked, -QGroupBox#groupPlayer8Connected:checked { - background-color: #f5f5f5; -} - -QWidget#topControllerApplet { - border-bottom: 1px solid #828790 -} - -QWidget#bottomPerGameInput, -QWidget#bottomControllerApplet { - border-top: 1px solid #828790 -} - -QWidget#topPerGameInput, -QWidget#middleControllerApplet { - background-color: #fff; -} - -QWidget#topPerGameInput QComboBox, -QWidget#middleControllerApplet QComboBox { - width: 120px; -} - -QWidget#connectedControllers { - background: transparent; -} - -QWidget#playersSupported, -QWidget#controllersSupported, -QWidget#controllerSupported1, -QWidget#controllerSupported2, -QWidget#controllerSupported3, -QWidget#controllerSupported4, -QWidget#controllerSupported5, -QWidget#controllerSupported6 { - border: none; - background: transparent; -} - -QGroupBox#groupPlayer1Connected, -QGroupBox#groupPlayer2Connected, -QGroupBox#groupPlayer3Connected, -QGroupBox#groupPlayer4Connected, -QGroupBox#groupPlayer5Connected, -QGroupBox#groupPlayer6Connected, -QGroupBox#groupPlayer7Connected, -QGroupBox#groupPlayer8Connected { - border: 1px solid #828790; - border-radius: 3px; - padding: 0px; - min-height: 98px; - max-height: 98px; -} - -QGroupBox#groupPlayer1Connected:unchecked, -QGroupBox#groupPlayer2Connected:unchecked, -QGroupBox#groupPlayer3Connected:unchecked, -QGroupBox#groupPlayer4Connected:unchecked, -QGroupBox#groupPlayer5Connected:unchecked, -QGroupBox#groupPlayer6Connected:unchecked, -QGroupBox#groupPlayer7Connected:unchecked, -QGroupBox#groupPlayer8Connected:unchecked { - border: 1px solid #d9d9d9; -} - -QGroupBox#groupPlayer1Connected::title, -QGroupBox#groupPlayer2Connected::title, -QGroupBox#groupPlayer3Connected::title, -QGroupBox#groupPlayer4Connected::title, -QGroupBox#groupPlayer5Connected::title, -QGroupBox#groupPlayer6Connected::title, -QGroupBox#groupPlayer7Connected::title, -QGroupBox#groupPlayer8Connected::title { - subcontrol-origin: margin; - subcontrol-position: top left; - padding-left: 0px; - padding-right: 0px; - padding-top: 1px; - margin-left: 0px; - margin-right: -4px; - margin-bottom: 4px; -} - -QCheckBox#checkboxPlayer1Connected, -QCheckBox#checkboxPlayer2Connected, -QCheckBox#checkboxPlayer3Connected, -QCheckBox#checkboxPlayer4Connected, -QCheckBox#checkboxPlayer5Connected, -QCheckBox#checkboxPlayer6Connected, -QCheckBox#checkboxPlayer7Connected, -QCheckBox#checkboxPlayer8Connected { - spacing: 0px; -} - -QWidget#Player1LEDs QCheckBox, -QWidget#Player2LEDs QCheckBox, -QWidget#Player3LEDs QCheckBox, -QWidget#Player4LEDs QCheckBox, -QWidget#Player5LEDs QCheckBox, -QWidget#Player6LEDs QCheckBox, -QWidget#Player7LEDs QCheckBox, -QWidget#Player8LEDs QCheckBox { - spacing: 0px; -} - -QWidget#Player1LEDs QCheckBox::indicator, -QWidget#Player2LEDs QCheckBox::indicator, -QWidget#Player3LEDs QCheckBox::indicator, -QWidget#Player4LEDs QCheckBox::indicator, -QWidget#Player5LEDs QCheckBox::indicator, -QWidget#Player6LEDs QCheckBox::indicator, -QWidget#Player7LEDs QCheckBox::indicator, -QWidget#Player8LEDs QCheckBox::indicator { - width: 6px; - height: 6px; - margin-left: 0px; -} - -QWidget#bottomPerGameInput QCheckBox#checkboxPlayer1Connected::indicator, -QWidget#bottomPerGameInput QCheckBox#checkboxPlayer2Connected::indicator, -QWidget#bottomPerGameInput QCheckBox#checkboxPlayer3Connected::indicator, -QWidget#bottomPerGameInput QCheckBox#checkboxPlayer4Connected::indicator, -QWidget#bottomPerGameInput QCheckBox#checkboxPlayer5Connected::indicator, -QWidget#bottomPerGameInput QCheckBox#checkboxPlayer6Connected::indicator, -QWidget#bottomPerGameInput QCheckBox#checkboxPlayer7Connected::indicator, -QWidget#bottomPerGameInput QCheckBox#checkboxPlayer8Connected::indicator { - width: 12px; - height: 12px; -} - -QCheckBox#checkboxPlayer1Connected::indicator, -QCheckBox#checkboxPlayer2Connected::indicator, -QCheckBox#checkboxPlayer3Connected::indicator, -QCheckBox#checkboxPlayer4Connected::indicator, -QCheckBox#checkboxPlayer5Connected::indicator, -QCheckBox#checkboxPlayer6Connected::indicator, -QCheckBox#checkboxPlayer7Connected::indicator, -QCheckBox#checkboxPlayer8Connected::indicator { - width: 14px; - height: 14px; -} - -QGroupBox#groupPlayer1Connected::indicator, -QGroupBox#groupPlayer2Connected::indicator, -QGroupBox#groupPlayer3Connected::indicator, -QGroupBox#groupPlayer4Connected::indicator, -QGroupBox#groupPlayer5Connected::indicator, -QGroupBox#groupPlayer6Connected::indicator, -QGroupBox#groupPlayer7Connected::indicator, -QGroupBox#groupPlayer8Connected::indicator { - width: 16px; - height: 16px; -} - -QWidget#Player1LEDs QCheckBox::indicator:checked, -QWidget#Player2LEDs QCheckBox::indicator:checked, -QWidget#Player3LEDs QCheckBox::indicator:checked, -QWidget#Player4LEDs QCheckBox::indicator:checked, -QWidget#Player5LEDs QCheckBox::indicator:checked, -QWidget#Player6LEDs QCheckBox::indicator:checked, -QWidget#Player7LEDs QCheckBox::indicator:checked, -QWidget#Player8LEDs QCheckBox::indicator:checked, -QGroupBox#groupPlayer1Connected::indicator:checked, -QGroupBox#groupPlayer2Connected::indicator:checked, -QGroupBox#groupPlayer3Connected::indicator:checked, -QGroupBox#groupPlayer4Connected::indicator:checked, -QGroupBox#groupPlayer5Connected::indicator:checked, -QGroupBox#groupPlayer6Connected::indicator:checked, -QGroupBox#groupPlayer7Connected::indicator:checked, -QGroupBox#groupPlayer8Connected::indicator:checked, -QCheckBox#checkboxPlayer1Connected::indicator:checked, -QCheckBox#checkboxPlayer2Connected::indicator:checked, -QCheckBox#checkboxPlayer3Connected::indicator:checked, -QCheckBox#checkboxPlayer4Connected::indicator:checked, -QCheckBox#checkboxPlayer5Connected::indicator:checked, -QCheckBox#checkboxPlayer6Connected::indicator:checked, -QCheckBox#checkboxPlayer7Connected::indicator:checked, -QCheckBox#checkboxPlayer8Connected::indicator:checked, -QGroupBox#groupConnectedController::indicator:checked { - border-radius: 2px; - border: 1px solid #929192; - background: #39ff14; - image: none; -} - -QWidget#Player1LEDs QCheckBox::indicator:unchecked, -QWidget#Player2LEDs QCheckBox::indicator:unchecked, -QWidget#Player3LEDs QCheckBox::indicator:unchecked, -QWidget#Player4LEDs QCheckBox::indicator:unchecked, -QWidget#Player5LEDs QCheckBox::indicator:unchecked, -QWidget#Player6LEDs QCheckBox::indicator:unchecked, -QWidget#Player7LEDs QCheckBox::indicator:unchecked, -QWidget#Player8LEDs QCheckBox::indicator:unchecked, -QGroupBox#groupPlayer1Connected::indicator:unchecked, -QGroupBox#groupPlayer2Connected::indicator:unchecked, -QGroupBox#groupPlayer3Connected::indicator:unchecked, -QGroupBox#groupPlayer4Connected::indicator:unchecked, -QGroupBox#groupPlayer5Connected::indicator:unchecked, -QGroupBox#groupPlayer6Connected::indicator:unchecked, -QGroupBox#groupPlayer7Connected::indicator:unchecked, -QGroupBox#groupPlayer8Connected::indicator:unchecked, -QCheckBox#checkboxPlayer1Connected::indicator:unchecked, -QCheckBox#checkboxPlayer2Connected::indicator:unchecked, -QCheckBox#checkboxPlayer3Connected::indicator:unchecked, -QCheckBox#checkboxPlayer4Connected::indicator:unchecked, -QCheckBox#checkboxPlayer5Connected::indicator:unchecked, -QCheckBox#checkboxPlayer6Connected::indicator:unchecked, -QCheckBox#checkboxPlayer7Connected::indicator:unchecked, -QCheckBox#checkboxPlayer8Connected::indicator:unchecked, -QGroupBox#groupConnectedController::indicator:unchecked { - border-radius: 2px; - border: 1px solid #929192; - background: transparent; - image: none; -} - -QWidget#controllerPlayer1, -QWidget#controllerPlayer2, -QWidget#controllerPlayer3, -QWidget#controllerPlayer4, -QWidget#controllerPlayer5, -QWidget#controllerPlayer6, -QWidget#controllerPlayer7, -QWidget#controllerPlayer8 { - background: transparent; -} - -QDialog#QtSoftwareKeyboardDialog, -QStackedWidget#topOSK { - background: rgba(51, 51, 51, .9); -} - - -QDialog#OverlayDialog, -QStackedWidget#stackedDialog { - background: rgba(51, 51, 51, .7); -} - -QWidget#boxOSK, -QWidget#lineOSK, -QWidget#richDialog, -QWidget#lineDialog { - background: transparent; -} - -QStackedWidget#bottomOSK, -QWidget#contentDialog, -QWidget#contentRichDialog { - background: rgba(240, 240, 240, 1); -} - -QWidget#contentDialog, -QWidget#contentRichDialog { - margin: 5px; - border-radius: 6px; -} - -QWidget#buttonsDialog, -QWidget#buttonsRichDialog { - margin: 5px; - border-top: 2px solid rgba(44, 44, 44, 1); -} - -QWidget#legendOSKnum { - border-top: 1px solid rgba(44, 44, 44, 1); -} - -QStackedWidget#stackedDialog QTextBrowser QScrollBar::vertical { - background: #cdcdcd; - width: 15px; - margin: 15px 3px 15px 3px; - border: 1px transparent; - border-radius: 4px; -} - -QStackedWidget#stackedDialog QTextBrowser QScrollBar::horizoncal { - background: #cdcdcd; - height: 15px; - margin: 3px 15px 3px 15px; - border: 1px transparent; - border-radius: 4px; -} - -QStackedWidget#stackedDialog QTextBrowser QScrollBar::handle { - background: #fff; - border-radius: 4px; - min-height: 5px; - min-width: 5px; -} - -QStackedWidget#stackedDialog QTextBrowser QScrollBar::add-line, -QStackedWidget#stackedDialog QTextBrowser QScrollBar::sub-line, -QStackedWidget#stackedDialog QTextBrowser QScrollBar::add-page, -QStackedWidget#stackedDialog QTextBrowser QScrollBar::sub-page { - background: none; -} - -QWidget#inputOSK { - border-bottom: 3px solid rgba(255, 255, 255, .9); -} - -QWidget#inputOSK QLineEdit { - background: transparent; - border: none; - color: #ccc; -} - -QWidget#inputBoxOSK { - border: 2px solid rgba(255, 255, 255, .9); -} - -QWidget#inputBoxOSK QTextEdit { - background: transparent; - border: none; - color: #ccc; -} - -QWidget#richDialog QTextBrowser { - background: transparent; - border: none; - padding: 35px 65px; -} - - -QWidget#lineOSK QLabel#label_header { - color: #f0f0f0; -} - -QWidget#lineOSK QLabel#label_sub, -QWidget#lineOSK QLabel#label_characters, -QWidget#boxOSK QLabel#label_characters_box { - color: #ccc; -} - -QWidget#contentDialog QLabel#label_title, -QWidget#contentRichDialog QLabel#label_title_rich { - color: #888; -} - -QWidget#contentDialog QLabel#label_dialog { - padding: 20px 65px; -} - -QWidget#contentDialog QLabel#label_title, -QWidget#contentRichDialog QLabel#label_title_rich { - padding: 0px 65px; -} - -QDialog#OverlayDialog QPushButton { - color: rgba(49, 79, 239, 1); - background: transparent; - border: none; - padding: 0px; - min-width: 0px; -} - -QDialog#OverlayDialog QPushButton:focus, -QDialog#OverlayDialog QPushButton:hover { - color: rgba(49, 79, 239, 1); - background: rgba(255, 255, 255, 1); - border: 5px solid rgba(148, 250, 202, 1); - border-radius: 6px; - outline: none; -} - -QDialog#OverlayDialog QPushButton:pressed { - color: rgba(240, 240, 240, 1); - background: rgba(150, 150, 150, 1); - border: 5px solid rgba(148, 250, 202, 1); - border-radius: 6px; - outline: none; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton { - background: rgba(232, 232, 232, 1); - border: 2px solid rgba(240, 240, 240, 1); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { - background: rgba(218, 218, 218, 1); - border: 2px solid rgba(240, 240, 240, 1); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { - color: rgba(240, 240, 240, 1); - background: rgba(44, 44, 44, 1); - border: 2px solid rgba(240, 240, 240, 1); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { - color: rgba(240, 240, 240, 1); - background: rgba(49, 79, 239, 1); - border: 2px solid rgba(240, 240, 240, 1); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:focus, - -QDialog#QtSoftwareKeyboardDialog QPushButton:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:hover { - color: rgba(0, 0, 0, 1); - background: rgba(255, 255, 255, 1); - border: 5px solid rgba(148, 250, 202, 1); - border-radius: 6px; - outline: none; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:pressed { - color: rgba(240, 240, 240, 1); - background: rgba(150, 150, 150, 1); - border: 5px solid rgba(148, 250, 202, 1); - border-radius: 6px; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { - image: url(:/overlay/osk_button_B.png); - image-position: right; - qproperty-icon: url(:/overlay/osk_button_backspace.png); - qproperty-iconSize: 36px; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { - image: url(:/overlay/osk_button_Y.png); - image-position: right; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { - image: url(:/overlay/osk_button_plus.png); - image-position: right; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift { - image: url(:/overlay/osk_button_shift_lock_off.png); - image-position: left; - qproperty-icon: url(:/overlay/osk_button_shift.png); - qproperty-iconSize: 36px; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift { - image: url(:/overlay/osk_button_shift_lock_off.png); - image-position: left; - qproperty-icon: url(:/overlay/osk_button_shift_on.png); - qproperty-iconSize: 36px; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_bracket, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_right_bracket, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_parenthesis, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_right_parenthesis { - padding-bottom: 7px; -} - -QDialog#QtSoftwareKeyboardDialog QWidget#titleOSK QLabel { - background: transparent; - color: #ccc; -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_L, -QDialog#QtSoftwareKeyboardDialog QWidget#button_L_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_L_num { - image: url(:/overlay/button_L.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_num { - image: url(:/overlay/arrow_left.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_R, -QDialog#QtSoftwareKeyboardDialog QWidget#button_R_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_R_num { - image: url(:/overlay/button_R.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_num { - image: url(:/overlay/arrow_right.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick, -QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick_shift { - image: url(:/overlay/button_press_stick.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_X, -QDialog#QtSoftwareKeyboardDialog QWidget#button_X_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_X_num { - image: url(:/overlay/button_X.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_A, -QDialog#QtSoftwareKeyboardDialog QWidget#button_A_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_A_num { - image: url(:/overlay/button_A.png); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { - color: rgba(164, 164, 164, 1); - background-color: rgba(218, 218, 218, 1); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_at:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_slash:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_percent:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_1:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_2:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_3:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_4:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_5:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_6:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_7:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_8:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_9:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_0:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled { - color: rgba(164, 164, 164, 1); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled { - image: url(:/overlay/osk_button_plus_disabled.png); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { - image: url(:/overlay/osk_button_B_disabled.png); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled { - image: url(:/overlay/osk_button_Y_disabled.png); -} diff --git a/dist/qt_themes/monochrome/icons.qrc b/dist/qt_themes/monochrome/icons.qrc new file mode 100644 index 0000000000..4eb16294fe --- /dev/null +++ b/dist/qt_themes/monochrome/icons.qrc @@ -0,0 +1,32 @@ + + + + + icons/index.theme + icons/16x16/lock.png + icons/48x48/bad_folder.png + icons/48x48/chip.png + icons/48x48/folder.png + icons/48x48/list-add.png + icons/48x48/sd_card.png + icons/48x48/star.png + icons/256x256/plus_folder.png + + + + + ../monochrome_dark/icons/index.theme + ../monochrome_dark/icons/16x16/lock.png + ../monochrome_dark/icons/48x48/bad_folder.png + ../monochrome_dark/icons/48x48/chip.png + ../monochrome_dark/icons/48x48/folder.png + ../monochrome_dark/icons/48x48/list-add.png + ../monochrome_dark/icons/48x48/no_avatar.png + ../monochrome_dark/icons/48x48/sd_card.png + ../monochrome_dark/icons/48x48/star.png + ../monochrome_dark/icons/256x256/plus_folder.png + + diff --git a/dist/qt_themes/monochrome/icons/16x16/lock.png b/dist/qt_themes/monochrome/icons/16x16/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..69d399050804cfa45e00850d4330a5b7cfaa3a43 GIT binary patch literal 318 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 Yh89WFHBF|yt6vw8JpDWxh~e3P1CC-@r2qf` literal 0 HcmV?d00001 diff --git a/dist/qt_themes/monochrome/icons/48x48/bad_folder.png b/dist/qt_themes/monochrome/icons/48x48/bad_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..364ec646f6f1c6b5b632fb68efd2602aa2c87f25 GIT binary patch literal 1007 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vG$aR2}!aRGnSI!pin1B6LLK~!i%?U_qx z6G0fqceY8JQfje^v^`Z?C}^vKU~SWss8#7Bq7>^BQS_o%D&FixC}>dx@paXk2fb!jWysaGN1x$Fnz386RA_cs9JkNVfB+5}*KzMVo z5<{y;q)9N<9gVg&R*6(8YL7rH){j>o{HZZs%M5)PVmcq>8+myruvCt+0wN**YAopb zi5M!s`S@ko?FTOqzlpEnUD1xlhIp(FB?VwYW}3myAWYoh(Hxy15i^77XU%ODqNIRm zsA)TAnqQsWj3B_=;jZ8e^3r zO;8hQYp#oK3eX^~iLVl1+rr`)T^lJus({Fr#zpu9r#Zfe>&A1#;Lj+IubP5$t@m?V zuuP;<$Q^+Ry$^k&L}ckuJgH9}7qJws3kZk&OEGZwi*y>8ZRk?sqDUR!2k0|I;u`ly zfa|C6>WL?*pz*^M1CM&j2Of5#h__<39qh|aiP$v~U5K}eU>cZq7KcNDz2T0geb~-E zz^C9^n}}TFz5u5E5Rnrej8uAxaM_G!0EK=Rp=(?hfG77T^ho4iLv7dvX}nq6NNrBuZx2B0n{&Y%FbQ3BjX|dkvr%emElgoI zw0EU!l-g)MR&=5T4ne0Kvq5?~w-zRGn!oAM^*Tr!RzSCZ@~MLUANU0C!aI=u%gB)< d$Nzz*{RLYl6+9v2Tqpnl002ovPDHLkV1lP2!l3{F literal 0 HcmV?d00001 diff --git a/dist/qt_themes/monochrome/icons/48x48/chip.png b/dist/qt_themes/monochrome/icons/48x48/chip.png new file mode 100644 index 0000000000000000000000000000000000000000..1b573d51af66864f03a7e20179d3ea4d5f36a012 GIT binary patch literal 511 zcmV9EdCE@3Mha(U=39Kwt-~tF_(V@tbhe@rpPOZE8smKIV=0D_cUSBbMlS7Ve^b~ zpCI|hZY>H}i=fZIrA1)D1@I{LT3H0%iJ()9pbkp0*SBv$NROG$ZR`C;c@8vM#WlBm z{-GACg|z-hS|#Kl^7*&fDJ`V(w`ieRqP0$ZEg|VT>qFz6Y$1y&q@7Zx@kTj?21PC) zHMxM)jIsc&7LsTWuF!bVv`}9saWpNoO|;gDRts6n>E5-FHCYQuD)BkSjYNaI%<}%J z58;F3UVI|X%|r>jh`p8;fgjL6pjLKcQNTIyl_2?73nvPx#1ZP1_K>z@;j|==^1poj532;bRa{vG$asU7#askq98zBGy0jx!G;=NG{;w3(V&)^%7sC5cDp(K0(Eum7VP&2?Hew~5;RZehy&5rvSNM^VC)kWN zVHMxeR!9z)a0X9MeRGaIYAAsD73r}op+A}nH0$iPO`j}shnuBljNAke zx8X5LOP&H)@c~@p1GvTqaE%Y(8Xv$lK7ea{0N3~cu2BH3wV2petzBcQsi*+=rFM+I z@R%hA!ebQOD;L`F4WoDakEpd5Es3~BH7uj{8KO0+<~9sC!03~Ca39O`<1^X@W>MAJ zi!oNvoJv_#H3rLyHYV{BZ6{_ytlBSEK+1 z9X(wfLp;3So;KuSP~dUC`0U^Gu!R9iB3fEjPkbdm@pg-Z*l@4;Y#AsZGNCu2rl{_h ojlvg2t|q1;trMCncE~dD#zk`|?lR_b0UE~O>FVdQ&MBb@0NraiKmY&$ literal 0 HcmV?d00001 diff --git a/dist/qt_themes/monochrome/icons/48x48/sd_card.png b/dist/qt_themes/monochrome/icons/48x48/sd_card.png new file mode 100644 index 0000000000000000000000000000000000000000..6bcb7f6b1d93ab9bf8731849832aa88df68b0fd3 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC&H|6fVg?31We{epSZZGe6s+)c zaSX}0_x8FYUxNV$i^GTi^~cn&+=x(=%u};{v&H06PkCtJvZCsP{SW0+&pdlL-EzG| z-1TF9PY%8>U;^s5J>Boa&B$C$hNGxBS?WfCd ieyFWGC%N1H)%2fvs!qH~tv4HLK~kQselF{r5}E)AjzNq7 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/monochrome/icons/48x48/star.png b/dist/qt_themes/monochrome/icons/48x48/star.png new file mode 100644 index 0000000000000000000000000000000000000000..c2b78f0c3e543913b18d4f95956109c7d2646ba8 GIT binary patch literal 1029 zcmV+g1p51lP)X)lQZo@-L=cu)ZHg3&%A{3AU{olP z1-a8`)uIOkK?H#db72rfkkLY-$D*Q0B3jg{0v8dMp}mlZe3E70Z83B4od0>=d**0_ z9}GA%|M|Xej&tVxXD-ZPc9DpYdjqf?NCHoQS21cCMHX-wW!zdW0rO_jS7;o=X+Bks z&Z4hSNC5qKPoST8mu+NJV>djmi?yxVq@d|Fxlh#Z0}n*oUc;J3@gDort_K=K+lN_m z7l8HHjZOghz(U}s=v!w>)Z`M9%jXd=hI$7c2gLppc!T{ZAF}iv7JYAL++6_HU^h4k z6j}Ng0l!7eY7@eymXKT$-N2BgK8#8y{KjO2Y>)N@Kn<`gB+o%nzwHup3)o?)Hv->6 z@(%#dP#Z%awgI2<{+b4rKR}5KZ;9^9l=l;`HOTxDU^IeA61d{Se>Eca2vF)bfin>W zo}%`CFBG7bLKKbDRzmp>tP=HJZ7K*qfakzHE#ieypcdE-YyuXC;I0MAeLUK50sCyH zfQvwG2qDwR)!I|S(|Nx^<+#6SuYrmf%}P{gP3dD2SQ#|h?r?fl42qN*&`iR&v&woIo+~%R@L- zt`Y7dl&@p`xF!g9;7<$ZJj6y&w`}R6QIB=wJR9Av6A9oXY8y>Un14sh237!t2005+lkvK%ox>dF@W0|O*YW8UHg=Uy00000NkvXXu0mjfk8a2c literal 0 HcmV?d00001 diff --git a/dist/qt_themes/colorful/icons/index.theme b/dist/qt_themes/monochrome/icons/index.theme similarity index 60% rename from dist/qt_themes/colorful/icons/index.theme rename to dist/qt_themes/monochrome/icons/index.theme index 6eb3c69495..c2764622e0 100644 --- a/dist/qt_themes/colorful/icons/index.theme +++ b/dist/qt_themes/monochrome/icons/index.theme @@ -1,8 +1,9 @@ [Icon Theme] -Name=colorful -Comment=Colorful theme +Name=monochrome +Comment=Monochrome light icons +Inherits=default Directories=16x16,48x48,256x256 - + [16x16] Size=16 diff --git a/dist/qt_themes/monochrome/style.qrc b/dist/qt_themes/monochrome/style.qrc new file mode 100644 index 0000000000..54778e2f54 --- /dev/null +++ b/dist/qt_themes/monochrome/style.qrc @@ -0,0 +1,5 @@ + + + ../default/style.qss + + diff --git a/dist/qt_themes/qdarkstyle/icons/16x16/lock.png b/dist/qt_themes/monochrome_dark/icons/16x16/lock.png similarity index 100% rename from dist/qt_themes/qdarkstyle/icons/16x16/lock.png rename to dist/qt_themes/monochrome_dark/icons/16x16/lock.png diff --git a/dist/qt_themes/qdarkstyle/icons/256x256/plus_folder.png b/dist/qt_themes/monochrome_dark/icons/256x256/plus_folder.png similarity index 100% rename from dist/qt_themes/qdarkstyle/icons/256x256/plus_folder.png rename to dist/qt_themes/monochrome_dark/icons/256x256/plus_folder.png diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/bad_folder.png b/dist/qt_themes/monochrome_dark/icons/48x48/bad_folder.png similarity index 100% rename from dist/qt_themes/qdarkstyle/icons/48x48/bad_folder.png rename to dist/qt_themes/monochrome_dark/icons/48x48/bad_folder.png diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/chip.png b/dist/qt_themes/monochrome_dark/icons/48x48/chip.png similarity index 100% rename from dist/qt_themes/qdarkstyle/icons/48x48/chip.png rename to dist/qt_themes/monochrome_dark/icons/48x48/chip.png diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/folder.png b/dist/qt_themes/monochrome_dark/icons/48x48/folder.png similarity index 100% rename from dist/qt_themes/qdarkstyle/icons/48x48/folder.png rename to dist/qt_themes/monochrome_dark/icons/48x48/folder.png diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/list-add.png b/dist/qt_themes/monochrome_dark/icons/48x48/list-add.png similarity index 100% rename from dist/qt_themes/qdarkstyle/icons/48x48/list-add.png rename to dist/qt_themes/monochrome_dark/icons/48x48/list-add.png diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/no_avatar.png b/dist/qt_themes/monochrome_dark/icons/48x48/no_avatar.png similarity index 100% rename from dist/qt_themes/qdarkstyle/icons/48x48/no_avatar.png rename to dist/qt_themes/monochrome_dark/icons/48x48/no_avatar.png diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/sd_card.png b/dist/qt_themes/monochrome_dark/icons/48x48/sd_card.png similarity index 100% rename from dist/qt_themes/qdarkstyle/icons/48x48/sd_card.png rename to dist/qt_themes/monochrome_dark/icons/48x48/sd_card.png diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/star.png b/dist/qt_themes/monochrome_dark/icons/48x48/star.png similarity index 100% rename from dist/qt_themes/qdarkstyle/icons/48x48/star.png rename to dist/qt_themes/monochrome_dark/icons/48x48/star.png diff --git a/dist/qt_themes/monochrome_dark/icons/index.theme b/dist/qt_themes/monochrome_dark/icons/index.theme new file mode 100644 index 0000000000..9ca318d09e --- /dev/null +++ b/dist/qt_themes/monochrome_dark/icons/index.theme @@ -0,0 +1,14 @@ +[Icon Theme] +Name=monochrome_dark +Comment=Monochrome dark icons +Inherits=default_dark +Directories=16x16,48x48,256x256 + +[16x16] +Size=16 + +[48x48] +Size=48 + +[256x256] +Size=256 diff --git a/dist/qt_themes/qdarkstyle/style.qss b/dist/qt_themes/qdarkstyle/dark.qss similarity index 93% rename from dist/qt_themes/qdarkstyle/style.qss rename to dist/qt_themes/qdarkstyle/dark.qss index 328ac942fc..09397f89f5 100644 --- a/dist/qt_themes/qdarkstyle/style.qss +++ b/dist/qt_themes/qdarkstyle/dark.qss @@ -1380,10 +1380,6 @@ QWidget#connectedControllers { background: transparent; } -QWidget#closeButtons { - background: transparent; -} - QWidget#playersSupported, QWidget#controllersSupported, QWidget#controllerSupported1, @@ -1843,40 +1839,17 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:pressed { QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { - image: url(:/overlay/osk_button_B_dark.png); image-position: right; - qproperty-icon: url(:/overlay/osk_button_backspace_dark.png); qproperty-iconSize: 36px; } -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { - image: url(:/overlay/osk_button_Y_dark.png); - image-position: right; -} - QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { color: rgba(44, 44, 44, 1); - image: url(:/overlay/osk_button_plus_dark.png); image-position: right; } -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift { - image: url(:/overlay/osk_button_shift_lock_off.png); - image-position: left; - qproperty-icon: url(:/overlay/osk_button_shift_dark.png); - qproperty-iconSize: 36px; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift { - image: url(:/overlay/osk_button_shift_lock_off.png); - image-position: left; - qproperty-icon: url(:/overlay/osk_button_shift_on_dark.png); - qproperty-iconSize: 36px; -} - QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_bracket, QDialog#QtSoftwareKeyboardDialog QPushButton#button_right_bracket, QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_parenthesis, @@ -1889,47 +1862,6 @@ QDialog#QtSoftwareKeyboardDialog QWidget#titleOSK QLabel { color: #ccc; } -QDialog#QtSoftwareKeyboardDialog QWidget#button_L, -QDialog#QtSoftwareKeyboardDialog QWidget#button_L_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_L_num { - image: url(:/overlay/button_L_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_num { - image: url(:/overlay/arrow_left_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_R, -QDialog#QtSoftwareKeyboardDialog QWidget#button_R_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_R_num { - image: url(:/overlay/button_R_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_num { - image: url(:/overlay/arrow_right_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick, -QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick_shift { - image: url(:/overlay/button_press_stick_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_X, -QDialog#QtSoftwareKeyboardDialog QWidget#button_X_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_X_num { - image: url(:/overlay/button_X_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_A, -QDialog#QtSoftwareKeyboardDialog QWidget#button_A_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_A_num { - image: url(:/overlay/button_A_dark.png); -} - QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled, @@ -1961,23 +1893,6 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled { color: rgba(144, 144, 144, 1); } -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled { - image: url(:/overlay/osk_button_plus_dark_disabled.png); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { - image: url(:/overlay/osk_button_B_dark_disabled.png); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled { - image: url(:/overlay/osk_button_Y_dark_disabled.png); -} - QDialog#QtSoftwareKeyboardDialog QFrame, QDialog#QtSoftwareKeyboardDialog QFrame[frameShape="0"], QDialog#OverlayDialog QFrame, diff --git a/dist/qt_themes/qdarkstyle/icons.qrc b/dist/qt_themes/qdarkstyle/icons.qrc new file mode 100644 index 0000000000..d7ec900649 --- /dev/null +++ b/dist/qt_themes/qdarkstyle/icons.qrc @@ -0,0 +1,51 @@ + + + icons/index.theme + ../default_dark/icons/16x16/lock.png + + + icons/index.theme + ../default_dark/icons/16x16/lock.png + + + rc/branch_closed-on.png + rc/branch_closed.png + rc/branch_open-on.png + rc/branch_open.png + rc/checkbox_checked.png + rc/checkbox_checked_disabled.png + rc/checkbox_checked_focus.png + rc/checkbox_indeterminate.png + rc/checkbox_indeterminate_focus.png + rc/checkbox_unchecked.png + rc/checkbox_unchecked_disabled.png + rc/checkbox_unchecked_focus.png + rc/close-hover.png + rc/close-pressed.png + rc/close.png + rc/down_arrow.png + rc/down_arrow_disabled.png + rc/Hmovetoolbar.png + rc/Hsepartoolbar.png + rc/left_arrow.png + rc/left_arrow_disabled.png + rc/radio_checked.png + rc/radio_checked_disabled.png + rc/radio_checked_focus.png + rc/radio_unchecked.png + rc/radio_unchecked_disabled.png + rc/radio_unchecked_focus.png + rc/right_arrow.png + rc/right_arrow_disabled.png + rc/sizegrip.png + rc/stylesheet-branch-end.png + rc/stylesheet-branch-more.png + rc/stylesheet-vline.png + rc/transparent.png + rc/undock.png + rc/up_arrow.png + rc/up_arrow_disabled.png + rc/Vmovetoolbar.png + rc/Vsepartoolbar.png + + diff --git a/dist/qt_themes/qdarkstyle/icons/16x16/connected.png b/dist/qt_themes/qdarkstyle/icons/16x16/connected.png deleted file mode 100644 index 0afc18cb7a19028fd567a7ca7ced62cd164657de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 575 zcmV-F0>J%=P)0k{|sIn0V`B1xGGFnerg>I4!7^B>UM&p)aM9vQI<{ZJ4 z8HZ4p+_%{7AT1;1-`r}Q8XRRVYW9}G=D3HXRO!FFg z<>v6FfXkm66-$M=OnPPtTpl}lK!#o^J26y#00VLkV5Ig4hAIxCZ~AU@6mMaG2|$+zA&;BarDZyi@16B z4lE8kTwX8y!4LxB2>hW4yn!GbZg+WiA%P|k^Ip;o774}ts6fO6U&y7=hp3TO@-WL? z{^Mh)gLW3&bGqIiV!1gSPQ{V|zW{P&fJjHVbAtc? N002ovPDHLkV1hH82Xp`c diff --git a/dist/qt_themes/qdarkstyle/icons/16x16/connected_notification.png b/dist/qt_themes/qdarkstyle/icons/16x16/connected_notification.png deleted file mode 100644 index 72466e098e471ae5a97c49a56536dd4bf62b3a08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 760 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0*y&TK~y+Tl~Y|v z6j2oZ?(CguoZVz~OB-RWz#nLd9z^@Yo&q%@j2=qtp^PLV$cmEeAL_xE^2wfrs242~ zp$Ef$h%#S%kW`EcLR4x6ZEJVk8F%j7>CU(tNkRF+;a<+Y=R4my_gvyQ4zjp<{ql`; zI^D*(O+BwTbI<>_2MD8-wl5<%-+In!I@(0@^Fzo{bD*j!D3xKFhG&Lp!dzV1$6_(` z^gLuV6YIgUEb0c8*Ie*2x#lAhY;J={1gb21z6E0ugAZC@F^euEux;jDmV`UFz7l>- zK|xT%#N<56!g^D3Wwr@)QUY z@d)MRLDK?Qog0L{ZY_3>K0_%MP_m~6ird7|QOF|6#=1I$H9tA_=53H>6>z~YHTJ@7 zb_Nd4PV}Lux(a+|27GF2$(u@fs~(9UHZ*jca>r)zc$_}(It@ippva0SLlzB`5RY_2 zDJ%pZ9`=H=;M3EPtE-_V5`;>`*WTHAw^h71&5pJA_QIN1DX?Z|p%fSYQs6=ghhYg- zVhSf|d1>iW;`5ymOPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0v$<2K~y+Tl~PS> zQ$Z9x^WL<1ZG=jLsqtf@CIu;o=wGnd1VlHD;-XFKLZw(mq)@*>1VJ>!or+OVq^`wu znJxuC&?1zmaamnO1NME*%5JoAzwQ9hHiSzzQVT5*fC(vPaz_Kh*+6Kq5b=Zyr$6d-BjRvNsUN9r<)$o0v zs;137DRgyhL@Z{(G)=_g8<0qB!nUp3v1>;LeY^L_vp9U_(^UgFXW)W|)!HD0fHMwq z`Rc|0_8q`L@sq zk>1%G63fVBGANuFmY*(fDuPllKmS8eCS`Em`r?L1hp>O&UTLdSRsk4e>gLt9;4C;0 zLcq{BFQXMa*Fk%G45d;@#y$LM{=|d(5AnGC1hkF9bzQ?)OM&Zp`Y#clJ$)W#YAJ!{ z4H0nGY&P-w?HjzG{fJLxahf`;55)a!M*cR#Fvf$Tw4UQO#< z+13h9kDdH|_{gEo)RvScR^ra>BKrFe$hQ&GwNfR74B5P3+o;Y|898=5|6Tg*(O>)p iN=@~G{{?26=FLU_5=aXOVS_yY00002?p zD}XSgpwrRCKtah8*NBqf{Irtt#G+J&^73-M%)IR4TP^t%4d#k2I8Aju - - icons/index.theme - icons/16x16/connected.png - icons/16x16/disconnected.png - icons/16x16/connected_notification.png - icons/16x16/lock.png - icons/16x16/view-refresh.png - icons/48x48/bad_folder.png - icons/48x48/chip.png - icons/48x48/folder.png - icons/48x48/no_avatar.png - icons/48x48/list-add.png - icons/48x48/sd_card.png - icons/48x48/star.png - icons/256x256/plus_folder.png - - - rc/up_arrow_disabled.png - rc/Hmovetoolbar.png - rc/stylesheet-branch-end.png - rc/branch_closed-on.png - rc/stylesheet-vline.png - rc/branch_closed.png - rc/branch_open-on.png - rc/transparent.png - rc/right_arrow_disabled.png - rc/sizegrip.png - rc/close.png - rc/close-hover.png - rc/close-pressed.png - rc/down_arrow.png - rc/Vmovetoolbar.png - rc/left_arrow.png - rc/stylesheet-branch-more.png - rc/up_arrow.png - rc/right_arrow.png - rc/left_arrow_disabled.png - rc/Hsepartoolbar.png - rc/branch_open.png - rc/Vsepartoolbar.png - rc/down_arrow_disabled.png - rc/undock.png - rc/checkbox_checked_disabled.png - rc/checkbox_checked_focus.png - rc/checkbox_checked.png - rc/checkbox_indeterminate.png - rc/checkbox_indeterminate_focus.png - rc/checkbox_unchecked_disabled.png - rc/checkbox_unchecked_focus.png - rc/checkbox_unchecked.png - rc/radio_checked_disabled.png - rc/radio_checked_focus.png - rc/radio_checked.png - rc/radio_unchecked_disabled.png - rc/radio_unchecked_focus.png - rc/radio_unchecked.png - - - style.qss - + + dark.qss + diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/style.qss b/dist/qt_themes/qdarkstyle_midnight_blue/dark.qss similarity index 95% rename from dist/qt_themes/qdarkstyle_midnight_blue/style.qss rename to dist/qt_themes/qdarkstyle_midnight_blue/dark.qss index eb0889b139..a90ac5d5e0 100644 --- a/dist/qt_themes/qdarkstyle_midnight_blue/style.qss +++ b/dist/qt_themes/qdarkstyle_midnight_blue/dark.qss @@ -2779,41 +2779,10 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:pressed { border-radius: 6px; } -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { - image: url(:/overlay/osk_button_B_dark.png); - image-position: right; - qproperty-icon: url(:/overlay/osk_button_backspace_dark.png); - qproperty-iconSize: 36px; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { - image: url(:/overlay/osk_button_Y_dark.png); - image-position: right; -} - QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { color: rgba(44, 44, 44, 1); - image: url(:/overlay/osk_button_plus_dark.png); - image-position: right; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift { - image: url(:/overlay/osk_button_shift_lock_off.png); - image-position: left; - qproperty-icon: url(:/overlay/osk_button_shift_dark.png); - qproperty-iconSize: 36px; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift { - image: url(:/overlay/osk_button_shift_lock_off.png); - image-position: left; - qproperty-icon: url(:/overlay/osk_button_shift_on_dark.png); - qproperty-iconSize: 36px; } QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_bracket, @@ -2828,47 +2797,6 @@ QDialog#QtSoftwareKeyboardDialog QWidget#titleOSK QLabel { color: #ccc; } -QDialog#QtSoftwareKeyboardDialog QWidget#button_L, -QDialog#QtSoftwareKeyboardDialog QWidget#button_L_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_L_num { - image: url(:/overlay/button_L_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_num { - image: url(:/overlay/arrow_left_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_R, -QDialog#QtSoftwareKeyboardDialog QWidget#button_R_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_R_num { - image: url(:/overlay/button_R_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_num { - image: url(:/overlay/arrow_right_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick, -QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick_shift { - image: url(:/overlay/button_press_stick_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_X, -QDialog#QtSoftwareKeyboardDialog QWidget#button_X_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_X_num { - image: url(:/overlay/button_X_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_A, -QDialog#QtSoftwareKeyboardDialog QWidget#button_A_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_A_num { - image: url(:/overlay/button_A_dark.png); -} - QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled, @@ -2899,20 +2827,3 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_0:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled { color: rgba(144, 144, 144, 1); } - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled { - image: url(:/overlay/osk_button_plus_dark_disabled.png); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { - image: url(:/overlay/osk_button_B_dark_disabled.png); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled { - image: url(:/overlay/osk_button_Y_dark_disabled.png); -} diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/icons.qrc b/dist/qt_themes/qdarkstyle_midnight_blue/icons.qrc new file mode 100644 index 0000000000..1a071adda6 --- /dev/null +++ b/dist/qt_themes/qdarkstyle_midnight_blue/icons.qrc @@ -0,0 +1,224 @@ + + + + + icons/index.theme + + + icons/index.theme + + + + rc/arrow_down.png + rc/arrow_down@2x.png + rc/arrow_down_disabled.png + rc/arrow_down_disabled@2x.png + rc/arrow_down_focus.png + rc/arrow_down_focus@2x.png + rc/arrow_down_pressed.png + rc/arrow_down_pressed@2x.png + rc/arrow_left.png + rc/arrow_left@2x.png + rc/arrow_left_disabled.png + rc/arrow_left_disabled@2x.png + rc/arrow_left_focus.png + rc/arrow_left_focus@2x.png + rc/arrow_left_pressed.png + rc/arrow_left_pressed@2x.png + rc/arrow_right.png + rc/arrow_right@2x.png + rc/arrow_right_disabled.png + rc/arrow_right_disabled@2x.png + rc/arrow_right_focus.png + rc/arrow_right_focus@2x.png + rc/arrow_right_pressed.png + rc/arrow_right_pressed@2x.png + rc/arrow_up.png + rc/arrow_up@2x.png + rc/arrow_up_disabled.png + rc/arrow_up_disabled@2x.png + rc/arrow_up_focus.png + rc/arrow_up_focus@2x.png + rc/arrow_up_pressed.png + rc/arrow_up_pressed@2x.png + rc/base_icon.png + rc/base_icon@2x.png + rc/base_icon_disabled.png + rc/base_icon_disabled@2x.png + rc/base_icon_focus.png + rc/base_icon_focus@2x.png + rc/base_icon_pressed.png + rc/base_icon_pressed@2x.png + rc/branch_closed.png + rc/branch_closed@2x.png + rc/branch_closed_disabled.png + rc/branch_closed_disabled@2x.png + rc/branch_closed_focus.png + rc/branch_closed_focus@2x.png + rc/branch_closed_pressed.png + rc/branch_closed_pressed@2x.png + rc/branch_end.png + rc/branch_end@2x.png + rc/branch_end_disabled.png + rc/branch_end_disabled@2x.png + rc/branch_end_focus.png + rc/branch_end_focus@2x.png + rc/branch_end_pressed.png + rc/branch_end_pressed@2x.png + rc/branch_line.png + rc/branch_line@2x.png + rc/branch_line_disabled.png + rc/branch_line_disabled@2x.png + rc/branch_line_focus.png + rc/branch_line_focus@2x.png + rc/branch_line_pressed.png + rc/branch_line_pressed@2x.png + rc/branch_more.png + rc/branch_more@2x.png + rc/branch_more_disabled.png + rc/branch_more_disabled@2x.png + rc/branch_more_focus.png + rc/branch_more_focus@2x.png + rc/branch_more_pressed.png + rc/branch_more_pressed@2x.png + rc/branch_open.png + rc/branch_open@2x.png + rc/branch_open_disabled.png + rc/branch_open_disabled@2x.png + rc/branch_open_focus.png + rc/branch_open_focus@2x.png + rc/branch_open_pressed.png + rc/branch_open_pressed@2x.png + rc/checkbox_checked.png + rc/checkbox_checked@2x.png + rc/checkbox_checked_disabled.png + rc/checkbox_checked_disabled@2x.png + rc/checkbox_checked_focus.png + rc/checkbox_checked_focus@2x.png + rc/checkbox_checked_pressed.png + rc/checkbox_checked_pressed@2x.png + rc/checkbox_indeterminate.png + rc/checkbox_indeterminate@2x.png + rc/checkbox_indeterminate_disabled.png + rc/checkbox_indeterminate_disabled@2x.png + rc/checkbox_indeterminate_focus.png + rc/checkbox_indeterminate_focus@2x.png + rc/checkbox_indeterminate_pressed.png + rc/checkbox_indeterminate_pressed@2x.png + rc/checkbox_unchecked.png + rc/checkbox_unchecked@2x.png + rc/checkbox_unchecked_disabled.png + rc/checkbox_unchecked_disabled@2x.png + rc/checkbox_unchecked_focus.png + rc/checkbox_unchecked_focus@2x.png + rc/checkbox_unchecked_pressed.png + rc/checkbox_unchecked_pressed@2x.png + rc/line_horizontal.png + rc/line_horizontal@2x.png + rc/line_horizontal_disabled.png + rc/line_horizontal_disabled@2x.png + rc/line_horizontal_focus.png + rc/line_horizontal_focus@2x.png + rc/line_horizontal_pressed.png + rc/line_horizontal_pressed@2x.png + rc/line_vertical.png + rc/line_vertical@2x.png + rc/line_vertical_disabled.png + rc/line_vertical_disabled@2x.png + rc/line_vertical_focus.png + rc/line_vertical_focus@2x.png + rc/line_vertical_pressed.png + rc/line_vertical_pressed@2x.png + rc/radio_checked.png + rc/radio_checked@2x.png + rc/radio_checked_disabled.png + rc/radio_checked_disabled@2x.png + rc/radio_checked_focus.png + rc/radio_checked_focus@2x.png + rc/radio_checked_pressed.png + rc/radio_checked_pressed@2x.png + rc/radio_unchecked.png + rc/radio_unchecked@2x.png + rc/radio_unchecked_disabled.png + rc/radio_unchecked_disabled@2x.png + rc/radio_unchecked_focus.png + rc/radio_unchecked_focus@2x.png + rc/radio_unchecked_pressed.png + rc/radio_unchecked_pressed@2x.png + rc/toolbar_move_horizontal.png + rc/toolbar_move_horizontal@2x.png + rc/toolbar_move_horizontal_disabled.png + rc/toolbar_move_horizontal_disabled@2x.png + rc/toolbar_move_horizontal_focus.png + rc/toolbar_move_horizontal_focus@2x.png + rc/toolbar_move_horizontal_pressed.png + rc/toolbar_move_horizontal_pressed@2x.png + rc/toolbar_move_vertical.png + rc/toolbar_move_vertical@2x.png + rc/toolbar_move_vertical_disabled.png + rc/toolbar_move_vertical_disabled@2x.png + rc/toolbar_move_vertical_focus.png + rc/toolbar_move_vertical_focus@2x.png + rc/toolbar_move_vertical_pressed.png + rc/toolbar_move_vertical_pressed@2x.png + rc/toolbar_separator_horizontal.png + rc/toolbar_separator_horizontal@2x.png + rc/toolbar_separator_horizontal_disabled.png + rc/toolbar_separator_horizontal_disabled@2x.png + rc/toolbar_separator_horizontal_focus.png + rc/toolbar_separator_horizontal_focus@2x.png + rc/toolbar_separator_horizontal_pressed.png + rc/toolbar_separator_horizontal_pressed@2x.png + rc/toolbar_separator_vertical.png + rc/toolbar_separator_vertical@2x.png + rc/toolbar_separator_vertical_disabled.png + rc/toolbar_separator_vertical_disabled@2x.png + rc/toolbar_separator_vertical_focus.png + rc/toolbar_separator_vertical_focus@2x.png + rc/toolbar_separator_vertical_pressed.png + rc/toolbar_separator_vertical_pressed@2x.png + rc/transparent.png + rc/transparent@2x.png + rc/transparent_disabled.png + rc/transparent_disabled@2x.png + rc/transparent_focus.png + rc/transparent_focus@2x.png + rc/transparent_pressed.png + rc/transparent_pressed@2x.png + rc/window_close.png + rc/window_close@2x.png + rc/window_close_disabled.png + rc/window_close_disabled@2x.png + rc/window_close_focus.png + rc/window_close_focus@2x.png + rc/window_close_pressed.png + rc/window_close_pressed@2x.png + rc/window_grip.png + rc/window_grip@2x.png + rc/window_grip_disabled.png + rc/window_grip_disabled@2x.png + rc/window_grip_focus.png + rc/window_grip_focus@2x.png + rc/window_grip_pressed.png + rc/window_grip_pressed@2x.png + rc/window_minimize.png + rc/window_minimize@2x.png + rc/window_minimize_disabled.png + rc/window_minimize_disabled@2x.png + rc/window_minimize_focus.png + rc/window_minimize_focus@2x.png + rc/window_minimize_pressed.png + rc/window_minimize_pressed@2x.png + rc/window_undock.png + rc/window_undock@2x.png + rc/window_undock_disabled.png + rc/window_undock_disabled@2x.png + rc/window_undock_focus.png + rc/window_undock_focus@2x.png + rc/window_undock_pressed.png + rc/window_undock_pressed@2x.png + + diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/icons/index.theme b/dist/qt_themes/qdarkstyle_midnight_blue/icons/index.theme index 20f9f6d633..34c449f19a 100644 --- a/dist/qt_themes/qdarkstyle_midnight_blue/icons/index.theme +++ b/dist/qt_themes/qdarkstyle_midnight_blue/icons/index.theme @@ -1,14 +1,4 @@ [Icon Theme] Name=qdarkstyle_midnight_blue -Comment=dark theme -Inherits=colorful -Directories=16x16,48x48,256x256 - -[16x16] -Size=16 - -[48x48] -Size=48 - -[256x256] -Size=256 +Comment=Dark theme (Midnight Blue style) +Inherits=default_dark diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/style.qrc b/dist/qt_themes/qdarkstyle_midnight_blue/style.qrc index dc3d7fecbd..0cdaefa035 100644 --- a/dist/qt_themes/qdarkstyle_midnight_blue/style.qrc +++ b/dist/qt_themes/qdarkstyle_midnight_blue/style.qrc @@ -1,228 +1,5 @@ - - icons/index.theme - ../qdarkstyle/icons/16x16/lock.png - ../qdarkstyle/icons/16x16/view-refresh.png - ../qdarkstyle/icons/48x48/bad_folder.png - ../qdarkstyle/icons/48x48/chip.png - ../qdarkstyle/icons/48x48/folder.png - ../qdarkstyle/icons/48x48/no_avatar.png - ../qdarkstyle/icons/48x48/list-add.png - ../qdarkstyle/icons/48x48/sd_card.png - ../qdarkstyle/icons/48x48/star.png - ../qdarkstyle/icons/256x256/plus_folder.png - - - rc/arrow_down.png - rc/arrow_down@2x.png - rc/arrow_down_disabled.png - rc/arrow_down_disabled@2x.png - rc/arrow_down_focus.png - rc/arrow_down_focus@2x.png - rc/arrow_down_pressed.png - rc/arrow_down_pressed@2x.png - rc/arrow_left.png - rc/arrow_left@2x.png - rc/arrow_left_disabled.png - rc/arrow_left_disabled@2x.png - rc/arrow_left_focus.png - rc/arrow_left_focus@2x.png - rc/arrow_left_pressed.png - rc/arrow_left_pressed@2x.png - rc/arrow_right.png - rc/arrow_right@2x.png - rc/arrow_right_disabled.png - rc/arrow_right_disabled@2x.png - rc/arrow_right_focus.png - rc/arrow_right_focus@2x.png - rc/arrow_right_pressed.png - rc/arrow_right_pressed@2x.png - rc/arrow_up.png - rc/arrow_up@2x.png - rc/arrow_up_disabled.png - rc/arrow_up_disabled@2x.png - rc/arrow_up_focus.png - rc/arrow_up_focus@2x.png - rc/arrow_up_pressed.png - rc/arrow_up_pressed@2x.png - rc/base_icon.png - rc/base_icon@2x.png - rc/base_icon_disabled.png - rc/base_icon_disabled@2x.png - rc/base_icon_focus.png - rc/base_icon_focus@2x.png - rc/base_icon_pressed.png - rc/base_icon_pressed@2x.png - rc/branch_closed.png - rc/branch_closed@2x.png - rc/branch_closed_disabled.png - rc/branch_closed_disabled@2x.png - rc/branch_closed_focus.png - rc/branch_closed_focus@2x.png - rc/branch_closed_pressed.png - rc/branch_closed_pressed@2x.png - rc/branch_end.png - rc/branch_end@2x.png - rc/branch_end_disabled.png - rc/branch_end_disabled@2x.png - rc/branch_end_focus.png - rc/branch_end_focus@2x.png - rc/branch_end_pressed.png - rc/branch_end_pressed@2x.png - rc/branch_line.png - rc/branch_line@2x.png - rc/branch_line_disabled.png - rc/branch_line_disabled@2x.png - rc/branch_line_focus.png - rc/branch_line_focus@2x.png - rc/branch_line_pressed.png - rc/branch_line_pressed@2x.png - rc/branch_more.png - rc/branch_more@2x.png - rc/branch_more_disabled.png - rc/branch_more_disabled@2x.png - rc/branch_more_focus.png - rc/branch_more_focus@2x.png - rc/branch_more_pressed.png - rc/branch_more_pressed@2x.png - rc/branch_open.png - rc/branch_open@2x.png - rc/branch_open_disabled.png - rc/branch_open_disabled@2x.png - rc/branch_open_focus.png - rc/branch_open_focus@2x.png - rc/branch_open_pressed.png - rc/branch_open_pressed@2x.png - rc/checkbox_checked.png - rc/checkbox_checked@2x.png - rc/checkbox_checked_disabled.png - rc/checkbox_checked_disabled@2x.png - rc/checkbox_checked_focus.png - rc/checkbox_checked_focus@2x.png - rc/checkbox_checked_pressed.png - rc/checkbox_checked_pressed@2x.png - rc/checkbox_indeterminate.png - rc/checkbox_indeterminate@2x.png - rc/checkbox_indeterminate_disabled.png - rc/checkbox_indeterminate_disabled@2x.png - rc/checkbox_indeterminate_focus.png - rc/checkbox_indeterminate_focus@2x.png - rc/checkbox_indeterminate_pressed.png - rc/checkbox_indeterminate_pressed@2x.png - rc/checkbox_unchecked.png - rc/checkbox_unchecked@2x.png - rc/checkbox_unchecked_disabled.png - rc/checkbox_unchecked_disabled@2x.png - rc/checkbox_unchecked_focus.png - rc/checkbox_unchecked_focus@2x.png - rc/checkbox_unchecked_pressed.png - rc/checkbox_unchecked_pressed@2x.png - rc/line_horizontal.png - rc/line_horizontal@2x.png - rc/line_horizontal_disabled.png - rc/line_horizontal_disabled@2x.png - rc/line_horizontal_focus.png - rc/line_horizontal_focus@2x.png - rc/line_horizontal_pressed.png - rc/line_horizontal_pressed@2x.png - rc/line_vertical.png - rc/line_vertical@2x.png - rc/line_vertical_disabled.png - rc/line_vertical_disabled@2x.png - rc/line_vertical_focus.png - rc/line_vertical_focus@2x.png - rc/line_vertical_pressed.png - rc/line_vertical_pressed@2x.png - rc/radio_checked.png - rc/radio_checked@2x.png - rc/radio_checked_disabled.png - rc/radio_checked_disabled@2x.png - rc/radio_checked_focus.png - rc/radio_checked_focus@2x.png - rc/radio_checked_pressed.png - rc/radio_checked_pressed@2x.png - rc/radio_unchecked.png - rc/radio_unchecked@2x.png - rc/radio_unchecked_disabled.png - rc/radio_unchecked_disabled@2x.png - rc/radio_unchecked_focus.png - rc/radio_unchecked_focus@2x.png - rc/radio_unchecked_pressed.png - rc/radio_unchecked_pressed@2x.png - rc/toolbar_move_horizontal.png - rc/toolbar_move_horizontal@2x.png - rc/toolbar_move_horizontal_disabled.png - rc/toolbar_move_horizontal_disabled@2x.png - rc/toolbar_move_horizontal_focus.png - rc/toolbar_move_horizontal_focus@2x.png - rc/toolbar_move_horizontal_pressed.png - rc/toolbar_move_horizontal_pressed@2x.png - rc/toolbar_move_vertical.png - rc/toolbar_move_vertical@2x.png - rc/toolbar_move_vertical_disabled.png - rc/toolbar_move_vertical_disabled@2x.png - rc/toolbar_move_vertical_focus.png - rc/toolbar_move_vertical_focus@2x.png - rc/toolbar_move_vertical_pressed.png - rc/toolbar_move_vertical_pressed@2x.png - rc/toolbar_separator_horizontal.png - rc/toolbar_separator_horizontal@2x.png - rc/toolbar_separator_horizontal_disabled.png - rc/toolbar_separator_horizontal_disabled@2x.png - rc/toolbar_separator_horizontal_focus.png - rc/toolbar_separator_horizontal_focus@2x.png - rc/toolbar_separator_horizontal_pressed.png - rc/toolbar_separator_horizontal_pressed@2x.png - rc/toolbar_separator_vertical.png - rc/toolbar_separator_vertical@2x.png - rc/toolbar_separator_vertical_disabled.png - rc/toolbar_separator_vertical_disabled@2x.png - rc/toolbar_separator_vertical_focus.png - rc/toolbar_separator_vertical_focus@2x.png - rc/toolbar_separator_vertical_pressed.png - rc/toolbar_separator_vertical_pressed@2x.png - rc/transparent.png - rc/transparent@2x.png - rc/transparent_disabled.png - rc/transparent_disabled@2x.png - rc/transparent_focus.png - rc/transparent_focus@2x.png - rc/transparent_pressed.png - rc/transparent_pressed@2x.png - rc/window_close.png - rc/window_close@2x.png - rc/window_close_disabled.png - rc/window_close_disabled@2x.png - rc/window_close_focus.png - rc/window_close_focus@2x.png - rc/window_close_pressed.png - rc/window_close_pressed@2x.png - rc/window_grip.png - rc/window_grip@2x.png - rc/window_grip_disabled.png - rc/window_grip_disabled@2x.png - rc/window_grip_focus.png - rc/window_grip_focus@2x.png - rc/window_grip_pressed.png - rc/window_grip_pressed@2x.png - rc/window_minimize.png - rc/window_minimize@2x.png - rc/window_minimize_disabled.png - rc/window_minimize_disabled@2x.png - rc/window_minimize_focus.png - rc/window_minimize_focus@2x.png - rc/window_minimize_pressed.png - rc/window_minimize_pressed@2x.png - rc/window_undock.png - rc/window_undock@2x.png - rc/window_undock_disabled.png - rc/window_undock_disabled@2x.png - rc/window_undock_focus.png - rc/window_undock_focus@2x.png - rc/window_undock_pressed.png - rc/window_undock_pressed@2x.png - - - style.qss - + + dark.qss + diff --git a/dist/qt_themes/qdarkstyle_midnight_blue_monochrome/icons.qrc b/dist/qt_themes/qdarkstyle_midnight_blue_monochrome/icons.qrc new file mode 100644 index 0000000000..60b95db02a --- /dev/null +++ b/dist/qt_themes/qdarkstyle_midnight_blue_monochrome/icons.qrc @@ -0,0 +1,33 @@ + + + + + + + icons/index.theme + ../monochrome_dark/icons/16x16/lock.png + ../monochrome_dark/icons/48x48/bad_folder.png + ../monochrome_dark/icons/48x48/chip.png + ../monochrome_dark/icons/48x48/folder.png + ../monochrome_dark/icons/48x48/list-add.png + ../monochrome_dark/icons/48x48/sd_card.png + ../monochrome_dark/icons/48x48/star.png + ../monochrome_dark/icons/256x256/plus_folder.png + + + + icons/index.theme + ../monochrome_dark/icons/16x16/lock.png + ../monochrome_dark/icons/48x48/bad_folder.png + ../monochrome_dark/icons/48x48/chip.png + ../monochrome_dark/icons/48x48/folder.png + ../monochrome_dark/icons/48x48/list-add.png + ../monochrome_dark/icons/48x48/no_avatar.png + ../monochrome_dark/icons/48x48/sd_card.png + ../monochrome_dark/icons/48x48/star.png + ../monochrome_dark/icons/256x256/plus_folder.png + + diff --git a/dist/qt_themes/qdarkstyle_midnight_blue_monochrome/icons/index.theme b/dist/qt_themes/qdarkstyle_midnight_blue_monochrome/icons/index.theme new file mode 100644 index 0000000000..d6ed7d55ec --- /dev/null +++ b/dist/qt_themes/qdarkstyle_midnight_blue_monochrome/icons/index.theme @@ -0,0 +1,14 @@ +[Icon Theme] +Name=qdarkstyle_midnight_blue_monochrome +Comment=Monochrome dark theme (Midnight Blue style) +Inherits=qdarkstyle_midnight_blue +Directories=16x16,48x48,256x256 + +[16x16] +Size=16 + +[48x48] +Size=48 + +[256x256] +Size=256 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue_monochrome/style.qrc b/dist/qt_themes/qdarkstyle_midnight_blue_monochrome/style.qrc new file mode 100644 index 0000000000..eeb5f34cbb --- /dev/null +++ b/dist/qt_themes/qdarkstyle_midnight_blue_monochrome/style.qrc @@ -0,0 +1,8 @@ + + + ../qdarkstyle_midnight_blue/dark.qss + + + ../qdarkstyle/dark.qss + + diff --git a/dist/qt_themes/qdarkstyle_monochrome/icons.qrc b/dist/qt_themes/qdarkstyle_monochrome/icons.qrc new file mode 100644 index 0000000000..355fe22beb --- /dev/null +++ b/dist/qt_themes/qdarkstyle_monochrome/icons.qrc @@ -0,0 +1,33 @@ + + + + + + + icons/index.theme + ../monochrome_dark/icons/16x16/lock.png + ../monochrome_dark/icons/48x48/bad_folder.png + ../monochrome_dark/icons/48x48/chip.png + ../monochrome_dark/icons/48x48/folder.png + ../monochrome_dark/icons/48x48/list-add.png + ../monochrome_dark/icons/48x48/sd_card.png + ../monochrome_dark/icons/48x48/star.png + ../monochrome_dark/icons/256x256/plus_folder.png + + + + icons/index.theme + ../monochrome_dark/icons/16x16/lock.png + ../monochrome_dark/icons/48x48/bad_folder.png + ../monochrome_dark/icons/48x48/chip.png + ../monochrome_dark/icons/48x48/folder.png + ../monochrome_dark/icons/48x48/list-add.png + ../monochrome_dark/icons/48x48/no_avatar.png + ../monochrome_dark/icons/48x48/sd_card.png + ../monochrome_dark/icons/48x48/star.png + ../monochrome_dark/icons/256x256/plus_folder.png + + diff --git a/dist/qt_themes/qdarkstyle_monochrome/icons/index.theme b/dist/qt_themes/qdarkstyle_monochrome/icons/index.theme new file mode 100644 index 0000000000..a8fd60ba29 --- /dev/null +++ b/dist/qt_themes/qdarkstyle_monochrome/icons/index.theme @@ -0,0 +1,14 @@ +[Icon Theme] +Name=qdarkstyle_monochrome +Comment=Monochrome dark theme (Mine Shaft style) +Inherits=qdarkstyle +Directories=16x16,48x48,256x256 + +[16x16] +Size=16 + +[48x48] +Size=48 + +[256x256] +Size=256 diff --git a/dist/qt_themes/qdarkstyle_monochrome/style.qrc b/dist/qt_themes/qdarkstyle_monochrome/style.qrc new file mode 100644 index 0000000000..76f7767ca8 --- /dev/null +++ b/dist/qt_themes/qdarkstyle_monochrome/style.qrc @@ -0,0 +1,8 @@ + + + ../qdarkstyle/dark.qss + + + ../qdarkstyle/dark.qss + + diff --git a/src/suyu/applets/qt_software_keyboard.cpp b/src/suyu/applets/qt_software_keyboard.cpp index ca7169e2a2..3a88656a17 100644 --- a/src/suyu/applets/qt_software_keyboard.cpp +++ b/src/suyu/applets/qt_software_keyboard.cpp @@ -372,6 +372,14 @@ QtSoftwareKeyboardDialog::~QtSoftwareKeyboardDialog() { StopInputThread(); } +QString QtSoftwareKeyboardDialog::theme() { + if (GMainWindow::CheckDarkMode()) { + return QStringLiteral("_dark"); + } else { + return QString{}; + } +} + void QtSoftwareKeyboardDialog::ShowNormalKeyboard(QPoint pos, QSize size) { if (isVisible()) { return; @@ -382,6 +390,7 @@ void QtSoftwareKeyboardDialog::ShowNormalKeyboard(QPoint pos, QSize size) { SetKeyboardType(); SetPasswordMode(); SetControllerImage(); + SetButtonImages(); DisableKeyboardButtons(); SetBackspaceOkEnabled(); @@ -449,6 +458,7 @@ void QtSoftwareKeyboardDialog::ShowInlineKeyboard( SetKeyboardType(); SetControllerImage(); + SetButtonImages(); DisableKeyboardButtons(); SetBackspaceOkEnabled(); @@ -822,70 +832,146 @@ void QtSoftwareKeyboardDialog::SetControllerImage() { const auto controller_type = handheld->IsConnected() ? handheld->GetNpadStyleIndex() : player_1->GetNpadStyleIndex(); - const QString theme = [] { - // Use dark icons if current OS mode is dark, or the theme contains "dark", or "midnight" in - // its name - if (GMainWindow::CheckDarkMode() || QIcon::themeName().contains(QStringLiteral("dark")) || - QIcon::themeName().contains(QStringLiteral("midnight"))) { - return QStringLiteral("_dark"); - } else { - return QString{}; - } - }(); - switch (controller_type) { case Core::HID::NpadStyleIndex::Fullkey: case Core::HID::NpadStyleIndex::GameCube: ui->icon_controller->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_pro%1.png);").arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_pro.png);").arg(theme())); ui->icon_controller_shift->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_pro%1.png);").arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_pro.png);").arg(theme())); ui->icon_controller_num->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_pro%1.png);").arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_pro.png);").arg(theme())); break; case Core::HID::NpadStyleIndex::JoyconDual: ui->icon_controller->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_dual_joycon%1.png);").arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_dual_joycon.png);").arg(theme())); ui->icon_controller_shift->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_dual_joycon%1.png);").arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_dual_joycon.png);").arg(theme())); ui->icon_controller_num->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_dual_joycon%1.png);").arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_dual_joycon.png);").arg(theme())); break; case Core::HID::NpadStyleIndex::JoyconLeft: ui->icon_controller->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_single_joycon_left%1.png);") - .arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_single_joycon_left.png);") + .arg(theme())); ui->icon_controller_shift->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_single_joycon_left%1.png);") - .arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_single_joycon_left.png);") + .arg(theme())); ui->icon_controller_num->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_single_joycon_left%1.png);") - .arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_single_joycon_left.png);") + .arg(theme())); break; case Core::HID::NpadStyleIndex::JoyconRight: ui->icon_controller->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_single_joycon_right%1.png);") - .arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_single_joycon_right.png);") + .arg(theme())); ui->icon_controller_shift->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_single_joycon_right%1.png);") - .arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_single_joycon_right.png);") + .arg(theme())); ui->icon_controller_num->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_single_joycon_right%1.png);") - .arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_single_joycon_right.png);") + .arg(theme())); break; case Core::HID::NpadStyleIndex::Handheld: ui->icon_controller->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_handheld%1.png);").arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_handheld.png);").arg(theme())); ui->icon_controller_shift->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_handheld%1.png);").arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_handheld.png);").arg(theme())); ui->icon_controller_num->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_handheld%1.png);").arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_handheld.png);").arg(theme())); break; default: break; } } +void QtSoftwareKeyboardDialog::SetButtonImages() { + QString button_backspace_stylesheet = + QStringLiteral("QPushButton {" + " image: url(:/overlay%1/osk_button_B.png);" + " image-position: right;" + " qproperty-icon: url(:/overlay%1/osk_button_backspace.png); }" + "QPushButton:disabled { image: url(:/overlay%1/osk_button_B_disabled.png);}") + .arg(theme()); + ui->button_backspace->setStyleSheet(button_backspace_stylesheet); + ui->button_backspace_shift->setStyleSheet(button_backspace_stylesheet); + ui->button_backspace_shift->setIconSize(ui->button_backspace->iconSize()); + ui->button_backspace_num->setStyleSheet(button_backspace_stylesheet); + + QString button_space_stylesheet = + QStringLiteral("QPushButton {" + " image: url(:/overlay%1/osk_button_Y.png);" + " image-position: right;" + " qproperty-icon: url(:/overlay%1/osk_button_space.png); }" + "QPushButton:disabled { image: url(:/overlay%1/osk_button_Y_disabled.png);}") + .arg(theme()); + ui->button_space->setStyleSheet(button_space_stylesheet); + ui->button_space_shift->setStyleSheet(button_space_stylesheet); + + QString button_ok_stylesheet = + QStringLiteral( + "QPushButton { image: url(:/overlay%1/osk_button_plus.png); }" + "QPushButton:disabled { image: url(:/overlay%1/osk_button_plus_disabled.png); }") + .arg(theme()); + ui->button_ok->setStyleSheet(button_ok_stylesheet); + ui->button_ok_shift->setStyleSheet(button_ok_stylesheet); + ui->button_ok_num->setStyleSheet(button_ok_stylesheet); + + QString button_shift_stylesheet = + QStringLiteral("image: url(:/overlay/osk_button_shift_lock_off.png);" + "image-position: left;" + "qproperty-icon: url(:/overlay%1/osk_button_shift.png);") + .arg(theme()); + ui->button_shift->setStyleSheet(button_shift_stylesheet); + + QString button_shift_shift_stylesheet = + QStringLiteral("image: url(:/overlay/osk_button_shift_lock_off.png);" + "image-position: left;" + "qproperty-icon: url(:/overlay%1/osk_button_shift_on.png);") + .arg(theme()); + ui->button_shift_shift->setStyleSheet(button_shift_shift_stylesheet); + ui->button_shift_shift->setIconSize(ui->button_shift->iconSize()); + + QString L_stylesheet = QStringLiteral("image: url(:/overlay%1/button_L.png);").arg(theme()); + ui->button_L->setStyleSheet(L_stylesheet); + ui->button_L_shift->setStyleSheet(L_stylesheet); + ui->button_L_num->setStyleSheet(L_stylesheet); + + QString R_stylesheet = QStringLiteral("image: url(:/overlay%1/button_R.png);").arg(theme()); + ui->button_R->setStyleSheet(R_stylesheet); + ui->button_R_shift->setStyleSheet(R_stylesheet); + ui->button_R_num->setStyleSheet(R_stylesheet); + + QString arrow_left_stylesheet = + QStringLiteral("image: url(:/overlay%1/arrow_left.png);").arg(theme()); + ui->arrow_left->setStyleSheet(arrow_left_stylesheet); + ui->arrow_left_shift->setStyleSheet(arrow_left_stylesheet); + ui->arrow_left_num->setStyleSheet(arrow_left_stylesheet); + + QString arrow_right_stylesheet = + QStringLiteral("image: url(:/overlay%1/arrow_right.png);").arg(theme()); + ui->arrow_right->setStyleSheet(arrow_right_stylesheet); + ui->arrow_right_shift->setStyleSheet(arrow_right_stylesheet); + ui->arrow_right_num->setStyleSheet(arrow_right_stylesheet); + + QString button_press_stick_stylesheet = + QStringLiteral("image: url(:/overlay%1/button_press_stick.png);").arg(theme()); + ui->button_press_stick->setStyleSheet(button_press_stick_stylesheet); + ui->button_press_stick_shift->setStyleSheet(button_press_stick_stylesheet); + + QString button_X_stylesheet = + QStringLiteral("image: url(:/overlay%1/button_X.png);").arg(theme()); + ui->button_X->setStyleSheet(button_X_stylesheet); + ui->button_X_shift->setStyleSheet(button_X_stylesheet); + ui->button_X_num->setStyleSheet(button_X_stylesheet); + + QString button_A_stylesheet = + QStringLiteral("image: url(:/overlay%1/button_A.png);").arg(theme()); + ui->button_A->setStyleSheet(button_A_stylesheet); + ui->button_A_shift->setStyleSheet(button_A_stylesheet); + ui->button_A_num->setStyleSheet(button_A_stylesheet); +} + void QtSoftwareKeyboardDialog::DisableKeyboardButtons() { switch (bottom_osk_index) { case BottomOSKIndex::LowerCase: @@ -1052,10 +1138,8 @@ void QtSoftwareKeyboardDialog::ChangeBottomOSKIndex() { ui->bottomOSK->setCurrentIndex(static_cast(bottom_osk_index)); ui->button_shift_shift->setStyleSheet( - QStringLiteral("image: url(:/overlay/osk_button_shift_lock_off.png);" - "\nimage-position: left;")); + QStringLiteral("image: url(:/overlay/osk_button_shift_lock_off.png);")); - ui->button_shift_shift->setIconSize(ui->button_shift->iconSize()); ui->button_backspace_shift->setIconSize(ui->button_backspace->iconSize()); break; case BottomOSKIndex::UpperCase: @@ -1066,9 +1150,6 @@ void QtSoftwareKeyboardDialog::ChangeBottomOSKIndex() { QStringLiteral("image: url(:/overlay/osk_button_shift_lock_off.png);" "\nimage-position: left;")); - ui->button_shift_shift->setIconSize(ui->button_shift->iconSize()); - ui->button_backspace_shift->setIconSize(ui->button_backspace->iconSize()); - ui->label_shift_shift->setText(QStringLiteral("Caps Lock")); bottom_osk_index = BottomOSKIndex::LowerCase; @@ -1080,9 +1161,6 @@ void QtSoftwareKeyboardDialog::ChangeBottomOSKIndex() { QStringLiteral("image: url(:/overlay/osk_button_shift_lock_on.png);" "\nimage-position: left;")); - ui->button_shift_shift->setIconSize(ui->button_shift->iconSize()); - ui->button_backspace_shift->setIconSize(ui->button_backspace->iconSize()); - ui->label_shift_shift->setText(QStringLiteral("Caps Lock Off")); } break; diff --git a/src/suyu/applets/qt_software_keyboard.h b/src/suyu/applets/qt_software_keyboard.h index 7e2fdf09ea..fda6ac623d 100644 --- a/src/suyu/applets/qt_software_keyboard.h +++ b/src/suyu/applets/qt_software_keyboard.h @@ -80,6 +80,12 @@ private: NumberPad, }; + /** + * Get the current theme suffix + * @return an empty string for light theme, "_dark" for dark theme + */ + QString theme(); + /** * Moves and resizes the window to a specified position and size. * @@ -109,6 +115,9 @@ private: /// Sets the controller image at the bottom left of the software keyboard. void SetControllerImage(); + /// Sets the controller image at the bottom left of the software keyboard. + void SetButtonImages(); + /// Disables buttons based on initialize_parameters. void DisableKeyboardButtons(); diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index e6d14717cf..b687e2500d 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -9,7 +9,6 @@ #include #include #include -#include #include #include "core/hle/service/am/applet_manager.h" @@ -297,12 +296,11 @@ GMainWindow::GMainWindow(std::unique_ptr config_, bool has_broken_vulk statusBar()->hide(); startup_icon_theme = QIcon::themeName(); - // fallback can only be set once, colorful theme icons are okay on both light/dark - QIcon::setFallbackThemeName(QStringLiteral("colorful")); + // fallback can only be set once, default theme icons are okay on both light/dark + QIcon::setFallbackThemeName(QStringLiteral("default")); QIcon::setFallbackSearchPaths(QStringList(QStringLiteral(":/icons"))); default_theme_paths = QIcon::themeSearchPaths(); - UpdateUITheme(); SetDiscordEnabled(UISettings::values.enable_discord_presence.GetValue()); discord_rpc->Update(); @@ -3612,8 +3610,6 @@ void GMainWindow::OnConfigure() { multiplayer_state->UpdateCredentials(); } - emit UpdateThemedIcons(); - const auto reload = UISettings::values.is_game_list_reload_pending.exchange(false); if (reload || Settings::values.language_index.GetValue() != old_language_index) { game_list->PopulateAsync(UISettings::values.game_dirs); @@ -5030,9 +5026,9 @@ bool GMainWindow::CheckDarkMode() { // Using the freedesktop specifications for checking dark mode LOG_INFO(Frontend, "Retrieving theme from freedesktop color-scheme..."); gdbus_arguments << QStringLiteral("--dest=org.freedesktop.portal.Desktop") - << QStringLiteral("--object-path /org/freedesktop/portal/desktop") - << QStringLiteral("--method org.freedesktop.portal.Settings.Read " - "org.freedesktop.appearance color-scheme"); + << QStringLiteral("--object-path /org/freedesktop/portal/desktop") + << QStringLiteral("--method org.freedesktop.portal.Settings.Read") + << QStringLiteral("org.freedesktop.appearance color-scheme"); process.start(QStringLiteral("gdbus call --session"), gdbus_arguments); process.waitForFinished(1000); QByteArray dbus_output = process.readAllStandardOutput(); @@ -5096,7 +5092,8 @@ void GMainWindow::changeEvent(QEvent* event) { UpdateUITheme(); } - } else QWidget::changeEvent(event); + } + QWidget::changeEvent(event); } void GMainWindow::LoadTranslation() { diff --git a/src/suyu/main.h b/src/suyu/main.h index d0f1bd96e6..f9a5057d83 100644 --- a/src/suyu/main.h +++ b/src/suyu/main.h @@ -167,7 +167,6 @@ class GMainWindow : public QMainWindow { public: void filterBarSetChecked(bool state); static bool CheckDarkMode(); - void UpdateUITheme(); explicit GMainWindow(std::unique_ptr config_, bool has_broken_vulkan); ~GMainWindow() override; diff --git a/src/suyu/uisettings.cpp b/src/suyu/uisettings.cpp index 8d65905104..7cf32ddd0e 100644 --- a/src/suyu/uisettings.cpp +++ b/src/suyu/uisettings.cpp @@ -23,12 +23,12 @@ namespace FS = Common::FS; namespace UISettings { const Themes included_themes{{ - {"Default", ":/default/"}, - {"Default Colorful", ":/colorful/"}, - {"Dark", ":/qdarkstyle/"}, - {"Dark Colorful", ":/colorful_dark/"}, - {"Midnight Blue", ":/qdarkstyle_midnight_blue/"}, - {"Midnight Blue Colorful", ":/colorful_midnight_blue/"}, + {"Default", ":/default"}, + {"Default monochrome", ":/monochrome"}, + {"Mine Shaft", ":/qdarkstyle"}, + {"Mine Shaft monochrome", ":/qdarkstyle_monochrome"}, + {"Midnight Blue", ":/qdarkstyle_midnight_blue"}, + {"Midnight Blue monochrome", ":/qdarkstyle_midnight_blue_monochrome"}, }}; Values values = {}; diff --git a/src/suyu/uisettings.h b/src/suyu/uisettings.h index 6bb903efa7..75571acde8 100644 --- a/src/suyu/uisettings.h +++ b/src/suyu/uisettings.h @@ -48,7 +48,7 @@ struct Shortcut { ContextualShortcut shortcut; }; -static constexpr std::string_view default_theme{"colorful"}; +static constexpr std::string_view default_theme{":/default"}; using Themes = std::array, 6>; extern const Themes included_themes; From 7c9545c82afacd88dc4cf7ab0f7ca353618829cb Mon Sep 17 00:00:00 2001 From: flodavid Date: Mon, 12 Feb 2024 04:01:25 +0100 Subject: [PATCH 081/165] Add dark mode configuration setting in UI tab - Allows to choose "Auto", "Always On" or "Always Off" - Dark mode options are only shown if the style does not support theme - If Auto is chosen, value is retrieved from OS - On Windows, the application needs a restart to apply the settings - Use the default dark palette for Windows, like on Linux --- src/common/settings.cpp | 1 + src/common/settings.h | 1 + src/common/settings_enums.h | 2 + src/suyu/configuration/configure_ui.cpp | 67 +++++++++ src/suyu/configuration/configure_ui.h | 1 + src/suyu/configuration/configure_ui.ui | 14 ++ src/suyu/configuration/qt_config.cpp | 10 +- src/suyu/main.cpp | 192 +++++++++++++++--------- src/suyu/startup_checks.cpp | 4 - src/suyu/uisettings.h | 3 + 10 files changed, 221 insertions(+), 74 deletions(-) diff --git a/src/common/settings.cpp b/src/common/settings.cpp index 948c557674..3339d5b4f0 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -67,6 +67,7 @@ SWITCHABLE(u8, true); // Used in UISettings // TODO see if we can move this to uisettings.cpp SWITCHABLE(ConfirmStop, true); +SWITCHABLE(DarkModeState, true); #undef SETTING #undef SWITCHABLE diff --git a/src/common/settings.h b/src/common/settings.h index 829759c94b..77788befe7 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -90,6 +90,7 @@ SWITCHABLE(u8, true); // Used in UISettings // TODO see if we can move this to uisettings.h SWITCHABLE(ConfirmStop, true); +SWITCHABLE(DarkModeState, true); #undef SETTING #undef SWITCHABLE diff --git a/src/common/settings_enums.h b/src/common/settings_enums.h index fabae6d687..777f5b1b0a 100644 --- a/src/common/settings_enums.h +++ b/src/common/settings_enums.h @@ -155,6 +155,8 @@ ENUM(ConsoleMode, Handheld, Docked); ENUM(AppletMode, HLE, LLE); +ENUM(DarkModeState, Off, On, Auto); + template inline std::string CanonicalizeEnum(Type id) { const auto group = EnumMetadata::Canonicalizations(); diff --git a/src/suyu/configuration/configure_ui.cpp b/src/suyu/configuration/configure_ui.cpp index 046b34721e..589c035589 100644 --- a/src/suyu/configuration/configure_ui.cpp +++ b/src/suyu/configuration/configure_ui.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include "common/common_types.h" #include "common/fs/path_util.h" @@ -29,6 +30,8 @@ #include "suyu/uisettings.h" #include "ui_configure_ui.h" +using Settings::DarkModeState; + namespace { constexpr std::array default_game_icon_sizes{ std::make_pair(0, QT_TRANSLATE_NOOP("ConfigureUI", "None")), @@ -153,6 +156,9 @@ ConfigureUi::ConfigureUi(Core::System& system_, QWidget* parent) &ConfigureUi::RequestGameListUpdate); connect(ui->row_2_text_combobox, QOverload::of(&QComboBox::currentIndexChanged), this, &ConfigureUi::RequestGameListUpdate); + // Update available dark mode options depending on selected style + connect(ui->theme_combobox, QOverload::of(&QComboBox::currentIndexChanged), this, + &ConfigureUi::UpdateDarkModeOptions); // Update text ComboBoxes after user interaction. connect(ui->row_1_text_combobox, QOverload::of(&QComboBox::activated), @@ -185,6 +191,8 @@ ConfigureUi::~ConfigureUi() = default; void ConfigureUi::ApplyConfiguration() { UISettings::values.theme = ui->theme_combobox->itemData(ui->theme_combobox->currentIndex()).toString(); + UISettings::values.dark_mode_state = + static_cast(ui->dark_mode_combobox->currentData().toUInt()); UISettings::values.show_add_ons = ui->show_add_ons->isChecked(); UISettings::values.show_compat = ui->show_compat->isChecked(); UISettings::values.show_size = ui->show_size->isChecked(); @@ -206,12 +214,71 @@ void ConfigureUi::ApplyConfiguration() { system.ApplySettings(); } +void ConfigureUi::UpdateDarkModeOptions() { + ui->dark_mode_combobox->clear(); + + QString selected_theme = ui->theme_combobox->currentData().toString(); + + /* Dark mode option are added according to the modes the current style supports */ + bool has_common_style = QFile::exists(selected_theme + QStringLiteral("/style.qss")); + bool has_light_style = QFile::exists(selected_theme + QStringLiteral("/light.qss")); + bool has_dark_style = QFile::exists(selected_theme + QStringLiteral("/dark.qss")); +#ifdef _WIN32 + // Indicate which option needs a restart to be applied, depending on current environment + // variable + QByteArray current_qt_qpa = qgetenv("QT_QPA_PLATFORM"); + if (current_qt_qpa.contains("darkmode=2")) { + if (has_common_style || (has_dark_style && has_light_style)) { + ui->dark_mode_combobox->addItem(tr("Auto"), QVariant::fromValue(DarkModeState::Auto)); + } + if (has_common_style || has_dark_style) { + ui->dark_mode_combobox->addItem(tr("Always On") + + QStringLiteral(" (%1)").arg(tr("Needs restart")), + QVariant::fromValue(DarkModeState::On)); + } + if (has_common_style || has_light_style) { + ui->dark_mode_combobox->addItem(tr("Always Off") + + QStringLiteral(" (%1)").arg(tr("Needs restart")), + QVariant::fromValue(DarkModeState::Off)); + } + } else { + if (has_common_style || (has_dark_style && has_light_style)) { + ui->dark_mode_combobox->addItem(tr("Auto") + + QStringLiteral(" (%1)").arg(tr("Needs restart")), + QVariant::fromValue(DarkModeState::Auto)); + } + if (has_common_style || has_dark_style) { + ui->dark_mode_combobox->addItem(tr("Always On"), + QVariant::fromValue(DarkModeState::On)); + } + if (has_common_style || has_light_style) { + ui->dark_mode_combobox->addItem(tr("Always Off"), + QVariant::fromValue(DarkModeState::Off)); + } + } +#else + if (has_common_style || (has_dark_style && has_light_style)) { + ui->dark_mode_combobox->addItem(tr("Auto"), QVariant::fromValue(DarkModeState::Auto)); + } + if (has_common_style || has_dark_style) { + ui->dark_mode_combobox->addItem(tr("Always On"), QVariant::fromValue(DarkModeState::On)); + } + if (has_common_style || has_light_style) { + ui->dark_mode_combobox->addItem(tr("Always Off"), QVariant::fromValue(DarkModeState::Off)); + } +#endif +} + void ConfigureUi::RequestGameListUpdate() { UISettings::values.is_game_list_reload_pending.exchange(true); } void ConfigureUi::SetConfiguration() { ui->theme_combobox->setCurrentIndex(ui->theme_combobox->findData(UISettings::values.theme)); + // Dark mode options are populated after the theme is selected, to get the current configuration + UpdateDarkModeOptions(); + ui->dark_mode_combobox->setCurrentIndex( + ui->dark_mode_combobox->findData(QVariant::fromValue(UISettings::values.dark_mode_state))); ui->language_combobox->setCurrentIndex(ui->language_combobox->findData( QString::fromStdString(UISettings::values.language.GetValue()))); ui->show_add_ons->setChecked(UISettings::values.show_add_ons.GetValue()); diff --git a/src/suyu/configuration/configure_ui.h b/src/suyu/configuration/configure_ui.h index 2a2563a131..a52ad7cc74 100644 --- a/src/suyu/configuration/configure_ui.h +++ b/src/suyu/configuration/configure_ui.h @@ -34,6 +34,7 @@ signals: void LanguageChanged(const QString& locale); private: + void UpdateDarkModeOptions(); void RequestGameListUpdate(); void SetConfiguration(); diff --git a/src/suyu/configuration/configure_ui.ui b/src/suyu/configuration/configure_ui.ui index b8e6483814..cdd46005fd 100644 --- a/src/suyu/configuration/configure_ui.ui +++ b/src/suyu/configuration/configure_ui.ui @@ -63,6 +63,20 @@ + + + + + + Dark Mode: + + + + + + + + diff --git a/src/suyu/configuration/qt_config.cpp b/src/suyu/configuration/qt_config.cpp index 2868db4ebb..2ed14ee2be 100644 --- a/src/suyu/configuration/qt_config.cpp +++ b/src/suyu/configuration/qt_config.cpp @@ -260,8 +260,10 @@ void QtConfig::ReadShortcutValues() { void QtConfig::ReadUIValues() { BeginGroup(Settings::TranslateCategory(Settings::Category::Ui)); - UISettings::values.theme = QString::fromStdString( - ReadStringSetting(std::string("theme"), std::string(UISettings::default_theme))); + UISettings::values.theme = + QString::fromStdString(ReadStringSetting("theme", std::string(UISettings::default_theme))); + UISettings::values.dark_mode_state = static_cast( + ReadIntegerSetting("dark_mode_state", static_cast(DarkModeState::Auto))); ReadUIGamelistValues(); ReadUILayoutValues(); @@ -467,8 +469,10 @@ void QtConfig::SaveUIValues() { WriteCategory(Settings::Category::Ui); WriteCategory(Settings::Category::UiGeneral); - WriteStringSetting(std::string("theme"), UISettings::values.theme.toStdString(), + WriteStringSetting("theme", UISettings::values.theme.toStdString(), std::make_optional(std::string(UISettings::default_theme))); + WriteIntegerSetting("dark_mode_state", static_cast(UISettings::values.dark_mode_state), + std::make_optional(static_cast(DarkModeState::Auto))); SaveUIGamelistValues(); SaveUILayoutValues(); diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index b687e2500d..13089859f2 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -3536,6 +3536,7 @@ void GMainWindow::ResetWindowSize1080() { void GMainWindow::OnConfigure() { const QString old_theme = UISettings::values.theme; + DarkModeState old_dark_mode_state = UISettings::values.dark_mode_state; const bool old_discord_presence = UISettings::values.enable_discord_presence.GetValue(); const auto old_language_index = Settings::values.language_index.GetValue(); #ifdef __unix__ @@ -3594,7 +3595,8 @@ void GMainWindow::OnConfigure() { } InitializeHotkeys(); - if (UISettings::values.theme != old_theme) { + if (UISettings::values.theme != old_theme || + UISettings::values.dark_mode_state != old_dark_mode_state) { UpdateUITheme(); } if (UISettings::values.enable_discord_presence.GetValue() != old_discord_presence) { @@ -4791,13 +4793,11 @@ void GMainWindow::filterBarSetChecked(bool state) { } void GMainWindow::UpdateUITheme() { - LOG_DEBUG(Frontend, "Updating UI"); - QString default_theme = QString::fromStdString(UISettings::default_theme.data()); + const QString default_theme = QString::fromStdString(UISettings::default_theme.data()); QString current_theme = UISettings::values.theme; if (current_theme.isEmpty()) { current_theme = default_theme; } - const bool current_dark_mode = CheckDarkMode(); UpdateIcons(current_theme); @@ -4860,7 +4860,7 @@ bool GMainWindow::TryLoadStylesheet(const QString& theme_uri) { style_path = theme_uri + QStringLiteral("/light.qss"); } if (!QFile::exists(style_path)) { - LOG_INFO(Frontend, "Themed (light/dark) stylesheet could not be found, using default one"); + LOG_DEBUG(Frontend, "No themed (light/dark) stylesheet, using default one"); // Use common stylesheet if themed one does not exist style_path = theme_uri + QStringLiteral("/style.qss"); } @@ -4871,7 +4871,7 @@ bool GMainWindow::TryLoadStylesheet(const QString& theme_uri) { // Update the color palette before applying the stylesheet UpdateThemePalette(); - LOG_INFO(Frontend, "Loading stylesheet in: {}", theme_uri.toStdString()); + LOG_DEBUG(Frontend, "Loading stylesheet in: {}", theme_uri.toStdString()); QTextStream ts_theme(&style_file); qApp->setStyleSheet(ts_theme.readAll()); setStyleSheet(ts_theme.readAll()); @@ -4903,12 +4903,34 @@ void GMainWindow::UpdateThemePalette() { QPalette themePalette(qApp->palette()); #ifdef _WIN32 QColor dark(25, 25, 25); - QColor darkGray(100, 100, 100); - QColor gray(150, 150, 150); - QColor light(230, 230, 230); - // By default, revert fusion style set for Windows dark theme - QString style; + QString style_name; if (CheckDarkMode()) { + // We check that the dark mode state is "On" and force a dark palette + if (UISettings::values.dark_mode_state == DarkModeState::On) { + // Set Default Windows Dark palette on Windows platforms to force Dark mode + themePalette.setColor(QPalette::Window, Qt::black); + themePalette.setColor(QPalette::WindowText, Qt::white); + themePalette.setColor(QPalette::Disabled, QPalette::WindowText, QColor(127, 127, 127)); + themePalette.setColor(QPalette::Base, Qt::black); + themePalette.setColor(QPalette::AlternateBase, dark); + themePalette.setColor(QPalette::ToolTipBase, Qt::white); + themePalette.setColor(QPalette::ToolTipText, Qt::black); + themePalette.setColor(QPalette::Text, Qt::white); + themePalette.setColor(QPalette::Disabled, QPalette::Text, QColor(127, 127, 127)); + themePalette.setColor(QPalette::Dark, QColor(128, 128, 128)); + themePalette.setColor(QPalette::Shadow, Qt::white); + themePalette.setColor(QPalette::Button, Qt::black); + themePalette.setColor(QPalette::ButtonText, Qt::white); + themePalette.setColor(QPalette::Disabled, QPalette::ButtonText, QColor(127, 127, 127)); + themePalette.setColor(QPalette::BrightText, QColor(192, 192, 192)); + themePalette.setColor(QPalette::Link, QColor(0, 140, 200)); + themePalette.setColor(QPalette::Highlight, QColor(24, 70, 93)); + themePalette.setColor(QPalette::Disabled, QPalette::Highlight, QColor(0, 85, 255)); + themePalette.setColor(QPalette::HighlightedText, QColor(239, 240, 241)); + themePalette.setColor(QPalette::Disabled, QPalette::HighlightedText, + QColor(239, 240, 241)); + } + // AlternateBase is kept at rgb(233, 231, 227) or rgb(245, 245, 245) on Windows dark // palette, fix this. Sometimes, it even is rgb(0, 0, 0), but uses a very light gray for // alternate rows, do not know why @@ -4919,22 +4941,23 @@ void GMainWindow::UpdateThemePalette() { alternate_base_modified = true; } // Use fusion theme, since its close to windowsvista, but works well with a dark palette - style = QStringLiteral("fusion"); + style_name = QStringLiteral("fusion"); } else { // Reset AlternateBase if it has been modified if (alternate_base_modified) { themePalette.setColor(QPalette::AlternateBase, QColor(245, 245, 245)); alternate_base_modified = false; } + // Reset light palette + themePalette = this->style()->standardPalette(); // Reset Windows theme to the default - style = QStringLiteral("windowsvista"); + style_name = QStringLiteral("windowsvista"); } - LOG_DEBUG(Frontend, "Using style: {}", style.toStdString()); - qApp->setStyle(style); + LOG_DEBUG(Frontend, "Using style: {}", style_name.toStdString()); + qApp->setStyle(style_name); #else if (CheckDarkMode()) { // Set Dark palette on non Windows platforms (that may not have a dark palette) - LOG_INFO(Frontend, "Using custom dark palette"); themePalette.setColor(QPalette::Window, QColor(53, 53, 53)); themePalette.setColor(QPalette::WindowText, Qt::white); themePalette.setColor(QPalette::Disabled, QPalette::WindowText, QColor(127, 127, 127)); @@ -4956,8 +4979,7 @@ void GMainWindow::UpdateThemePalette() { themePalette.setColor(QPalette::HighlightedText, Qt::white); themePalette.setColor(QPalette::Disabled, QPalette::HighlightedText, QColor(127, 127, 127)); } else { - LOG_INFO(Frontend, "Using standard palette"); - // Reset light palette on non Windows platforms + // Reset light palette themePalette = this->style()->standardPalette(); } #endif @@ -5018,61 +5040,72 @@ bool GMainWindow::ListenColorSchemeChange() { #endif bool GMainWindow::CheckDarkMode() { - const QPalette current_palette(qApp->palette()); + bool is_dark_mode_auto; +#ifdef _WIN32 + // Dark mode cannot be changed after the app started on Windows + is_dark_mode_auto = qgetenv("QT_QPA_PLATFORM").contains("darkmode=2"); +#else + is_dark_mode_auto = UISettings::values.dark_mode_state == DarkModeState::Auto; +#endif + if (!is_dark_mode_auto) { + return UISettings::values.dark_mode_state == DarkModeState::On; + } else { + const QPalette current_palette(qApp->palette()); #ifdef __unix__ - QProcess process; - QStringList gdbus_arguments; + QProcess process; - // Using the freedesktop specifications for checking dark mode - LOG_INFO(Frontend, "Retrieving theme from freedesktop color-scheme..."); - gdbus_arguments << QStringLiteral("--dest=org.freedesktop.portal.Desktop") - << QStringLiteral("--object-path /org/freedesktop/portal/desktop") - << QStringLiteral("--method org.freedesktop.portal.Settings.Read") - << QStringLiteral("org.freedesktop.appearance color-scheme"); - process.start(QStringLiteral("gdbus call --session"), gdbus_arguments); - process.waitForFinished(1000); - QByteArray dbus_output = process.readAllStandardOutput(); + // Using the freedesktop specifications for checking dark mode + LOG_DEBUG(Frontend, "Retrieving theme from freedesktop color-scheme..."); + QStringList gdbus_arguments; + gdbus_arguments << QStringLiteral("--dest=org.freedesktop.portal.Desktop") + << QStringLiteral("--object-path /org/freedesktop/portal/desktop") + << QStringLiteral("--method org.freedesktop.portal.Settings.Read") + << QStringLiteral("org.freedesktop.appearance color-scheme"); + process.start(QStringLiteral("gdbus call --session"), gdbus_arguments); + process.waitForFinished(1000); + QByteArray dbus_output = process.readAllStandardOutput(); - if (!dbus_output.isEmpty()) { - const int systemColorSchema = QString::fromUtf8(dbus_output).trimmed().right(1).toInt(); - return systemColorSchema == 1; - } + if (!dbus_output.isEmpty()) { + const int systemColorSchema = QString::fromUtf8(dbus_output).trimmed().right(1).toInt(); + return systemColorSchema == 1; + } - // Try alternative for Gnome if the previous one failed - QStringList gsettings_arguments; - gsettings_arguments << QStringLiteral("get") - << QStringLiteral("org.gnome.desktop.interface") - << QStringLiteral("color-scheme"); - - LOG_DEBUG(Frontend, "failed, retrieving theme from gsettings color-scheme..."); - process.start(QStringLiteral("gsettings"), gsettings_arguments); - process.waitForFinished(1000); - QByteArray gsettings_output = process.readAllStandardOutput(); - - // Try older gtk-theme method if the previous one failed - if (gsettings_output.isEmpty()) { - LOG_INFO(Frontend, "failed, retrieving theme from gtk-theme..."); - gsettings_arguments.takeLast(); - gsettings_arguments << QStringLiteral("gtk-theme"); + // Try alternative for Gnome if the previous one failed + QStringList gsettings_arguments; + gsettings_arguments << QStringLiteral("get") + << QStringLiteral("org.gnome.desktop.interface") + << QStringLiteral("color-scheme"); + LOG_DEBUG(Frontend, "failed, retrieving theme from gsettings color-scheme..."); process.start(QStringLiteral("gsettings"), gsettings_arguments); process.waitForFinished(1000); - gsettings_output = process.readAllStandardOutput(); - } + QByteArray gsettings_output = process.readAllStandardOutput(); - // Interpret gsettings value if it succeeded - if (!gsettings_output.isEmpty()) { - QString systeme_theme = QString::fromUtf8(gsettings_output); - LOG_DEBUG(Frontend, "Gsettings output: {}", systeme_theme.toStdString()); - return systeme_theme.contains(QStringLiteral("dark"), Qt::CaseInsensitive); - } - LOG_DEBUG(Frontend, "failed, retrieving theme from palette"); + // Try older gtk-theme method if the previous one failed + if (gsettings_output.isEmpty()) { + LOG_DEBUG(Frontend, "failed, retrieving theme from gtk-theme..."); + gsettings_arguments.takeLast(); + gsettings_arguments << QStringLiteral("gtk-theme"); + + process.start(QStringLiteral("gsettings"), gsettings_arguments); + process.waitForFinished(1000); + gsettings_output = process.readAllStandardOutput(); + } + + // Interpret gsettings value if it succeeded + if (!gsettings_output.isEmpty()) { + QString systeme_theme = QString::fromUtf8(gsettings_output); + LOG_DEBUG(Frontend, "Gsettings output: {}", systeme_theme.toStdString()); + return systeme_theme.contains(QStringLiteral("dark"), Qt::CaseInsensitive); + } + LOG_DEBUG(Frontend, "failed, retrieving theme from palette"); #endif - // Use default method based on palette swap by OS. - // It is the only method on Windows with Qt 5. - // Windows needs QT_QPA_PLATFORM env variable set to windows:darkmode=2 to force palette change - return (current_palette.color(QPalette::WindowText).lightness() > - current_palette.color(QPalette::Window).lightness()); + // Use default method based on palette swap by OS. It is the only method on Windows with + // Qt 5. Windows needs QT_QPA_PLATFORM env variable set to windows:darkmode=2 to force + // palette change + return (current_palette.color(QPalette::WindowText).lightness() > + current_palette.color(QPalette::Window).lightness()); + } } void GMainWindow::changeEvent(QEvent* event) { @@ -5080,9 +5113,9 @@ void GMainWindow::changeEvent(QEvent* event) { // UpdateUITheme is a decent work around if (event->type() == QEvent::PaletteChange || event->type() == QEvent::ApplicationPaletteChange) { - LOG_INFO(Frontend, - "Window color palette changed by event: {} (QEvent::PaletteChange is: {})", - event->type(), QEvent::PaletteChange); + LOG_DEBUG(Frontend, + "Window color palette changed by event: {} (QEvent::PaletteChange is: {})", + event->type(), QEvent::PaletteChange); const QPalette test_palette(qApp->palette()); // Keeping eye on QPalette::Window to avoid looping. QPalette::Text might be useful too const QColor window_color = test_palette.color(QPalette::Active, QPalette::Window); @@ -5274,6 +5307,31 @@ int main(int argc, char* argv[]) { QCoreApplication::setApplicationName(QStringLiteral("suyu")); #ifdef _WIN32 + QByteArray current_qt_qpa = qgetenv("QT_QPA_PLATFORM"); + // Follow dark mode setting, if the "-platform" launch option is not set. + // Otherwise, just follow dark mode for the window decoration (title bar). + if (!current_qt_qpa.contains(":darkmode=")) { + if (UISettings::values.dark_mode_state == DarkModeState::Auto) { + // When setting is Auto, force adapting window decoration and stylesheet palette to use + // Windows theme. Default is darkmode:0, which always uses light palette + if (current_qt_qpa.isEmpty()) { + // Set the value + qputenv("QT_QPA_PLATFORM", QByteArray("windows:darkmode=2")); + } else { + // Concatenate to the existing value + qputenv("QT_QPA_PLATFORM", current_qt_qpa + ",darkmode=2"); + } + } else { + // When setting is no Auto, adapt window decoration to the palette used + if (current_qt_qpa.isEmpty()) { + // Set the value + qputenv("QT_QPA_PLATFORM", QByteArray("windows:darkmode=1")); + } else { + // Concatenate to the existing value + qputenv("QT_QPA_PLATFORM", current_qt_qpa + ",darkmode=1"); + } + } + } // Increases the maximum open file limit to 8192 _setmaxstdio(8192); #endif diff --git a/src/suyu/startup_checks.cpp b/src/suyu/startup_checks.cpp index 32011f6d5c..07e8bcb5d8 100644 --- a/src/suyu/startup_checks.cpp +++ b/src/suyu/startup_checks.cpp @@ -6,7 +6,6 @@ #ifdef _WIN32 #include #include -#include #include #include #elif defined(SUYU_UNIX) @@ -38,9 +37,6 @@ void CheckVulkan() { bool CheckEnvVars(bool* is_child) { #ifdef _WIN32 - // Force adapting theme to follow Windows dark mode - qputenv("QT_QPA_PLATFORM", QByteArray("windows:darkmode=2")); - // Check environment variable to see if we are the child char variable_contents[8]; const DWORD startup_check_var = diff --git a/src/suyu/uisettings.h b/src/suyu/uisettings.h index 75571acde8..ded6a42244 100644 --- a/src/suyu/uisettings.h +++ b/src/suyu/uisettings.h @@ -18,6 +18,7 @@ using Settings::Category; using Settings::ConfirmStop; +using Settings::DarkModeState; using Settings::Setting; using Settings::SwitchableSetting; @@ -144,6 +145,7 @@ struct Values { Setting language{linkage, {}, "language", Category::Paths}; QString theme; + DarkModeState dark_mode_state; // Shortcut name std::vector shortcuts; @@ -261,3 +263,4 @@ Q_DECLARE_METATYPE(Settings::RendererBackend); Q_DECLARE_METATYPE(Settings::ShaderBackend); Q_DECLARE_METATYPE(Settings::AstcRecompression); Q_DECLARE_METATYPE(Settings::AstcDecodeMode); +Q_DECLARE_METATYPE(Settings::DarkModeState); From 3cdd76b23dd7e2b6b33739f573d57709a29d39fc Mon Sep 17 00:00:00 2001 From: flodavid Date: Fri, 23 Feb 2024 16:37:41 +0100 Subject: [PATCH 082/165] Fix qdarkstyle and midnight blue sliders being cropped - Allow Threshold sliders in control configuration to be up to 40px tall, instead of 15 --- dist/qt_themes/qdarkstyle/dark.qss | 4 ++ .../qdarkstyle_midnight_blue/dark.qss | 4 ++ .../configuration/configure_input_player.ui | 72 +++++++++---------- 3 files changed, 44 insertions(+), 36 deletions(-) diff --git a/dist/qt_themes/qdarkstyle/dark.qss b/dist/qt_themes/qdarkstyle/dark.qss index 09397f89f5..95e575c42f 100644 --- a/dist/qt_themes/qdarkstyle/dark.qss +++ b/dist/qt_themes/qdarkstyle/dark.qss @@ -944,6 +944,10 @@ QListView::indicator:indeterminate:pressed { image: url(:/qss_icons/rc/checkbox_indeterminate_focus.png); } +QSlider:horizontal { + height: 20px; +} + QSlider::groove:horizontal { border: 1px solid #565a5e; height: 4px; diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/dark.qss b/dist/qt_themes/qdarkstyle_midnight_blue/dark.qss index a90ac5d5e0..3086b90ade 100644 --- a/dist/qt_themes/qdarkstyle_midnight_blue/dark.qss +++ b/dist/qt_themes/qdarkstyle_midnight_blue/dark.qss @@ -1296,6 +1296,10 @@ QSlider:focus { border: none; } +QSlider:horizontal { + height: 20px; +} + QSlider::groove:horizontal { background: #32414B; border: 1px solid #32414B; diff --git a/src/suyu/configuration/configure_input_player.ui b/src/suyu/configuration/configure_input_player.ui index 5beb1b6bfc..761015cd94 100644 --- a/src/suyu/configuration/configure_input_player.ui +++ b/src/suyu/configuration/configure_input_player.ui @@ -1430,12 +1430,12 @@ - - - 0 - 0 - - + + + 0 + 0 + + ZL @@ -1481,20 +1481,20 @@ - - - - 70 - 15 - - - - 100 - - - Qt::Horizontal - - + + + + 70 + 40 + + + + 100 + + + Qt::Horizontal + + @@ -1927,22 +1927,22 @@ - - - - - 70 - 15 - - - - 100 - - - Qt::Horizontal - - - + + + + + 70 + 40 + + + + 100 + + + Qt::Horizontal + + + From be31d5f56c8c3df26690c3fcaf9a82151966d12a Mon Sep 17 00:00:00 2001 From: Fijxu Date: Tue, 2 Apr 2024 14:12:27 -0300 Subject: [PATCH 083/165] Enable Windows MinGW artifacts. --- .ci/scripts/windows/docker.sh | 9 ++++++--- .forgejo/workflows/verify.yml | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.ci/scripts/windows/docker.sh b/.ci/scripts/windows/docker.sh index 70eadda41e..a2fb4e3dd1 100755 --- a/.ci/scripts/windows/docker.sh +++ b/.ci/scripts/windows/docker.sh @@ -1,6 +1,7 @@ #!/bin/bash -ex # SPDX-FileCopyrightText: 2019 yuzu Emulator Project +# SPDX-FileCopyrightText: 2024 suyu Emulator Project # SPDX-License-Identifier: GPL-2.0-or-later set -e @@ -9,12 +10,14 @@ set -e ccache -sv +rm -rf build mkdir -p build && cd build -cmake .. \ +/usr/bin/x86_64-w64-mingw32-cmake .. \ -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_TOOLCHAIN_FILE="${PWD}/../CMakeModules/MinGWCross.cmake" \ -DDISPLAY_VERSION="$1" \ - -DENABLE_COMPATIBILITY_LIST_DOWNLOAD=ON \ + -DDYNARMIC_USE_PRECOMPILED_HEADERS=OFF \ + -DSUYU_USE_PRECOMPILED_HEADERS=OFF \ + -DENABLE_COMPATIBILITY_LIST_DOWNLOAD=OFF \ -DENABLE_QT_TRANSLATION=ON \ -DUSE_CCACHE=ON \ -DSUYU_USE_BUNDLED_SDL2=OFF \ diff --git a/.forgejo/workflows/verify.yml b/.forgejo/workflows/verify.yml index f89166dbde..1292ddcfa9 100644 --- a/.forgejo/workflows/verify.yml +++ b/.forgejo/workflows/verify.yml @@ -63,8 +63,8 @@ jobs: image: linux-fresh - type: linux image: linux-fresh - # - type: windows - # image: linux-mingw + - type: windows + image: linux-mingw container: fijxu/build-environments:${{ matrix.image }} # User 1001 doesn't exists on the images. # options: -u 1001 From 77205848afa64fe346e8357397104d266a553033 Mon Sep 17 00:00:00 2001 From: Crimson Hawk Date: Sat, 6 Apr 2024 13:34:23 -0400 Subject: [PATCH 084/165] Add requested changes Commited by Exverge --- .ci/scripts/windows/docker.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.ci/scripts/windows/docker.sh b/.ci/scripts/windows/docker.sh index a2fb4e3dd1..73e000324c 100755 --- a/.ci/scripts/windows/docker.sh +++ b/.ci/scripts/windows/docker.sh @@ -18,6 +18,7 @@ mkdir -p build && cd build -DDYNARMIC_USE_PRECOMPILED_HEADERS=OFF \ -DSUYU_USE_PRECOMPILED_HEADERS=OFF \ -DENABLE_COMPATIBILITY_LIST_DOWNLOAD=OFF \ + -DUSE_DISCORD_PRESENCE=ON \ -DENABLE_QT_TRANSLATION=ON \ -DUSE_CCACHE=ON \ -DSUYU_USE_BUNDLED_SDL2=OFF \ From 641ef1b887e7e5bf6eac24315cba87005b47a54c Mon Sep 17 00:00:00 2001 From: Exverge Date: Sun, 7 Apr 2024 15:54:44 -0400 Subject: [PATCH 085/165] Map methods in firmware 18.0.0 --- src/core/hle/service/acc/acc.cpp | 22 ++++++++-- src/core/hle/service/audio/audio_device.cpp | 11 ++++- .../hle/service/filesystem/fsp/fsp_srv.cpp | 3 +- src/core/hle/service/ldn/ldn.cpp | 2 + .../system_local_communication_service.cpp | 7 ++++ .../ldn/user_local_communication_service.cpp | 9 ++++- src/core/hle/service/npns/npns.cpp | 40 +++++++++++++++---- .../service/pctl/parental_control_service.cpp | 7 ++++ src/core/hle/service/ssl/ssl.cpp | 6 ++- 9 files changed, 92 insertions(+), 15 deletions(-) diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp index 888b34336b..d0771996b7 100644 --- a/src/core/hle/service/acc/acc.cpp +++ b/src/core/hle/service/acc/acc.cpp @@ -102,6 +102,7 @@ public: {150, nullptr, "CreateAuthorizationRequest"}, {160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"}, {161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"}, + {180, nullptr, "GetRequestForNintendoAccountReauthentication"}, // 18.0.0+ }; // clang-format on @@ -135,6 +136,7 @@ public: {13, nullptr, "GetLinkedNintendoAccountId"}, {14, nullptr, "GetNickname"}, {15, nullptr, "GetProfileImage"}, + {16, nullptr, "GetProfileLargeImage"}, // 18.0.0+ {21, nullptr, "LoadIdTokenCache"}, {100, nullptr, "RegisterUser"}, // [1.0.0-3.0.2] RegisterAsync {101, nullptr, "RegisterUserWithUid"}, // [1.0.0-3.0.2] RegisterWithUidAsync @@ -176,10 +178,11 @@ public: {140, nullptr, "GetNetworkServiceLicenseCache"}, // 5.0.0+ {141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+ {142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+ - {143, nullptr, "GetNetworkServiceLicenseCacheEx"}, + {143, nullptr, "GetNetworkServiceLicenseCacheEx"}, // 15.0.0+ {150, nullptr, "CreateAuthorizationRequest"}, - {160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"}, - {161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"}, + {160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"}, // 16.0.0+ + {161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"}, // 16.0.0+ + {180, nullptr, "GetRequestForNintendoAccountReauthentication"}, // 18.0.0+ {200, nullptr, "IsRegistered"}, {201, nullptr, "RegisterAsync"}, {202, nullptr, "UnregisterAsync"}, @@ -263,6 +266,7 @@ public: {101, nullptr, "GetLinkedNintendoAccountId"}, {102, nullptr, "GetNickname"}, {103, nullptr, "GetProfileImage"}, + {104, nullptr, "GetProfileLargeImage"}, // 18.0.0+ }; // clang-format on @@ -317,6 +321,9 @@ public: {1, &IProfileCommon::GetBase, "GetBase"}, {10, &IProfileCommon::GetImageSize, "GetImageSize"}, {11, &IProfileCommon::LoadImage, "LoadImage"}, + {20, &IProfileCommon::GetImageSize, "GetLargeImageSize"}, // 18.0.0+ + {21, &IProfileCommon::LoadImage, "LoadLargeImage"}, // 18.0.0+ + {30, nullptr, "GetImageId"}, // 18.0.0+ }; RegisterHandlers(functions); @@ -325,6 +332,7 @@ public: static const FunctionInfo editor_functions[] = { {100, &IProfileCommon::Store, "Store"}, {101, &IProfileCommon::StoreWithImage, "StoreWithImage"}, + {110, &IProfileCommon::StoreWithImage, "StoreWithLargeImage"}, // 18.0.0+ }; RegisterHandlers(editor_functions); @@ -530,6 +538,7 @@ public: {13, nullptr, "GetLinkedNintendoAccountId"}, {14, nullptr, "GetNickname"}, {15, nullptr, "GetProfileImage"}, + {16, nullptr, "GetProfileLargeImage"}, // 18.0.0+ {21, nullptr, "LoadIdTokenCache"}, // 3.0.0+ }; // clang-format on @@ -684,8 +693,15 @@ public: {101, nullptr, "GetLinkedNintendoAccountId"}, {102, nullptr, "GetNickname"}, {103, nullptr, "GetProfileImage"}, + {104, nullptr, "GetProfileLargeImage"}, // 18.0.0+ {110, nullptr, "RegisterUserAsync"}, {111, nullptr, "GetUid"}, + {200, nullptr, "ApplyResponseForUserCreationAsync"}, // 17.0.0+ + {205, nullptr, "SuspendAfterApplyResponse"}, // 17.0.0+ + {210, nullptr, "IsProfileAvailable"}, // 17.0.0+ + {220, nullptr, "RegisterUserAsyncWithoutProfile"}, // 17.0.0+ + {221, nullptr, "RegisterUserWithProfileAsync"}, // 17.0.0+ + {230, nullptr, "RegisterUserWithLargeImageProfileAsync"}, // 18.0.0+ }; // clang-format on diff --git a/src/core/hle/service/audio/audio_device.cpp b/src/core/hle/service/audio/audio_device.cpp index 438f3cccdf..d3b104f710 100644 --- a/src/core/hle/service/audio/audio_device.cpp +++ b/src/core/hle/service/audio/audio_device.cpp @@ -27,8 +27,15 @@ IAudioDevice::IAudioDevice(Core::System& system_, u64 applet_resource_user_id, u {10, D<&IAudioDevice::GetActiveAudioDeviceNameAuto>, "GetActiveAudioDeviceNameAuto"}, {11, D<&IAudioDevice::QueryAudioDeviceInputEvent>, "QueryAudioDeviceInputEvent"}, {12, D<&IAudioDevice::QueryAudioDeviceOutputEvent>, "QueryAudioDeviceOutputEvent"}, - {13, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioOutputDeviceName"}, - {14, D<&IAudioDevice::ListAudioOutputDeviceName>, "ListAudioOutputDeviceName"}, + {13, D<&IAudioDevice::GetActiveAudioDeviceName>, + "GetActiveAudioOutputDeviceName"}, // 13.0.0+ + {14, D<&IAudioDevice::ListAudioOutputDeviceName>, "ListAudioOutputDeviceName"}, // 13.0.0+ + {15, nullptr, "AcquireAudioInputDeviceNotification"}, // 17.0.0+ + {16, nullptr, "ReleaseAudioInputDeviceNotification"}, // 17.0.0+ + {17, nullptr, "AcquireAudioOutputDeviceNotification"}, // 17.0.0+ + {18, nullptr, "ReleaseAudioOutputDeviceNotification"}, // 17.0.0+ + {19, nullptr, "SetAudioDeviceOutputVolumeAutoTuneEnabled"}, // 18.0.0+ + {20, nullptr, "IsAudioDeviceOutputVolumeAutoTuneEnabled"} // 18.0.0+ }; RegisterHandlers(functions); diff --git a/src/core/hle/service/filesystem/fsp/fsp_srv.cpp b/src/core/hle/service/filesystem/fsp/fsp_srv.cpp index 2bc6361bb7..ed503d5d6a 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_srv.cpp +++ b/src/core/hle/service/filesystem/fsp/fsp_srv.cpp @@ -53,7 +53,7 @@ FSP_SRV::FSP_SRV(Core::System& system_) {1, D<&FSP_SRV::SetCurrentProcess>, "SetCurrentProcess"}, {2, nullptr, "OpenDataFileSystemByCurrentProcess"}, {7, D<&FSP_SRV::OpenFileSystemWithPatch>, "OpenFileSystemWithPatch"}, - {8, nullptr, "OpenFileSystemWithId"}, + {8, nullptr, "OpenFileSystemWithIdObsolete"}, // 16.0.0+, OpenFileSystemWithId 2.0.0-15.0.1 {9, nullptr, "OpenDataFileSystemByApplicationId"}, {11, nullptr, "OpenBisFileSystem"}, {12, nullptr, "OpenBisStorage"}, @@ -169,6 +169,7 @@ FSP_SRV::FSP_SRV(Core::System& system_) {1018, nullptr, "SetDebugOption"}, {1019, nullptr, "UnsetDebugOption"}, {1100, nullptr, "OverrideSaveDataTransferTokenSignVerificationKey"}, + {1101, nullptr, "OverrideSaveDataTransferKeyForTest"}, // 18.0.0+ {1110, nullptr, "CorruptSaveDataFileSystemBySaveDataSpaceId2"}, {1200, D<&FSP_SRV::OpenMultiCommitManager>, "OpenMultiCommitManager"}, {1300, nullptr, "OpenBisWiper"}, diff --git a/src/core/hle/service/ldn/ldn.cpp b/src/core/hle/service/ldn/ldn.cpp index f2d638c30e..1b0148fda0 100644 --- a/src/core/hle/service/ldn/ldn.cpp +++ b/src/core/hle/service/ldn/ldn.cpp @@ -40,6 +40,7 @@ public: // clang-format off static const FunctionInfo functions[] = { {0, C<&ISystemServiceCreator::CreateSystemLocalCommunicationService>, "CreateSystemLocalCommunicationService"}, + {1, nullptr, "CreateClientProcessMonitor"} // 18.0.0+ }; // clang-format on @@ -62,6 +63,7 @@ public: // clang-format off static const FunctionInfo functions[] = { {0, C<&IUserServiceCreator::CreateUserLocalCommunicationService>, "CreateUserLocalCommunicationService"}, + {1, nullptr, "CreateClientProcessMonitor"}, // 18.0.0+ }; // clang-format on diff --git a/src/core/hle/service/ldn/system_local_communication_service.cpp b/src/core/hle/service/ldn/system_local_communication_service.cpp index 7b52223cdc..fc283da4cf 100644 --- a/src/core/hle/service/ldn/system_local_communication_service.cpp +++ b/src/core/hle/service/ldn/system_local_communication_service.cpp @@ -40,6 +40,13 @@ ISystemLocalCommunicationService::ISystemLocalCommunicationService(Core::System& {401, nullptr, "FinalizeSystem"}, {402, nullptr, "SetOperationMode"}, {403, C<&ISystemLocalCommunicationService::InitializeSystem2>, "InitializeSystem2"}, + {500, nullptr, "EnableActionFrame"}, // 18.0.0+ + {501, nullptr, "DisableActionFrame"}, // 18.0.0+ + {502, nullptr, "SendActionFrame"}, // 18.0.0+ + {503, nullptr, "RecvActionFrame"}, // 18.0.0+ + {505, nullptr, "SetHomeChannel"}, // 18.0.0+ + {600, nullptr, "SetTxPower"}, // 18.0.0+ + {601, nullptr, "ResetTxPower"} // 18.0.0+ }; // clang-format on diff --git a/src/core/hle/service/ldn/user_local_communication_service.cpp b/src/core/hle/service/ldn/user_local_communication_service.cpp index f28368962f..8e559f4400 100644 --- a/src/core/hle/service/ldn/user_local_communication_service.cpp +++ b/src/core/hle/service/ldn/user_local_communication_service.cpp @@ -53,7 +53,14 @@ IUserLocalCommunicationService::IUserLocalCommunicationService(Core::System& sys {304, C<&IUserLocalCommunicationService::Disconnect>, "Disconnect"}, {400, C<&IUserLocalCommunicationService::Initialize>, "Initialize"}, {401, C<&IUserLocalCommunicationService::Finalize>, "Finalize"}, - {402, C<&IUserLocalCommunicationService::Initialize2>, "Initialize2"}, + {402, C<&IUserLocalCommunicationService::Initialize2>, "Initialize2"}, // 7.0.0+ + {500, nullptr, "EnableActionFrame"}, // 18.0.0+ + {501, nullptr, "DisableActionFrame"}, // 18.0.0+ + {502, nullptr, "SendActionFrame"}, // 18.0.0+ + {503, nullptr, "RecvActionFrame"}, // 18.0.0+ + {505, nullptr, "SetHomeChannel"}, // 18.0.0+ + {600, nullptr, "SetTxPower"}, // 18.0.0+ + {601, nullptr, "ResetTxPower"} // 18.0.0+ }; // clang-format on diff --git a/src/core/hle/service/npns/npns.cpp b/src/core/hle/service/npns/npns.cpp index e54827efef..0c6ba14b4e 100644 --- a/src/core/hle/service/npns/npns.cpp +++ b/src/core/hle/service/npns/npns.cpp @@ -24,26 +24,44 @@ public: {4, nullptr, "ReceiveRaw"}, {5, C<&INpnsSystem::GetReceiveEvent>, "GetReceiveEvent"}, {6, nullptr, "ListenUndelivered"}, - {7, nullptr, "GetStateChangeEVent"}, + {7, nullptr, "GetStateChangeEvent"}, + {8, nullptr, "ListenToByName"}, // 18.0.0+ {11, nullptr, "SubscribeTopic"}, {12, nullptr, "UnsubscribeTopic"}, {13, nullptr, "QueryIsTopicExist"}, + {14, nullptr, "SubscribeTopicByAccount"}, // 18.0.0+ + {15, nullptr, "UnsubscribeTopicByAccount"}, // 18.0.0+ + {16, nullptr, "DownloadSubscriptionList"}, // 18.0.0+ {21, nullptr, "CreateToken"}, {22, nullptr, "CreateTokenWithApplicationId"}, {23, nullptr, "DestroyToken"}, {24, nullptr, "DestroyTokenWithApplicationId"}, {25, nullptr, "QueryIsTokenValid"}, {26, nullptr, "ListenToMyApplicationId"}, - {27, nullptr, "DestroyTokenAll"}, + {27, nullptr, "DestroyTokenAll"}, // 13.0.0+ + {28, nullptr, "CreateTokenWithName"}, // 18.0.0+ + {29, nullptr, "DestroyTokenWithName"}, // 18.0.0+ {31, nullptr, "UploadTokenToBaaS"}, {32, nullptr, "DestroyTokenForBaaS"}, {33, nullptr, "CreateTokenForBaaS"}, {34, nullptr, "SetBaaSDeviceAccountIdList"}, + {35, nullptr, "LinkNsaId"}, // 17.0.0+ + {36, nullptr, "UnlinkNsaId"}, // 17.0.0+ + {37, nullptr, "RelinkNsaId"}, // 18.0.0+ + {40, nullptr, "GetNetworkServiceAccountIdTokenRequestEvent"}, // 17.0.0+ + {41, nullptr, "TryPopNetworkServiceAccountIdTokenRequestUid"}, // 17.0.0+ + {42, nullptr, "SetNetworkServiceAccountIdTokenSuccess"}, // 17.0.0+ + {43, nullptr, "SetNetworkServiceAccountIdTokenFailure"}, // 17.0.0+ + {44, nullptr, "SetUidList"}, // 17.0.0+ + {45, nullptr, "PutDigitalTwinKeyValue"}, // 17.0.0+ + {51, nullptr, "DeleteDigitalTwinKeyValue"}, // 18.0.0+ {101, nullptr, "Suspend"}, {102, nullptr, "Resume"}, {103, nullptr, "GetState"}, {104, nullptr, "GetStatistics"}, {105, nullptr, "GetPlayReportRequestEvent"}, + {106, nullptr, "GetLastNotifiedTime"}, + {107, nullptr, "SetLastNotifiedTime"}, {111, nullptr, "GetJid"}, {112, nullptr, "CreateJid"}, {113, nullptr, "DestroyJid"}, @@ -55,10 +73,17 @@ public: {153, nullptr, "GetDropEventWithHandover"}, {154, nullptr, "CreateTokenAsync"}, {155, nullptr, "CreateTokenAsyncWithApplicationId"}, - {161, nullptr, "GetRequestChangeStateCancelEvent"}, - {162, nullptr, "RequestChangeStateForceTimedWithCancelEvent"}, - {201, nullptr, "RequestChangeStateForceTimed"}, - {202, nullptr, "RequestChangeStateForceAsync"}, + {156, nullptr, "CreateTokenWithNameAsync"}, // 18.0.0+ + {161, nullptr, "GetRequestChangeStateCancelEvent"}, // 10.0.0+ + {162, nullptr, "RequestChangeStateForceTimedWithCancelEvent"}, // 10.0.0+ + {201, nullptr, "RequestChangeStateForceTimed"}, // 3.0.0+ + {202, nullptr, "RequestChangeStateForceAsync"}, // 3.0.0+ + {301, nullptr, "GetPassword"}, // 18.0.0+ + {302, nullptr, "GetAllImmigration"}, // 18.0.0+ + {303, nullptr, "GetNotificationHistories"}, // 18.0.0+ + {304, nullptr, "GetPersistentConnectionSummary"}, // 18.0.0+ + {305, nullptr, "GetDigitalTwinSummary"}, // 18.0.0+ + {306, nullptr, "GetDigitalTwinValue"}, // 18.0.0+ }; // clang-format on @@ -98,7 +123,8 @@ public: {3, nullptr, "Receive"}, {4, nullptr, "ReceiveRaw"}, {5, nullptr, "GetReceiveEvent"}, - {7, nullptr, "GetStateChangeEVent"}, + {7, nullptr, "GetStateChangeEvent"}, + {8, nullptr, "ListenToByName"}, // 18.0.0+ {21, nullptr, "CreateToken"}, {23, nullptr, "DestroyToken"}, {25, nullptr, "QueryIsTokenValid"}, diff --git a/src/core/hle/service/pctl/parental_control_service.cpp b/src/core/hle/service/pctl/parental_control_service.cpp index f57f2f1577..664d9c1fd8 100644 --- a/src/core/hle/service/pctl/parental_control_service.cpp +++ b/src/core/hle/service/pctl/parental_control_service.cpp @@ -86,6 +86,7 @@ IParentalControlService::IParentalControlService(Core::System& system_, Capabili {1472, nullptr, "CancelNetworkRequest"}, {1473, D<&IParentalControlService::GetUnlinkedEvent>, "GetUnlinkedEvent"}, {1474, nullptr, "ClearUnlinkedEvent"}, + {1475, nullptr, "GetExtendedPlayTimerEvent"}, // 18.0.0+ {1601, nullptr, "DisableAllFeatures"}, {1602, nullptr, "PostEnableAllFeatures"}, {1603, nullptr, "IsAllFeaturesDisabled"}, @@ -101,6 +102,10 @@ IParentalControlService::IParentalControlService(Core::System& system_, Capabili {1951, nullptr, "SetPlayTimerSettingsForDebug"}, {1952, nullptr, "GetPlayTimerSpentTimeForTest"}, {1953, nullptr, "SetPlayTimerAlarmDisabledForDebug"}, + {1954, nullptr, "IsBedtimeAlarmEnabled"}, // 18.0.0+ + {1955, nullptr, "GetBedtimeAlarmTime"}, // 18.0.0+ + {1956, nullptr, "GetBedtimeAlarmTimeHour"}, // 18.0.0+ + {1967, nullptr, "GetBedtimeAlarmMinute"}, // 18.0.0+ {2001, nullptr, "RequestPairingAsync"}, {2002, nullptr, "FinishRequestPairing"}, {2003, nullptr, "AuthorizePairingAsync"}, @@ -117,6 +122,8 @@ IParentalControlService::IParentalControlService(Core::System& system_, Capabili {2014, nullptr, "FinishSynchronizeParentalControlSettings"}, {2015, nullptr, "FinishSynchronizeParentalControlSettingsWithLastUpdated"}, {2016, nullptr, "RequestUpdateExemptionListAsync"}, + {145601, nullptr, "GetPlayTimerSettingsVer2"}, // 18.0.0+ + {195101, nullptr, "SetPlayTimerSettingsForDebugVer2"}, // 18.0.0+ }; // clang-format on RegisterHandlers(functions); diff --git a/src/core/hle/service/ssl/ssl.cpp b/src/core/hle/service/ssl/ssl.cpp index 008ee44923..37105d74b7 100644 --- a/src/core/hle/service/ssl/ssl.cpp +++ b/src/core/hle/service/ssl/ssl.cpp @@ -507,7 +507,11 @@ public: {6, nullptr, "FlushSessionCache"}, {7, nullptr, "SetDebugOption"}, {8, nullptr, "GetDebugOption"}, - {8, nullptr, "ClearTls12FallbackFlag"}, + {9, nullptr, "ClearTls12FallbackFlag"}, + {100, nullptr, "CreateContextForSystem"}, + {101, nullptr, "SetThreadCoreMask"}, + {102, nullptr, "GetThreadCoreMask"}, + {103, nullptr, "VerifySignature"}, // 18.0.0+ }; // clang-format on From 4a15db8f08edc9627741449e6e6863fc3268bc83 Mon Sep 17 00:00:00 2001 From: Exverge Date: Sun, 7 Apr 2024 15:54:44 -0400 Subject: [PATCH 086/165] Map methods in firmware 18.0.0 --- src/core/hle/service/acc/acc.cpp | 22 ++++++++-- src/core/hle/service/audio/audio_device.cpp | 11 ++++- .../hle/service/filesystem/fsp/fsp_srv.cpp | 3 +- src/core/hle/service/ldn/ldn.cpp | 2 + .../system_local_communication_service.cpp | 7 ++++ .../ldn/user_local_communication_service.cpp | 9 ++++- src/core/hle/service/npns/npns.cpp | 40 +++++++++++++++---- .../service/pctl/parental_control_service.cpp | 7 ++++ src/core/hle/service/ssl/ssl.cpp | 6 ++- 9 files changed, 92 insertions(+), 15 deletions(-) diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp index 888b34336b..d0771996b7 100644 --- a/src/core/hle/service/acc/acc.cpp +++ b/src/core/hle/service/acc/acc.cpp @@ -102,6 +102,7 @@ public: {150, nullptr, "CreateAuthorizationRequest"}, {160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"}, {161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"}, + {180, nullptr, "GetRequestForNintendoAccountReauthentication"}, // 18.0.0+ }; // clang-format on @@ -135,6 +136,7 @@ public: {13, nullptr, "GetLinkedNintendoAccountId"}, {14, nullptr, "GetNickname"}, {15, nullptr, "GetProfileImage"}, + {16, nullptr, "GetProfileLargeImage"}, // 18.0.0+ {21, nullptr, "LoadIdTokenCache"}, {100, nullptr, "RegisterUser"}, // [1.0.0-3.0.2] RegisterAsync {101, nullptr, "RegisterUserWithUid"}, // [1.0.0-3.0.2] RegisterWithUidAsync @@ -176,10 +178,11 @@ public: {140, nullptr, "GetNetworkServiceLicenseCache"}, // 5.0.0+ {141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+ {142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+ - {143, nullptr, "GetNetworkServiceLicenseCacheEx"}, + {143, nullptr, "GetNetworkServiceLicenseCacheEx"}, // 15.0.0+ {150, nullptr, "CreateAuthorizationRequest"}, - {160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"}, - {161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"}, + {160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"}, // 16.0.0+ + {161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"}, // 16.0.0+ + {180, nullptr, "GetRequestForNintendoAccountReauthentication"}, // 18.0.0+ {200, nullptr, "IsRegistered"}, {201, nullptr, "RegisterAsync"}, {202, nullptr, "UnregisterAsync"}, @@ -263,6 +266,7 @@ public: {101, nullptr, "GetLinkedNintendoAccountId"}, {102, nullptr, "GetNickname"}, {103, nullptr, "GetProfileImage"}, + {104, nullptr, "GetProfileLargeImage"}, // 18.0.0+ }; // clang-format on @@ -317,6 +321,9 @@ public: {1, &IProfileCommon::GetBase, "GetBase"}, {10, &IProfileCommon::GetImageSize, "GetImageSize"}, {11, &IProfileCommon::LoadImage, "LoadImage"}, + {20, &IProfileCommon::GetImageSize, "GetLargeImageSize"}, // 18.0.0+ + {21, &IProfileCommon::LoadImage, "LoadLargeImage"}, // 18.0.0+ + {30, nullptr, "GetImageId"}, // 18.0.0+ }; RegisterHandlers(functions); @@ -325,6 +332,7 @@ public: static const FunctionInfo editor_functions[] = { {100, &IProfileCommon::Store, "Store"}, {101, &IProfileCommon::StoreWithImage, "StoreWithImage"}, + {110, &IProfileCommon::StoreWithImage, "StoreWithLargeImage"}, // 18.0.0+ }; RegisterHandlers(editor_functions); @@ -530,6 +538,7 @@ public: {13, nullptr, "GetLinkedNintendoAccountId"}, {14, nullptr, "GetNickname"}, {15, nullptr, "GetProfileImage"}, + {16, nullptr, "GetProfileLargeImage"}, // 18.0.0+ {21, nullptr, "LoadIdTokenCache"}, // 3.0.0+ }; // clang-format on @@ -684,8 +693,15 @@ public: {101, nullptr, "GetLinkedNintendoAccountId"}, {102, nullptr, "GetNickname"}, {103, nullptr, "GetProfileImage"}, + {104, nullptr, "GetProfileLargeImage"}, // 18.0.0+ {110, nullptr, "RegisterUserAsync"}, {111, nullptr, "GetUid"}, + {200, nullptr, "ApplyResponseForUserCreationAsync"}, // 17.0.0+ + {205, nullptr, "SuspendAfterApplyResponse"}, // 17.0.0+ + {210, nullptr, "IsProfileAvailable"}, // 17.0.0+ + {220, nullptr, "RegisterUserAsyncWithoutProfile"}, // 17.0.0+ + {221, nullptr, "RegisterUserWithProfileAsync"}, // 17.0.0+ + {230, nullptr, "RegisterUserWithLargeImageProfileAsync"}, // 18.0.0+ }; // clang-format on diff --git a/src/core/hle/service/audio/audio_device.cpp b/src/core/hle/service/audio/audio_device.cpp index 438f3cccdf..d3b104f710 100644 --- a/src/core/hle/service/audio/audio_device.cpp +++ b/src/core/hle/service/audio/audio_device.cpp @@ -27,8 +27,15 @@ IAudioDevice::IAudioDevice(Core::System& system_, u64 applet_resource_user_id, u {10, D<&IAudioDevice::GetActiveAudioDeviceNameAuto>, "GetActiveAudioDeviceNameAuto"}, {11, D<&IAudioDevice::QueryAudioDeviceInputEvent>, "QueryAudioDeviceInputEvent"}, {12, D<&IAudioDevice::QueryAudioDeviceOutputEvent>, "QueryAudioDeviceOutputEvent"}, - {13, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioOutputDeviceName"}, - {14, D<&IAudioDevice::ListAudioOutputDeviceName>, "ListAudioOutputDeviceName"}, + {13, D<&IAudioDevice::GetActiveAudioDeviceName>, + "GetActiveAudioOutputDeviceName"}, // 13.0.0+ + {14, D<&IAudioDevice::ListAudioOutputDeviceName>, "ListAudioOutputDeviceName"}, // 13.0.0+ + {15, nullptr, "AcquireAudioInputDeviceNotification"}, // 17.0.0+ + {16, nullptr, "ReleaseAudioInputDeviceNotification"}, // 17.0.0+ + {17, nullptr, "AcquireAudioOutputDeviceNotification"}, // 17.0.0+ + {18, nullptr, "ReleaseAudioOutputDeviceNotification"}, // 17.0.0+ + {19, nullptr, "SetAudioDeviceOutputVolumeAutoTuneEnabled"}, // 18.0.0+ + {20, nullptr, "IsAudioDeviceOutputVolumeAutoTuneEnabled"} // 18.0.0+ }; RegisterHandlers(functions); diff --git a/src/core/hle/service/filesystem/fsp/fsp_srv.cpp b/src/core/hle/service/filesystem/fsp/fsp_srv.cpp index 2bc6361bb7..ed503d5d6a 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_srv.cpp +++ b/src/core/hle/service/filesystem/fsp/fsp_srv.cpp @@ -53,7 +53,7 @@ FSP_SRV::FSP_SRV(Core::System& system_) {1, D<&FSP_SRV::SetCurrentProcess>, "SetCurrentProcess"}, {2, nullptr, "OpenDataFileSystemByCurrentProcess"}, {7, D<&FSP_SRV::OpenFileSystemWithPatch>, "OpenFileSystemWithPatch"}, - {8, nullptr, "OpenFileSystemWithId"}, + {8, nullptr, "OpenFileSystemWithIdObsolete"}, // 16.0.0+, OpenFileSystemWithId 2.0.0-15.0.1 {9, nullptr, "OpenDataFileSystemByApplicationId"}, {11, nullptr, "OpenBisFileSystem"}, {12, nullptr, "OpenBisStorage"}, @@ -169,6 +169,7 @@ FSP_SRV::FSP_SRV(Core::System& system_) {1018, nullptr, "SetDebugOption"}, {1019, nullptr, "UnsetDebugOption"}, {1100, nullptr, "OverrideSaveDataTransferTokenSignVerificationKey"}, + {1101, nullptr, "OverrideSaveDataTransferKeyForTest"}, // 18.0.0+ {1110, nullptr, "CorruptSaveDataFileSystemBySaveDataSpaceId2"}, {1200, D<&FSP_SRV::OpenMultiCommitManager>, "OpenMultiCommitManager"}, {1300, nullptr, "OpenBisWiper"}, diff --git a/src/core/hle/service/ldn/ldn.cpp b/src/core/hle/service/ldn/ldn.cpp index f2d638c30e..1b0148fda0 100644 --- a/src/core/hle/service/ldn/ldn.cpp +++ b/src/core/hle/service/ldn/ldn.cpp @@ -40,6 +40,7 @@ public: // clang-format off static const FunctionInfo functions[] = { {0, C<&ISystemServiceCreator::CreateSystemLocalCommunicationService>, "CreateSystemLocalCommunicationService"}, + {1, nullptr, "CreateClientProcessMonitor"} // 18.0.0+ }; // clang-format on @@ -62,6 +63,7 @@ public: // clang-format off static const FunctionInfo functions[] = { {0, C<&IUserServiceCreator::CreateUserLocalCommunicationService>, "CreateUserLocalCommunicationService"}, + {1, nullptr, "CreateClientProcessMonitor"}, // 18.0.0+ }; // clang-format on diff --git a/src/core/hle/service/ldn/system_local_communication_service.cpp b/src/core/hle/service/ldn/system_local_communication_service.cpp index 7b52223cdc..fc283da4cf 100644 --- a/src/core/hle/service/ldn/system_local_communication_service.cpp +++ b/src/core/hle/service/ldn/system_local_communication_service.cpp @@ -40,6 +40,13 @@ ISystemLocalCommunicationService::ISystemLocalCommunicationService(Core::System& {401, nullptr, "FinalizeSystem"}, {402, nullptr, "SetOperationMode"}, {403, C<&ISystemLocalCommunicationService::InitializeSystem2>, "InitializeSystem2"}, + {500, nullptr, "EnableActionFrame"}, // 18.0.0+ + {501, nullptr, "DisableActionFrame"}, // 18.0.0+ + {502, nullptr, "SendActionFrame"}, // 18.0.0+ + {503, nullptr, "RecvActionFrame"}, // 18.0.0+ + {505, nullptr, "SetHomeChannel"}, // 18.0.0+ + {600, nullptr, "SetTxPower"}, // 18.0.0+ + {601, nullptr, "ResetTxPower"} // 18.0.0+ }; // clang-format on diff --git a/src/core/hle/service/ldn/user_local_communication_service.cpp b/src/core/hle/service/ldn/user_local_communication_service.cpp index f28368962f..8e559f4400 100644 --- a/src/core/hle/service/ldn/user_local_communication_service.cpp +++ b/src/core/hle/service/ldn/user_local_communication_service.cpp @@ -53,7 +53,14 @@ IUserLocalCommunicationService::IUserLocalCommunicationService(Core::System& sys {304, C<&IUserLocalCommunicationService::Disconnect>, "Disconnect"}, {400, C<&IUserLocalCommunicationService::Initialize>, "Initialize"}, {401, C<&IUserLocalCommunicationService::Finalize>, "Finalize"}, - {402, C<&IUserLocalCommunicationService::Initialize2>, "Initialize2"}, + {402, C<&IUserLocalCommunicationService::Initialize2>, "Initialize2"}, // 7.0.0+ + {500, nullptr, "EnableActionFrame"}, // 18.0.0+ + {501, nullptr, "DisableActionFrame"}, // 18.0.0+ + {502, nullptr, "SendActionFrame"}, // 18.0.0+ + {503, nullptr, "RecvActionFrame"}, // 18.0.0+ + {505, nullptr, "SetHomeChannel"}, // 18.0.0+ + {600, nullptr, "SetTxPower"}, // 18.0.0+ + {601, nullptr, "ResetTxPower"} // 18.0.0+ }; // clang-format on diff --git a/src/core/hle/service/npns/npns.cpp b/src/core/hle/service/npns/npns.cpp index e54827efef..0c6ba14b4e 100644 --- a/src/core/hle/service/npns/npns.cpp +++ b/src/core/hle/service/npns/npns.cpp @@ -24,26 +24,44 @@ public: {4, nullptr, "ReceiveRaw"}, {5, C<&INpnsSystem::GetReceiveEvent>, "GetReceiveEvent"}, {6, nullptr, "ListenUndelivered"}, - {7, nullptr, "GetStateChangeEVent"}, + {7, nullptr, "GetStateChangeEvent"}, + {8, nullptr, "ListenToByName"}, // 18.0.0+ {11, nullptr, "SubscribeTopic"}, {12, nullptr, "UnsubscribeTopic"}, {13, nullptr, "QueryIsTopicExist"}, + {14, nullptr, "SubscribeTopicByAccount"}, // 18.0.0+ + {15, nullptr, "UnsubscribeTopicByAccount"}, // 18.0.0+ + {16, nullptr, "DownloadSubscriptionList"}, // 18.0.0+ {21, nullptr, "CreateToken"}, {22, nullptr, "CreateTokenWithApplicationId"}, {23, nullptr, "DestroyToken"}, {24, nullptr, "DestroyTokenWithApplicationId"}, {25, nullptr, "QueryIsTokenValid"}, {26, nullptr, "ListenToMyApplicationId"}, - {27, nullptr, "DestroyTokenAll"}, + {27, nullptr, "DestroyTokenAll"}, // 13.0.0+ + {28, nullptr, "CreateTokenWithName"}, // 18.0.0+ + {29, nullptr, "DestroyTokenWithName"}, // 18.0.0+ {31, nullptr, "UploadTokenToBaaS"}, {32, nullptr, "DestroyTokenForBaaS"}, {33, nullptr, "CreateTokenForBaaS"}, {34, nullptr, "SetBaaSDeviceAccountIdList"}, + {35, nullptr, "LinkNsaId"}, // 17.0.0+ + {36, nullptr, "UnlinkNsaId"}, // 17.0.0+ + {37, nullptr, "RelinkNsaId"}, // 18.0.0+ + {40, nullptr, "GetNetworkServiceAccountIdTokenRequestEvent"}, // 17.0.0+ + {41, nullptr, "TryPopNetworkServiceAccountIdTokenRequestUid"}, // 17.0.0+ + {42, nullptr, "SetNetworkServiceAccountIdTokenSuccess"}, // 17.0.0+ + {43, nullptr, "SetNetworkServiceAccountIdTokenFailure"}, // 17.0.0+ + {44, nullptr, "SetUidList"}, // 17.0.0+ + {45, nullptr, "PutDigitalTwinKeyValue"}, // 17.0.0+ + {51, nullptr, "DeleteDigitalTwinKeyValue"}, // 18.0.0+ {101, nullptr, "Suspend"}, {102, nullptr, "Resume"}, {103, nullptr, "GetState"}, {104, nullptr, "GetStatistics"}, {105, nullptr, "GetPlayReportRequestEvent"}, + {106, nullptr, "GetLastNotifiedTime"}, + {107, nullptr, "SetLastNotifiedTime"}, {111, nullptr, "GetJid"}, {112, nullptr, "CreateJid"}, {113, nullptr, "DestroyJid"}, @@ -55,10 +73,17 @@ public: {153, nullptr, "GetDropEventWithHandover"}, {154, nullptr, "CreateTokenAsync"}, {155, nullptr, "CreateTokenAsyncWithApplicationId"}, - {161, nullptr, "GetRequestChangeStateCancelEvent"}, - {162, nullptr, "RequestChangeStateForceTimedWithCancelEvent"}, - {201, nullptr, "RequestChangeStateForceTimed"}, - {202, nullptr, "RequestChangeStateForceAsync"}, + {156, nullptr, "CreateTokenWithNameAsync"}, // 18.0.0+ + {161, nullptr, "GetRequestChangeStateCancelEvent"}, // 10.0.0+ + {162, nullptr, "RequestChangeStateForceTimedWithCancelEvent"}, // 10.0.0+ + {201, nullptr, "RequestChangeStateForceTimed"}, // 3.0.0+ + {202, nullptr, "RequestChangeStateForceAsync"}, // 3.0.0+ + {301, nullptr, "GetPassword"}, // 18.0.0+ + {302, nullptr, "GetAllImmigration"}, // 18.0.0+ + {303, nullptr, "GetNotificationHistories"}, // 18.0.0+ + {304, nullptr, "GetPersistentConnectionSummary"}, // 18.0.0+ + {305, nullptr, "GetDigitalTwinSummary"}, // 18.0.0+ + {306, nullptr, "GetDigitalTwinValue"}, // 18.0.0+ }; // clang-format on @@ -98,7 +123,8 @@ public: {3, nullptr, "Receive"}, {4, nullptr, "ReceiveRaw"}, {5, nullptr, "GetReceiveEvent"}, - {7, nullptr, "GetStateChangeEVent"}, + {7, nullptr, "GetStateChangeEvent"}, + {8, nullptr, "ListenToByName"}, // 18.0.0+ {21, nullptr, "CreateToken"}, {23, nullptr, "DestroyToken"}, {25, nullptr, "QueryIsTokenValid"}, diff --git a/src/core/hle/service/pctl/parental_control_service.cpp b/src/core/hle/service/pctl/parental_control_service.cpp index f57f2f1577..664d9c1fd8 100644 --- a/src/core/hle/service/pctl/parental_control_service.cpp +++ b/src/core/hle/service/pctl/parental_control_service.cpp @@ -86,6 +86,7 @@ IParentalControlService::IParentalControlService(Core::System& system_, Capabili {1472, nullptr, "CancelNetworkRequest"}, {1473, D<&IParentalControlService::GetUnlinkedEvent>, "GetUnlinkedEvent"}, {1474, nullptr, "ClearUnlinkedEvent"}, + {1475, nullptr, "GetExtendedPlayTimerEvent"}, // 18.0.0+ {1601, nullptr, "DisableAllFeatures"}, {1602, nullptr, "PostEnableAllFeatures"}, {1603, nullptr, "IsAllFeaturesDisabled"}, @@ -101,6 +102,10 @@ IParentalControlService::IParentalControlService(Core::System& system_, Capabili {1951, nullptr, "SetPlayTimerSettingsForDebug"}, {1952, nullptr, "GetPlayTimerSpentTimeForTest"}, {1953, nullptr, "SetPlayTimerAlarmDisabledForDebug"}, + {1954, nullptr, "IsBedtimeAlarmEnabled"}, // 18.0.0+ + {1955, nullptr, "GetBedtimeAlarmTime"}, // 18.0.0+ + {1956, nullptr, "GetBedtimeAlarmTimeHour"}, // 18.0.0+ + {1967, nullptr, "GetBedtimeAlarmMinute"}, // 18.0.0+ {2001, nullptr, "RequestPairingAsync"}, {2002, nullptr, "FinishRequestPairing"}, {2003, nullptr, "AuthorizePairingAsync"}, @@ -117,6 +122,8 @@ IParentalControlService::IParentalControlService(Core::System& system_, Capabili {2014, nullptr, "FinishSynchronizeParentalControlSettings"}, {2015, nullptr, "FinishSynchronizeParentalControlSettingsWithLastUpdated"}, {2016, nullptr, "RequestUpdateExemptionListAsync"}, + {145601, nullptr, "GetPlayTimerSettingsVer2"}, // 18.0.0+ + {195101, nullptr, "SetPlayTimerSettingsForDebugVer2"}, // 18.0.0+ }; // clang-format on RegisterHandlers(functions); diff --git a/src/core/hle/service/ssl/ssl.cpp b/src/core/hle/service/ssl/ssl.cpp index 008ee44923..37105d74b7 100644 --- a/src/core/hle/service/ssl/ssl.cpp +++ b/src/core/hle/service/ssl/ssl.cpp @@ -507,7 +507,11 @@ public: {6, nullptr, "FlushSessionCache"}, {7, nullptr, "SetDebugOption"}, {8, nullptr, "GetDebugOption"}, - {8, nullptr, "ClearTls12FallbackFlag"}, + {9, nullptr, "ClearTls12FallbackFlag"}, + {100, nullptr, "CreateContextForSystem"}, + {101, nullptr, "SetThreadCoreMask"}, + {102, nullptr, "GetThreadCoreMask"}, + {103, nullptr, "VerifySignature"}, // 18.0.0+ }; // clang-format on From 2caadffe4d64de38a4835c2553a7a66d92eb7d4b Mon Sep 17 00:00:00 2001 From: Exverge Date: Sun, 31 Mar 2024 20:08:49 -0400 Subject: [PATCH 087/165] Refactor android to dev.suyu.suyu_emu --- .ci/scripts/linux/upload.sh | 2 +- CMakeLists.txt | 8 +- ...suyu.desktop => dev.suyu_emu.suyu.desktop} | 2 +- ...nfo.xml => dev.suyu_emu.suyu.metainfo.xml} | 4 +- ...uyu_emu.suyu.xml => dev.suyu_emu.suyu.xml} | 8 +- src/android/app/build.gradle.kts | 4 +- src/android/app/src/main/AndroidManifest.xml | 8 +- .../suyu/suyu_emu/NativeLibrary.kt | 18 ++--- .../suyu/suyu_emu/SuyuApplication.kt | 12 +-- .../suyu_emu/activities/EmulationActivity.kt | 36 ++++----- .../suyu_emu/adapters/AbstractDiffAdapter.kt | 4 +- .../suyu_emu/adapters/AbstractListAdapter.kt | 4 +- .../adapters/AbstractSingleSelectionList.kt | 6 +- .../suyu/suyu_emu/adapters/AddonAdapter.kt | 10 +-- .../suyu/suyu_emu/adapters/AppletAdapter.kt | 20 ++--- .../adapters/CabinetLauncherDialogAdapter.kt | 22 ++--- .../suyu/suyu_emu/adapters/DriverAdapter.kt | 18 ++--- .../suyu/suyu_emu/adapters/FolderAdapter.kt | 14 ++-- .../suyu/suyu_emu/adapters/GameAdapter.kt | 20 ++--- .../adapters/GamePropertiesAdapter.kt | 20 ++--- .../suyu_emu/adapters/HomeSettingAdapter.kt | 18 ++--- .../suyu_emu/adapters/InstallableAdapter.kt | 10 +-- .../suyu/suyu_emu/adapters/LicenseAdapter.kt | 12 +-- .../suyu/suyu_emu/adapters/SetupAdapter.kt | 18 ++--- .../applets/keyboard/SoftwareKeyboard.kt | 8 +- .../keyboard/ui/KeyboardDialogFragment.kt | 12 +-- .../DiskShaderCacheProgress.kt | 12 +-- .../suyu_emu/features/DocumentProvider.kt | 10 +-- .../suyu_emu/features/input/NativeInput.kt | 16 ++-- .../features/input/SuyuInputDevice.kt | 8 +- .../suyu_emu/features/input/SuyuVibrator.kt | 4 +- .../features/input/model/AnalogDirection.kt | 2 +- .../features/input/model/ButtonName.kt | 2 +- .../features/input/model/InputType.kt | 2 +- .../features/input/model/NativeAnalog.kt | 2 +- .../features/input/model/NativeButton.kt | 2 +- .../features/input/model/NativeTrigger.kt | 2 +- .../features/input/model/NpadStyleIndex.kt | 4 +- .../features/input/model/PlayerInput.kt | 2 +- .../settings/model/AbstractBooleanSetting.kt | 2 +- .../settings/model/AbstractByteSetting.kt | 2 +- .../settings/model/AbstractFloatSetting.kt | 2 +- .../settings/model/AbstractIntSetting.kt | 2 +- .../settings/model/AbstractLongSetting.kt | 2 +- .../settings/model/AbstractSetting.kt | 4 +- .../settings/model/AbstractShortSetting.kt | 2 +- .../settings/model/AbstractStringSetting.kt | 2 +- .../features/settings/model/BooleanSetting.kt | 4 +- .../features/settings/model/ByteSetting.kt | 4 +- .../features/settings/model/FloatSetting.kt | 4 +- .../features/settings/model/IntSetting.kt | 4 +- .../features/settings/model/LongSetting.kt | 4 +- .../features/settings/model/Settings.kt | 6 +- .../features/settings/model/ShortSetting.kt | 4 +- .../features/settings/model/StringSetting.kt | 4 +- .../settings/model/view/AnalogInputSetting.kt | 12 +-- .../settings/model/view/ButtonInputSetting.kt | 10 +-- .../settings/model/view/DateTimeSetting.kt | 4 +- .../settings/model/view/HeaderSetting.kt | 2 +- .../model/view/InputProfileSetting.kt | 8 +- .../settings/model/view/InputSetting.kt | 14 ++-- .../model/view/IntSingleChoiceSetting.kt | 4 +- .../model/view/ModifierInputSetting.kt | 10 +-- .../settings/model/view/RunnableSetting.kt | 2 +- .../settings/model/view/SettingsItem.kt | 30 +++---- .../model/view/SingleChoiceSetting.kt | 6 +- .../settings/model/view/SliderSetting.kt | 12 +-- .../settings/model/view/StringInputSetting.kt | 4 +- .../model/view/StringSingleChoiceSetting.kt | 4 +- .../settings/model/view/SubmenuSetting.kt | 4 +- .../settings/model/view/SwitchSetting.kt | 8 +- .../settings/ui/InputDialogFragment.kt | 24 +++--- .../settings/ui/InputProfileAdapter.kt | 12 +-- .../settings/ui/InputProfileDialogFragment.kt | 12 +-- .../ui/NewInputProfileDialogFragment.kt | 8 +- .../features/settings/ui/SettingsActivity.kt | 16 ++-- .../features/settings/ui/SettingsAdapter.kt | 26 +++--- .../settings/ui/SettingsDialogFragment.kt | 32 ++++---- .../features/settings/ui/SettingsFragment.kt | 16 ++-- .../settings/ui/SettingsFragmentPresenter.kt | 44 +++++----- .../settings/ui/SettingsSearchFragment.kt | 16 ++-- .../features/settings/ui/SettingsViewModel.kt | 14 ++-- .../ui/viewholder/DateTimeViewHolder.kt | 12 +-- .../ui/viewholder/HeaderViewHolder.kt | 8 +- .../ui/viewholder/InputProfileViewHolder.kt | 14 ++-- .../settings/ui/viewholder/InputViewHolder.kt | 20 ++--- .../ui/viewholder/RunnableViewHolder.kt | 12 +-- .../ui/viewholder/SettingViewHolder.kt | 10 +-- .../ui/viewholder/SingleChoiceViewHolder.kt | 16 ++-- .../ui/viewholder/SliderViewHolder.kt | 14 ++-- .../ui/viewholder/StringInputViewHolder.kt | 12 +-- .../ui/viewholder/SubmenuViewHolder.kt | 12 +-- .../ui/viewholder/SwitchSettingViewHolder.kt | 12 +-- .../features/settings/utils/SettingsFile.kt | 10 +-- .../suyu/suyu_emu/fragments/AboutFragment.kt | 12 +-- .../fragments/AddGameFolderDialogFragment.kt | 12 +-- .../suyu/suyu_emu/fragments/AddonsFragment.kt | 21 +++-- .../fragments/AppletLauncherFragment.kt | 16 ++-- .../CabinetLauncherDialogFragment.kt | 8 +- .../ContentTypeSelectionDialogFragment.kt | 10 +-- .../fragments/CoreErrorDialogFragment.kt | 6 +- .../fragments/DriverManagerFragment.kt | 27 +++---- .../fragments/DriversLoadingDialogFragment.kt | 10 +-- .../suyu_emu/fragments/EarlyAccessFragment.kt | 10 +-- .../suyu_emu/fragments/EmulationFragment.kt | 40 +++++----- .../GameFolderPropertiesDialogFragment.kt | 14 ++-- .../suyu_emu/fragments/GameFoldersFragment.kt | 19 +++-- .../suyu_emu/fragments/GameInfoFragment.kt | 18 ++--- .../fragments/GamePropertiesFragment.kt | 44 +++++----- .../fragments/HomeSettingsFragment.kt | 35 ++++---- .../suyu_emu/fragments/InstallableFragment.kt | 29 ++++--- .../fragments/LaunchGameDialogFragment.kt | 10 +-- .../LicenseBottomSheetDialogFragment.kt | 8 +- .../suyu_emu/fragments/LicensesFragment.kt | 14 ++-- .../fragments/MessageDialogFragment.kt | 8 +- .../PermissionDeniedDialogFragment.kt | 4 +- .../fragments/ProgressDialogFragment.kt | 12 +-- .../fragments/ResetSettingsDialogFragment.kt | 6 +- .../suyu/suyu_emu/fragments/SearchFragment.kt | 22 ++--- .../suyu/suyu_emu/fragments/SetupFragment.kt | 35 ++++---- .../fragments/SetupWarningDialogFragment.kt | 4 +- .../layout/AutofitGridLayoutManager.kt | 4 +- .../suyu/suyu_emu/model/AddonViewModel.kt | 6 +- .../suyu/suyu_emu/model/Applet.kt | 4 +- .../suyu/suyu_emu/model/Driver.kt | 4 +- .../suyu/suyu_emu/model/DriverViewModel.kt | 18 ++--- .../suyu/suyu_emu/model/EmulationViewModel.kt | 2 +- .../{org => dev}/suyu/suyu_emu/model/Game.kt | 14 ++-- .../suyu/suyu_emu/model/GameDir.kt | 2 +- .../suyu/suyu_emu/model/GameProperties.kt | 2 +- .../suyu_emu/model/GameVerificationResult.kt | 2 +- .../suyu/suyu_emu/model/GamesViewModel.kt | 10 +-- .../suyu/suyu_emu/model/HomeSetting.kt | 2 +- .../suyu/suyu_emu/model/HomeViewModel.kt | 2 +- .../suyu/suyu_emu/model/InstallResult.kt | 2 +- .../suyu/suyu_emu/model/Installable.kt | 2 +- .../suyu/suyu_emu/model/License.kt | 2 +- .../suyu_emu/model/MessageDialogViewModel.kt | 2 +- .../suyu_emu/model/MinimalDocumentFile.kt | 2 +- .../{org => dev}/suyu/suyu_emu/model/Patch.kt | 2 +- .../suyu/suyu_emu/model/PatchType.kt | 2 +- .../suyu/suyu_emu/model/SelectableItem.kt | 2 +- .../suyu/suyu_emu/model/SetupPage.kt | 2 +- .../suyu/suyu_emu/model/TaskViewModel.kt | 2 +- .../suyu/suyu_emu/overlay/InputOverlay.kt | 24 +++--- .../overlay/InputOverlayDrawableButton.kt | 8 +- .../overlay/InputOverlayDrawableDpad.kt | 6 +- .../overlay/InputOverlayDrawableJoystick.kt | 10 +-- .../suyu_emu/overlay/model/OverlayControl.kt | 6 +- .../overlay/model/OverlayControlData.kt | 2 +- .../overlay/model/OverlayControlDefault.kt | 2 +- .../suyu_emu/overlay/model/OverlayLayout.kt | 2 +- .../suyu/suyu_emu/ui/GamesFragment.kt | 20 ++--- .../suyu/suyu_emu/ui/main/MainActivity.kt | 36 ++++----- .../suyu/suyu_emu/ui/main/ThemeProvider.kt | 2 +- .../suyu/suyu_emu/utils/AddonUtil.kt | 2 +- .../suyu_emu/utils/DirectoryInitialization.kt | 20 ++--- .../suyu/suyu_emu/utils/DocumentsTree.kt | 4 +- .../suyu/suyu_emu/utils/FileUtil.kt | 8 +- .../suyu/suyu_emu/utils/GameHelper.kt | 12 +-- .../suyu/suyu_emu/utils/GameIconUtils.kt | 8 +- .../suyu/suyu_emu/utils/GameMetadata.kt | 2 +- .../suyu/suyu_emu/utils/GpuDriverHelper.kt | 8 +- .../suyu/suyu_emu/utils/GpuDriverMetadata.kt | 2 +- .../suyu/suyu_emu/utils/InputHandler.kt | 8 +- .../suyu/suyu_emu/utils/InsetsHelper.kt | 2 +- .../suyu/suyu_emu/utils/LifecycleUtils.kt | 2 +- .../{org => dev}/suyu/suyu_emu/utils/Log.kt | 2 +- .../suyu/suyu_emu/utils/MemoryUtil.kt | 6 +- .../suyu/suyu_emu/utils/NativeConfig.kt | 8 +- .../suyu/suyu_emu/utils/NfcReader.kt | 4 +- .../suyu/suyu_emu/utils/ParamPackage.kt | 2 +- .../suyu/suyu_emu/utils/PreferenceUtil.kt | 2 +- .../suyu/suyu_emu/utils/SerializableHelper.kt | 2 +- .../suyu/suyu_emu/utils/ThemeHelper.kt | 10 +-- .../suyu/suyu_emu/utils/ViewUtils.kt | 2 +- .../suyu_emu/viewholder/AbstractViewHolder.kt | 6 +- .../suyu_emu/views/FixedRatioSurfaceView.kt | 2 +- .../app/src/main/jni/game_metadata.cpp | 16 ++-- src/android/app/src/main/jni/native.cpp | 80 +++++++++---------- .../app/src/main/jni/native_config.cpp | 78 +++++++++--------- src/android/app/src/main/jni/native_input.cpp | 78 +++++++++--------- src/android/app/src/main/jni/native_log.cpp | 10 +-- .../main/res/layout/fragment_emulation.xml | 6 +- .../res/navigation/emulation_navigation.xml | 10 +-- .../main/res/navigation/home_navigation.xml | 48 +++++------ .../res/navigation/settings_navigation.xml | 8 +- .../app/src/main/res/values-ar/strings.xml | 10 +-- .../app/src/main/res/values-ckb/strings.xml | 16 ++-- .../app/src/main/res/values-cs/strings.xml | 8 +- .../app/src/main/res/values-de/strings.xml | 16 ++-- .../app/src/main/res/values-es/strings.xml | 20 ++--- .../app/src/main/res/values-fa/strings.xml | 16 ++-- .../app/src/main/res/values-fr/strings.xml | 20 ++--- .../app/src/main/res/values-he/strings.xml | 20 ++--- .../app/src/main/res/values-hu/strings.xml | 18 ++--- .../app/src/main/res/values-id/strings.xml | 18 ++--- .../app/src/main/res/values-it/strings.xml | 20 ++--- .../app/src/main/res/values-ja/strings.xml | 16 ++-- .../app/src/main/res/values-ko/strings.xml | 20 ++--- .../app/src/main/res/values-nb/strings.xml | 16 ++-- .../app/src/main/res/values-pl/strings.xml | 16 ++-- .../src/main/res/values-pt-rBR/strings.xml | 20 ++--- .../src/main/res/values-pt-rPT/strings.xml | 16 ++-- .../app/src/main/res/values-ru/strings.xml | 20 ++--- .../app/src/main/res/values-uk/strings.xml | 14 ++-- .../app/src/main/res/values-vi/strings.xml | 16 ++-- .../src/main/res/values-zh-rCN/strings.xml | 20 ++--- .../src/main/res/values-zh-rTW/strings.xml | 20 ++--- .../app/src/main/res/values/strings.xml | 20 ++--- .../android/applets/software_keyboard.cpp | 10 +-- src/common/android/id_cache.cpp | 18 ++--- src/suyu/about_dialog.cpp | 2 +- src/suyu/main.cpp | 2 +- 214 files changed, 1244 insertions(+), 1250 deletions(-) rename dist/{org.suyu_emu.suyu.desktop => dev.suyu_emu.suyu.desktop} (95%) rename dist/{org.suyu_emu.suyu.metainfo.xml => dev.suyu_emu.suyu.metainfo.xml} (96%) rename dist/{org.suyu_emu.suyu.xml => dev.suyu_emu.suyu.xml} (88%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/NativeLibrary.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/SuyuApplication.kt (86%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/activities/EmulationActivity.kt (95%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/AbstractDiffAdapter.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/AbstractListAdapter.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/AbstractSingleSelectionList.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/AddonAdapter.kt (84%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/AppletAdapter.kt (84%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt (79%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/DriverAdapter.kt (82%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/FolderAdapter.kt (80%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/GameAdapter.kt (89%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt (88%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/HomeSettingAdapter.kt (87%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/InstallableAdapter.kt (83%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/LicenseAdapter.kt (81%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/SetupAdapter.kt (86%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard.kt (95%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/applets/keyboard/ui/KeyboardDialogFragment.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt (84%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/DocumentProvider.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/NativeInput.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/SuyuInputDevice.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/SuyuVibrator.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/model/AnalogDirection.kt (86%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/model/ButtonName.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/model/InputType.kt (87%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/model/NativeAnalog.kt (89%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/model/NativeButton.kt (93%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/model/NativeTrigger.kt (85%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/model/NpadStyleIndex.kt (91%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/model/PlayerInput.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt (83%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt (82%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt (82%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt (82%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt (82%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/AbstractSetting.kt (88%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt (82%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt (82%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/BooleanSetting.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/ByteSetting.kt (88%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/FloatSetting.kt (89%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/IntSetting.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/LongSetting.kt (88%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/Settings.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/ShortSetting.kt (89%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/StringSetting.kt (89%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/AnalogInputSetting.kt (72%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/ButtonInputSetting.kt (75%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt (84%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt (85%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/InputProfileSetting.kt (85%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/InputSetting.kt (93%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt (90%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/ModifierInputSetting.kt (78%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt (91%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt (82%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt (78%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/StringInputSetting.kt (86%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt (90%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt (82%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt (79%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/InputDialogFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/InputProfileAdapter.kt (89%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/InputProfileDialogFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/NewInputProfileDialogFragment.kt (93%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt (93%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt (95%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt (82%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt (70%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt (72%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/InputViewHolder.kt (76%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt (79%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt (84%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt (85%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt (79%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt (79%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt (78%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt (81%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/utils/SettingsFile.kt (77%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/AboutFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt (88%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/AddonsFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/AppletLauncherFragment.kt (91%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt (86%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/CoreErrorDialogFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/DriverManagerFragment.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt (87%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/EarlyAccessFragment.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/EmulationFragment.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt (88%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/GameFoldersFragment.kt (89%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/GameInfoFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/GamePropertiesFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/HomeSettingsFragment.kt (95%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/InstallableFragment.kt (95%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt (90%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt (90%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/LicensesFragment.kt (93%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/MessageDialogFragment.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt (95%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/ProgressDialogFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt (88%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/SearchFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/SetupFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/AddonViewModel.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/Applet.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/Driver.kt (89%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/DriverViewModel.kt (93%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/EmulationViewModel.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/Game.kt (91%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/GameDir.kt (89%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/GameProperties.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/GameVerificationResult.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/GamesViewModel.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/HomeSetting.kt (93%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/HomeViewModel.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/InstallResult.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/Installable.kt (90%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/License.kt (91%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/MessageDialogViewModel.kt (91%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/MinimalDocumentFile.kt (91%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/Patch.kt (90%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/PatchType.kt (91%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/SelectableItem.kt (89%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/SetupPage.kt (95%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/TaskViewModel.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/overlay/InputOverlay.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt (95%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/overlay/model/OverlayControl.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/overlay/model/OverlayControlData.kt (93%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt (90%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/overlay/model/OverlayLayout.kt (84%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/ui/GamesFragment.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/ui/main/MainActivity.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/ui/main/ThemeProvider.kt (88%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/AddonUtil.kt (85%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/DirectoryInitialization.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/DocumentsTree.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/FileUtil.kt (99%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/GameHelper.kt (95%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/GameIconUtils.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/GameMetadata.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/GpuDriverHelper.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/GpuDriverMetadata.kt (99%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/InputHandler.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/InsetsHelper.kt (95%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/LifecycleUtils.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/Log.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/MemoryUtil.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/NativeConfig.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/NfcReader.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/ParamPackage.kt (99%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/PreferenceUtil.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/SerializableHelper.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/ThemeHelper.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/ViewUtils.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/viewholder/AbstractViewHolder.kt (80%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/views/FixedRatioSurfaceView.kt (98%) diff --git a/.ci/scripts/linux/upload.sh b/.ci/scripts/linux/upload.sh index 392106bcd2..0e383fd059 100755 --- a/.ci/scripts/linux/upload.sh +++ b/.ci/scripts/linux/upload.sh @@ -37,7 +37,7 @@ fi # Don't let AppImageLauncher ask to integrate EA if [ "${RELEASE_NAME}" = "mainline" ] || [ "${RELEASE_NAME}" = "early-access" ]; then - echo "X-AppImage-Integrate=false" >> AppDir/org.suyu_emu.suyu.desktop + echo "X-AppImage-Integrate=false" >> AppDir/dev.suyu_emu.suyu.desktop fi if [ "${RELEASE_NAME}" = "mainline" ]; then diff --git a/CMakeLists.txt b/CMakeLists.txt index 9406dd64a1..cbeb2ee689 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -732,14 +732,14 @@ endif() # https://specifications.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html # https://www.freedesktop.org/software/appstream/docs/ if(ENABLE_QT AND UNIX AND NOT APPLE) - install(FILES "dist/org.suyu_emu.suyu.desktop" + install(FILES "dist/dev.suyu_emu.suyu.desktop" DESTINATION "share/applications") install(FILES "dist/suyu.svg" DESTINATION "share/icons/hicolor/scalable/apps" - RENAME "org.suyu_emu.suyu.svg") - install(FILES "dist/org.suyu_emu.suyu.xml" + RENAME "dev.suyu_emu.suyu.svg") + install(FILES "dist/dev.suyu_emu.suyu.xml" DESTINATION "share/mime/packages") - install(FILES "dist/org.suyu_emu.suyu.metainfo.xml" + install(FILES "dist/dev.suyu_emu.suyu.metainfo.xml" DESTINATION "share/metainfo") endif() diff --git a/dist/org.suyu_emu.suyu.desktop b/dist/dev.suyu_emu.suyu.desktop similarity index 95% rename from dist/org.suyu_emu.suyu.desktop rename to dist/dev.suyu_emu.suyu.desktop index 26bc6dd6f1..215c9d884a 100644 --- a/dist/org.suyu_emu.suyu.desktop +++ b/dist/dev.suyu_emu.suyu.desktop @@ -8,7 +8,7 @@ Type=Application Name=suyu GenericName=Switch Emulator Comment=Nintendo Switch video game console emulator -Icon=org.suyu_emu.suyu +Icon=dev.suyu_emu.suyu TryExec=suyu Exec=suyu %f Categories=Game;Emulator;Qt; diff --git a/dist/org.suyu_emu.suyu.metainfo.xml b/dist/dev.suyu_emu.suyu.metainfo.xml similarity index 96% rename from dist/org.suyu_emu.suyu.metainfo.xml rename to dist/dev.suyu_emu.suyu.metainfo.xml index aeb2fecfbe..7677919f77 100644 --- a/dist/org.suyu_emu.suyu.metainfo.xml +++ b/dist/dev.suyu_emu.suyu.metainfo.xml @@ -7,7 +7,7 @@ SPDX-License-Identifier: CC0-1.0 --> - org.suyu_emu.suyu + dev.suyu_emu.suyu CC0-1.0 suyu Nintendo Switch emulator @@ -34,7 +34,7 @@ SPDX-License-Identifier: CC0-1.0 https://community.citra-emu.org/ https://gitlab.com/suyu-emu/suyu https://suyu-emu.org/wiki/contributing/ - org.suyu_emu.suyu.desktop + dev.suyu_emu.suyu.desktop suyu suyu-cmd diff --git a/dist/org.suyu_emu.suyu.xml b/dist/dev.suyu_emu.suyu.xml similarity index 88% rename from dist/org.suyu_emu.suyu.xml rename to dist/dev.suyu_emu.suyu.xml index 9fafef671b..7e1414ce17 100644 --- a/dist/org.suyu_emu.suyu.xml +++ b/dist/dev.suyu_emu.suyu.xml @@ -10,7 +10,7 @@ SPDX-License-Identifier: GPL-2.0-or-later Nintendo Switch homebrew executable NRO - + @@ -18,7 +18,7 @@ SPDX-License-Identifier: GPL-2.0-or-later Nintendo Switch homebrew executable NSO - + @@ -26,7 +26,7 @@ SPDX-License-Identifier: GPL-2.0-or-later Nintendo Switch Package NSP - + @@ -34,7 +34,7 @@ SPDX-License-Identifier: GPL-2.0-or-later Nintendo Switch Card Image XCI - + diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts index 78f8cc3488..9312d48c33 100644 --- a/src/android/app/build.gradle.kts +++ b/src/android/app/build.gradle.kts @@ -25,7 +25,7 @@ val autoVersion = (((System.currentTimeMillis() / 1000) - 1451606400) / 10).toIn @Suppress("UnstableApiUsage") android { - namespace = "org.suyu.suyu_emu" + namespace = "dev.suyu.suyu_emu" compileSdkVersion = "android-34" ndkVersion = "26.1.10909125" @@ -54,7 +54,7 @@ android { defaultConfig { // TODO If this is ever modified, change application_id in strings.xml - applicationId = "org.suyu.suyu_emu" + applicationId = "dev.suyu.suyu_emu" minSdk = 30 targetSdk = 34 versionName = getGitVersion() diff --git a/src/android/app/src/main/AndroidManifest.xml b/src/android/app/src/main/AndroidManifest.xml index 02d08c00be..5f893cd986 100644 --- a/src/android/app/src/main/AndroidManifest.xml +++ b/src/android/app/src/main/AndroidManifest.xml @@ -17,7 +17,7 @@ SPDX-License-Identifier: GPL-3.0-or-later @@ -48,12 +48,12 @@ SPDX-License-Identifier: GPL-3.0-or-later () { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AppletAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/AppletAdapter.kt similarity index 84% rename from src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AppletAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/AppletAdapter.kt index 73c43a6d2c..c6d373f7a5 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AppletAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/AppletAdapter.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.adapters +package dev.suyu.suyu_emu.adapters import android.view.LayoutInflater import android.view.ViewGroup @@ -9,15 +9,15 @@ import android.widget.Toast import androidx.core.content.res.ResourcesCompat import androidx.fragment.app.FragmentActivity import androidx.navigation.findNavController -import org.suyu.suyu_emu.HomeNavigationDirections -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.databinding.CardSimpleOutlinedBinding -import org.suyu.suyu_emu.model.Applet -import org.suyu.suyu_emu.model.AppletInfo -import org.suyu.suyu_emu.model.Game -import org.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.HomeNavigationDirections +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.databinding.CardSimpleOutlinedBinding +import dev.suyu.suyu_emu.model.Applet +import dev.suyu.suyu_emu.model.AppletInfo +import dev.suyu.suyu_emu.model.Game +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder class AppletAdapter(val activity: FragmentActivity, applets: List) : AbstractListAdapter(applets) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt similarity index 79% rename from src/android/app/src/main/java/org/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt index 188b3ae464..d7125d8603 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt @@ -1,23 +1,23 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.adapters +package dev.suyu.suyu_emu.adapters import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.content.res.ResourcesCompat import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController -import org.suyu.suyu_emu.HomeNavigationDirections -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.databinding.DialogListItemBinding -import org.suyu.suyu_emu.model.CabinetMode -import org.suyu.suyu_emu.adapters.CabinetLauncherDialogAdapter.CabinetModeViewHolder -import org.suyu.suyu_emu.model.AppletInfo -import org.suyu.suyu_emu.model.Game -import org.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.HomeNavigationDirections +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.databinding.DialogListItemBinding +import dev.suyu.suyu_emu.model.CabinetMode +import dev.suyu.suyu_emu.adapters.CabinetLauncherDialogAdapter.CabinetModeViewHolder +import dev.suyu.suyu_emu.model.AppletInfo +import dev.suyu.suyu_emu.model.Game +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder class CabinetLauncherDialogAdapter(val fragment: Fragment) : AbstractListAdapter( diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/DriverAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/DriverAdapter.kt similarity index 82% rename from src/android/app/src/main/java/org/suyu/suyu_emu/adapters/DriverAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/DriverAdapter.kt index 4c8e53abbd..58c8555750 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/DriverAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/DriverAdapter.kt @@ -1,18 +1,18 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.adapters +package dev.suyu.suyu_emu.adapters import android.view.LayoutInflater import android.view.ViewGroup -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.CardDriverOptionBinding -import org.suyu.suyu_emu.features.settings.model.StringSetting -import org.suyu.suyu_emu.model.Driver -import org.suyu.suyu_emu.model.DriverViewModel -import org.suyu.suyu_emu.utils.ViewUtils.marquee -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.CardDriverOptionBinding +import dev.suyu.suyu_emu.features.settings.model.StringSetting +import dev.suyu.suyu_emu.model.Driver +import dev.suyu.suyu_emu.model.DriverViewModel +import dev.suyu.suyu_emu.utils.ViewUtils.marquee +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder class DriverAdapter(private val driverViewModel: DriverViewModel) : AbstractSingleSelectionList( diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/FolderAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/FolderAdapter.kt similarity index 80% rename from src/android/app/src/main/java/org/suyu/suyu_emu/adapters/FolderAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/FolderAdapter.kt index dfe332586d..ce73151938 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/FolderAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/FolderAdapter.kt @@ -1,18 +1,18 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.adapters +package dev.suyu.suyu_emu.adapters import android.net.Uri import android.view.LayoutInflater import android.view.ViewGroup import androidx.fragment.app.FragmentActivity -import org.suyu.suyu_emu.databinding.CardFolderBinding -import org.suyu.suyu_emu.fragments.GameFolderPropertiesDialogFragment -import org.suyu.suyu_emu.model.GameDir -import org.suyu.suyu_emu.model.GamesViewModel -import org.suyu.suyu_emu.utils.ViewUtils.marquee -import org.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.databinding.CardFolderBinding +import dev.suyu.suyu_emu.fragments.GameFolderPropertiesDialogFragment +import dev.suyu.suyu_emu.model.GameDir +import dev.suyu.suyu_emu.model.GamesViewModel +import dev.suyu.suyu_emu.utils.ViewUtils.marquee +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder class FolderAdapter(val activity: FragmentActivity, val gamesViewModel: GamesViewModel) : AbstractDiffAdapter() { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GameAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/GameAdapter.kt similarity index 89% rename from src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GameAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/GameAdapter.kt index 6a87c8852c..7cca8b9aec 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GameAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/GameAdapter.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.adapters +package dev.suyu.suyu_emu.adapters import android.net.Uri import android.view.LayoutInflater @@ -19,15 +19,15 @@ import androidx.preference.PreferenceManager import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.suyu.suyu_emu.HomeNavigationDirections -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.databinding.CardGameBinding -import org.suyu.suyu_emu.model.Game -import org.suyu.suyu_emu.model.GamesViewModel -import org.suyu.suyu_emu.utils.GameIconUtils -import org.suyu.suyu_emu.utils.ViewUtils.marquee -import org.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.HomeNavigationDirections +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.databinding.CardGameBinding +import dev.suyu.suyu_emu.model.Game +import dev.suyu.suyu_emu.model.GamesViewModel +import dev.suyu.suyu_emu.utils.GameIconUtils +import dev.suyu.suyu_emu.utils.ViewUtils.marquee +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder class GameAdapter(private val activity: AppCompatActivity) : AbstractDiffAdapter(exact = false) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt similarity index 88% rename from src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt index 1d3916b43f..6cc783d2c2 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt @@ -1,21 +1,21 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.adapters +package dev.suyu.suyu_emu.adapters import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.content.res.ResourcesCompat import androidx.lifecycle.LifecycleOwner -import org.suyu.suyu_emu.databinding.CardInstallableIconBinding -import org.suyu.suyu_emu.databinding.CardSimpleOutlinedBinding -import org.suyu.suyu_emu.model.GameProperty -import org.suyu.suyu_emu.model.InstallableProperty -import org.suyu.suyu_emu.model.SubmenuProperty -import org.suyu.suyu_emu.utils.ViewUtils.marquee -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.utils.collect -import org.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.databinding.CardInstallableIconBinding +import dev.suyu.suyu_emu.databinding.CardSimpleOutlinedBinding +import dev.suyu.suyu_emu.model.GameProperty +import dev.suyu.suyu_emu.model.InstallableProperty +import dev.suyu.suyu_emu.model.SubmenuProperty +import dev.suyu.suyu_emu.utils.ViewUtils.marquee +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder class GamePropertiesAdapter( private val viewLifecycle: LifecycleOwner, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/HomeSettingAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/HomeSettingAdapter.kt similarity index 87% rename from src/android/app/src/main/java/org/suyu/suyu_emu/adapters/HomeSettingAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/HomeSettingAdapter.kt index 973e0b457d..8ecc0e6f90 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/HomeSettingAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/HomeSettingAdapter.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.adapters +package dev.suyu.suyu_emu.adapters import android.view.LayoutInflater import android.view.ViewGroup @@ -9,14 +9,14 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat import androidx.lifecycle.LifecycleOwner -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.CardHomeOptionBinding -import org.suyu.suyu_emu.fragments.MessageDialogFragment -import org.suyu.suyu_emu.model.HomeSetting -import org.suyu.suyu_emu.utils.ViewUtils.marquee -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.utils.collect -import org.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.CardHomeOptionBinding +import dev.suyu.suyu_emu.fragments.MessageDialogFragment +import dev.suyu.suyu_emu.model.HomeSetting +import dev.suyu.suyu_emu.utils.ViewUtils.marquee +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder class HomeSettingAdapter( private val activity: AppCompatActivity, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/InstallableAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/InstallableAdapter.kt similarity index 83% rename from src/android/app/src/main/java/org/suyu/suyu_emu/adapters/InstallableAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/InstallableAdapter.kt index fbd420aaae..e4bef9e2b6 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/InstallableAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/InstallableAdapter.kt @@ -1,14 +1,14 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.adapters +package dev.suyu.suyu_emu.adapters import android.view.LayoutInflater import android.view.ViewGroup -import org.suyu.suyu_emu.databinding.CardInstallableBinding -import org.suyu.suyu_emu.model.Installable -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.databinding.CardInstallableBinding +import dev.suyu.suyu_emu.model.Installable +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder class InstallableAdapter(installables: List) : AbstractListAdapter(installables) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/LicenseAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/LicenseAdapter.kt similarity index 81% rename from src/android/app/src/main/java/org/suyu/suyu_emu/adapters/LicenseAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/LicenseAdapter.kt index 5358cd6067..dec98c8032 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/LicenseAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/LicenseAdapter.kt @@ -1,16 +1,16 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.adapters +package dev.suyu.suyu_emu.adapters import android.view.LayoutInflater import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity -import org.suyu.suyu_emu.databinding.ListItemSettingBinding -import org.suyu.suyu_emu.fragments.LicenseBottomSheetDialogFragment -import org.suyu.suyu_emu.model.License -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.databinding.ListItemSettingBinding +import dev.suyu.suyu_emu.fragments.LicenseBottomSheetDialogFragment +import dev.suyu.suyu_emu.model.License +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder class LicenseAdapter(private val activity: AppCompatActivity, licenses: List) : AbstractListAdapter(licenses) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/SetupAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/SetupAdapter.kt similarity index 86% rename from src/android/app/src/main/java/org/suyu/suyu_emu/adapters/SetupAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/SetupAdapter.kt index 2dcd5cfc64..134de7cfc3 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/SetupAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/SetupAdapter.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.adapters +package dev.suyu.suyu_emu.adapters import android.text.Html import android.view.LayoutInflater @@ -10,14 +10,14 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.content.res.ResourcesCompat import androidx.lifecycle.ViewModelProvider import com.google.android.material.button.MaterialButton -import org.suyu.suyu_emu.databinding.PageSetupBinding -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.model.SetupCallback -import org.suyu.suyu_emu.model.SetupPage -import org.suyu.suyu_emu.model.StepState -import org.suyu.suyu_emu.utils.ViewUtils -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.databinding.PageSetupBinding +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.model.SetupCallback +import dev.suyu.suyu_emu.model.SetupPage +import dev.suyu.suyu_emu.model.StepState +import dev.suyu.suyu_emu.utils.ViewUtils +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder class SetupAdapter(val activity: AppCompatActivity, pages: List) : AbstractListAdapter(pages) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard.kt similarity index 95% rename from src/android/app/src/main/java/org/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard.kt index 8558858d9f..8831c0d439 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.applets.keyboard +package dev.suyu.suyu_emu.applets.keyboard import android.content.Context import android.os.Handler @@ -13,9 +13,9 @@ import android.view.inputmethod.InputMethodManager import androidx.annotation.Keep import androidx.core.view.ViewCompat import java.io.Serializable -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.applets.keyboard.ui.KeyboardDialogFragment +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.applets.keyboard.ui.KeyboardDialogFragment @Keep object SoftwareKeyboard { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/applets/keyboard/ui/KeyboardDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/applets/keyboard/ui/KeyboardDialogFragment.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/applets/keyboard/ui/KeyboardDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/applets/keyboard/ui/KeyboardDialogFragment.kt index b80d9e0d04..c6ea6a8f67 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/applets/keyboard/ui/KeyboardDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/applets/keyboard/ui/KeyboardDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.applets.keyboard.ui +package dev.suyu.suyu_emu.applets.keyboard.ui import android.app.Dialog import android.content.DialogInterface @@ -10,11 +10,11 @@ import android.text.InputFilter import android.text.InputType import androidx.fragment.app.DialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.applets.keyboard.SoftwareKeyboard -import org.suyu.suyu_emu.applets.keyboard.SoftwareKeyboard.KeyboardConfig -import org.suyu.suyu_emu.databinding.DialogEditTextBinding -import org.suyu.suyu_emu.utils.SerializableHelper.serializable +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.applets.keyboard.SoftwareKeyboard +import dev.suyu.suyu_emu.applets.keyboard.SoftwareKeyboard.KeyboardConfig +import dev.suyu.suyu_emu.databinding.DialogEditTextBinding +import dev.suyu.suyu_emu.utils.SerializableHelper.serializable class KeyboardDialogFragment : DialogFragment() { private lateinit var binding: DialogEditTextBinding diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt similarity index 84% rename from src/android/app/src/main/java/org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt index 80df698230..48dd975538 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt @@ -1,15 +1,15 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.disk_shader_cache +package dev.suyu.suyu_emu.disk_shader_cache import androidx.annotation.Keep import androidx.lifecycle.ViewModelProvider -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.activities.EmulationActivity -import org.suyu.suyu_emu.model.EmulationViewModel -import org.suyu.suyu_emu.utils.Log +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.activities.EmulationActivity +import dev.suyu.suyu_emu.model.EmulationViewModel +import dev.suyu.suyu_emu.utils.Log @Keep object DiskShaderCacheProgress { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/DocumentProvider.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/DocumentProvider.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/DocumentProvider.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/DocumentProvider.kt index 3e434cdd66..9d77f36d54 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/DocumentProvider.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/DocumentProvider.kt @@ -4,7 +4,7 @@ // SPDX-License-Identifier: MPL-2.0 // Copyright © 2023 Skyline Team and Contributors (https://github.com/skyline-emu/) -package org.suyu.suyu_emu.features +package dev.suyu.suyu_emu.features import android.database.Cursor import android.database.MatrixCursor @@ -14,10 +14,10 @@ import android.provider.DocumentsContract import android.provider.DocumentsProvider import android.webkit.MimeTypeMap import java.io.* -import org.suyu.suyu_emu.BuildConfig -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.getPublicFilesDir +import dev.suyu.suyu_emu.BuildConfig +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.getPublicFilesDir class DocumentProvider : DocumentsProvider() { private val baseDirectory: File diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/NativeInput.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/NativeInput.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/NativeInput.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/NativeInput.kt index 9639a614ac..f9485c3642 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/NativeInput.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/NativeInput.kt @@ -2,15 +2,15 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input +package dev.suyu.suyu_emu.features.input -import org.suyu.suyu_emu.features.input.model.NativeButton -import org.suyu.suyu_emu.features.input.model.NativeAnalog -import org.suyu.suyu_emu.features.input.model.InputType -import org.suyu.suyu_emu.features.input.model.ButtonName -import org.suyu.suyu_emu.features.input.model.NpadStyleIndex -import org.suyu.suyu_emu.utils.NativeConfig -import org.suyu.suyu_emu.utils.ParamPackage +import dev.suyu.suyu_emu.features.input.model.NativeButton +import dev.suyu.suyu_emu.features.input.model.NativeAnalog +import dev.suyu.suyu_emu.features.input.model.InputType +import dev.suyu.suyu_emu.features.input.model.ButtonName +import dev.suyu.suyu_emu.features.input.model.NpadStyleIndex +import dev.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.ParamPackage import android.view.InputDevice object NativeInput { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/SuyuInputDevice.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/SuyuInputDevice.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/SuyuInputDevice.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/SuyuInputDevice.kt index 4e7fc4adf0..f04ebb5253 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/SuyuInputDevice.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/SuyuInputDevice.kt @@ -2,13 +2,13 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input +package dev.suyu.suyu_emu.features.input import android.view.InputDevice import androidx.annotation.Keep -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.utils.InputHandler.getGUID +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.utils.InputHandler.getGUID @Keep interface SuyuInputDevice { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/SuyuVibrator.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/SuyuVibrator.kt similarity index 96% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/SuyuVibrator.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/SuyuVibrator.kt index 33cf4f5788..b1e3dad1a6 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/SuyuVibrator.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/SuyuVibrator.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input +package dev.suyu.suyu_emu.features.input import android.content.Context import android.os.Build @@ -13,7 +13,7 @@ import android.os.VibratorManager import android.view.InputDevice import androidx.annotation.Keep import androidx.annotation.RequiresApi -import org.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.SuyuApplication @Keep @Suppress("DEPRECATION") diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/AnalogDirection.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/AnalogDirection.kt similarity index 86% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/AnalogDirection.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/AnalogDirection.kt index ff4762c7d4..f2cf59a23c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/AnalogDirection.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/AnalogDirection.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input.model +package dev.suyu.suyu_emu.features.input.model enum class AnalogDirection(val int: Int, val param: String) { Up(0, "up"), diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/ButtonName.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/ButtonName.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/ButtonName.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/ButtonName.kt index c33e986cdb..ccbb555bd3 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/ButtonName.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/ButtonName.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input.model +package dev.suyu.suyu_emu.features.input.model // Loosely matches the enum in common/input.h enum class ButtonName(val int: Int) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/InputType.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/InputType.kt similarity index 87% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/InputType.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/InputType.kt index 6d441f180a..1b93341e0d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/InputType.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/InputType.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input.model +package dev.suyu.suyu_emu.features.input.model // Must match the corresponding enum in input_common/main.h enum class InputType(val int: Int) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeAnalog.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NativeAnalog.kt similarity index 89% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeAnalog.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NativeAnalog.kt index cbddbadcc8..7d8cced220 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeAnalog.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NativeAnalog.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input.model +package dev.suyu.suyu_emu.features.input.model // Must match enum in src/common/settings_input.h enum class NativeAnalog(val int: Int) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeButton.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NativeButton.kt similarity index 93% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeButton.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NativeButton.kt index c290cea7ca..29ad0b7b97 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeButton.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NativeButton.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input.model +package dev.suyu.suyu_emu.features.input.model // Must match enum in src/common/settings_input.h enum class NativeButton(val int: Int) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeTrigger.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NativeTrigger.kt similarity index 85% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeTrigger.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NativeTrigger.kt index ac6583b28f..8ce026c19b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeTrigger.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NativeTrigger.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input.model +package dev.suyu.suyu_emu.features.input.model // Must match enum in src/common/settings_input.h enum class NativeTrigger(val int: Int) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NpadStyleIndex.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NpadStyleIndex.kt similarity index 91% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NpadStyleIndex.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NpadStyleIndex.kt index 7bad46d728..a884de8de3 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NpadStyleIndex.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NpadStyleIndex.kt @@ -2,10 +2,10 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input.model +package dev.suyu.suyu_emu.features.input.model import androidx.annotation.StringRes -import org.suyu.suyu_emu.R +import dev.suyu.suyu_emu.R // Must match enum in src/core/hid/hid_types.h enum class NpadStyleIndex(val int: Int, @StringRes val nameId: Int = 0) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/PlayerInput.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/PlayerInput.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/PlayerInput.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/PlayerInput.kt index 35e600dbd0..d6c9178984 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/PlayerInput.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/PlayerInput.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input.model +package dev.suyu.suyu_emu.features.input.model import androidx.annotation.Keep diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt similarity index 83% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt index 8266e3dbd1..4066805d12 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model interface AbstractBooleanSetting : AbstractSetting { fun getBoolean(needsGlobal: Boolean = false): Boolean diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt similarity index 82% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt index 6ef8255341..d8cd03f295 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model interface AbstractByteSetting : AbstractSetting { fun getByte(needsGlobal: Boolean = false): Byte diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt similarity index 82% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt index 5437a65ade..bd95009db8 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model interface AbstractFloatSetting : AbstractSetting { fun getFloat(needsGlobal: Boolean = false): Float diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt similarity index 82% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt index 1d979d153d..c9269cde37 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model interface AbstractIntSetting : AbstractSetting { fun getInt(needsGlobal: Boolean = false): Int diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt similarity index 82% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt index 22e94c10b8..b74a150c12 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model interface AbstractLongSetting : AbstractSetting { fun getLong(needsGlobal: Boolean = false): Long diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractSetting.kt similarity index 88% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractSetting.kt index f4cf067e65..41bbf62d46 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractSetting.kt @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.NativeConfig interface AbstractSetting { val key: String diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt similarity index 82% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt index 4488802269..e8c3bcf9ab 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model interface AbstractShortSetting : AbstractSetting { fun getShort(needsGlobal: Boolean = false): Short diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt similarity index 82% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt index 3afb1bc3a1..5820192b74 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model interface AbstractStringSetting : AbstractSetting { fun getString(needsGlobal: Boolean = false): String diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/BooleanSetting.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/BooleanSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/BooleanSetting.kt index 2e36e82b9a..2958f02ca1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/BooleanSetting.kt @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.NativeConfig enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { AUDIO_MUTED("audio_muted"), diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ByteSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/ByteSetting.kt similarity index 88% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ByteSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/ByteSetting.kt index 9a3f966697..fe6f84a0f6 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ByteSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/ByteSetting.kt @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.NativeConfig enum class ByteSetting(override val key: String) : AbstractByteSetting { AUDIO_VOLUME("volume"); diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/FloatSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/FloatSetting.kt similarity index 89% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/FloatSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/FloatSetting.kt index 6d266cb5c8..a6d744d68b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/FloatSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/FloatSetting.kt @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.NativeConfig enum class FloatSetting(override val key: String) : AbstractFloatSetting { // No float settings currently exist diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/IntSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/IntSetting.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/IntSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/IntSetting.kt index bf62df3c28..4e9f0a00c4 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/IntSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/IntSetting.kt @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.NativeConfig enum class IntSetting(override val key: String) : AbstractIntSetting { CPU_BACKEND("cpu_backend"), diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/LongSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/LongSetting.kt similarity index 88% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/LongSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/LongSetting.kt index 01f2e580ae..e6bc2116eb 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/LongSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/LongSetting.kt @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.NativeConfig enum class LongSetting(override val key: String) : AbstractLongSetting { CUSTOM_RTC("custom_rtc"); diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/Settings.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/Settings.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/Settings.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/Settings.kt index 2352c3824f..b4cfca4c77 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/Settings.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/Settings.kt @@ -1,10 +1,10 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication object Settings { enum class MenuTag(val titleId: Int = 0) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ShortSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/ShortSetting.kt similarity index 89% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ShortSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/ShortSetting.kt index 45614501c3..2525e6d63a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ShortSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/ShortSetting.kt @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.NativeConfig enum class ShortSetting(override val key: String) : AbstractShortSetting { RENDERER_SPEED_LIMIT("speed_limit"); diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/StringSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/StringSetting.kt similarity index 89% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/StringSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/StringSetting.kt index 3f40fedcce..61a169ae8a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/StringSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/StringSetting.kt @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.NativeConfig enum class StringSetting(override val key: String) : AbstractStringSetting { DRIVER_PATH("driver_path"), diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/AnalogInputSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/AnalogInputSetting.kt similarity index 72% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/AnalogInputSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/AnalogInputSetting.kt index 78103ba858..bea116f229 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/AnalogInputSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/AnalogInputSetting.kt @@ -2,14 +2,14 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.input.model.AnalogDirection -import org.suyu.suyu_emu.features.input.model.InputType -import org.suyu.suyu_emu.features.input.model.NativeAnalog -import org.suyu.suyu_emu.utils.ParamPackage +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.model.AnalogDirection +import dev.suyu.suyu_emu.features.input.model.InputType +import dev.suyu.suyu_emu.features.input.model.NativeAnalog +import dev.suyu.suyu_emu.utils.ParamPackage class AnalogInputSetting( override val playerIndex: Int, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/ButtonInputSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/ButtonInputSetting.kt similarity index 75% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/ButtonInputSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/ButtonInputSetting.kt index e586cedbb0..6279ef7b92 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/ButtonInputSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/ButtonInputSetting.kt @@ -2,13 +2,13 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.utils.ParamPackage -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.input.model.InputType -import org.suyu.suyu_emu.features.input.model.NativeButton +import dev.suyu.suyu_emu.utils.ParamPackage +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.model.InputType +import dev.suyu.suyu_emu.features.input.model.NativeButton class ButtonInputSetting( override val playerIndex: Int, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt similarity index 84% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt index 7ed6a721af..72fe741c0e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt @@ -1,10 +1,10 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.features.settings.model.AbstractLongSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractLongSetting class DateTimeSetting( private val longSetting: AbstractLongSetting, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt similarity index 85% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt index da9b34e9be..df6bdfb129 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/InputProfileSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/InputProfileSetting.kt similarity index 85% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/InputProfileSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/InputProfileSetting.kt index 461588354a..708e0ae40f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/InputProfileSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/InputProfileSetting.kt @@ -2,11 +2,11 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.utils.NativeConfig class InputProfileSetting(private val playerIndex: Int) : SettingsItem(emptySetting, R.string.profile, "", 0, "") { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/InputSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/InputSetting.kt similarity index 93% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/InputSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/InputSetting.kt index ac54cda377..417e8f2655 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/InputSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/InputSetting.kt @@ -2,15 +2,15 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.input.model.ButtonName -import org.suyu.suyu_emu.features.input.model.InputType -import org.suyu.suyu_emu.utils.ParamPackage +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.model.ButtonName +import dev.suyu.suyu_emu.features.input.model.InputType +import dev.suyu.suyu_emu.utils.ParamPackage sealed class InputSetting( @StringRes titleId: Int, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt similarity index 90% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt index ba43799254..f61a60be15 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt @@ -1,10 +1,10 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.features.settings.model.AbstractIntSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractIntSetting class IntSingleChoiceSetting( private val intSetting: AbstractIntSetting, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/ModifierInputSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/ModifierInputSetting.kt similarity index 78% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/ModifierInputSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/ModifierInputSetting.kt index 4d1e2c6699..611160286e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/ModifierInputSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/ModifierInputSetting.kt @@ -2,13 +2,13 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.input.model.InputType -import org.suyu.suyu_emu.features.input.model.NativeAnalog -import org.suyu.suyu_emu.utils.ParamPackage +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.model.InputType +import dev.suyu.suyu_emu.features.input.model.NativeAnalog +import dev.suyu.suyu_emu.utils.ParamPackage class ModifierInputSetting( override val playerIndex: Int, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt similarity index 91% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt index b48e0ee4d1..8a7f88ebb5 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.DrawableRes import androidx.annotation.StringRes diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt index f59f4ebf53..ea59f5ff63 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt @@ -1,23 +1,23 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.input.model.NpadStyleIndex -import org.suyu.suyu_emu.features.settings.model.AbstractBooleanSetting -import org.suyu.suyu_emu.features.settings.model.AbstractSetting -import org.suyu.suyu_emu.features.settings.model.BooleanSetting -import org.suyu.suyu_emu.features.settings.model.ByteSetting -import org.suyu.suyu_emu.features.settings.model.IntSetting -import org.suyu.suyu_emu.features.settings.model.LongSetting -import org.suyu.suyu_emu.features.settings.model.ShortSetting -import org.suyu.suyu_emu.features.settings.model.StringSetting -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.model.NpadStyleIndex +import dev.suyu.suyu_emu.features.settings.model.AbstractBooleanSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractSetting +import dev.suyu.suyu_emu.features.settings.model.BooleanSetting +import dev.suyu.suyu_emu.features.settings.model.ByteSetting +import dev.suyu.suyu_emu.features.settings.model.IntSetting +import dev.suyu.suyu_emu.features.settings.model.LongSetting +import dev.suyu.suyu_emu.features.settings.model.ShortSetting +import dev.suyu.suyu_emu.features.settings.model.StringSetting +import dev.suyu.suyu_emu.utils.NativeConfig /** * ViewModel abstraction for an Item in the RecyclerView powering SettingsFragments. diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt similarity index 82% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt index 4d0edda0ff..70fc58941f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt @@ -1,12 +1,12 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.ArrayRes import androidx.annotation.StringRes -import org.suyu.suyu_emu.features.settings.model.AbstractIntSetting -import org.suyu.suyu_emu.features.settings.model.AbstractSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractIntSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractSetting class SingleChoiceSetting( setting: AbstractSetting, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt similarity index 78% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt index 45471a64e8..1ad5caeb7e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt @@ -1,14 +1,14 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.features.settings.model.AbstractByteSetting -import org.suyu.suyu_emu.features.settings.model.AbstractFloatSetting -import org.suyu.suyu_emu.features.settings.model.AbstractIntSetting -import org.suyu.suyu_emu.features.settings.model.AbstractSetting -import org.suyu.suyu_emu.features.settings.model.AbstractShortSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractByteSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractFloatSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractIntSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractShortSetting import kotlin.math.roundToInt class SliderSetting( diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringInputSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/StringInputSetting.kt similarity index 86% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringInputSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/StringInputSetting.kt index f2dbeb2912..82c36b622d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringInputSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/StringInputSetting.kt @@ -2,10 +2,10 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.features.settings.model.AbstractStringSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractStringSetting class StringInputSetting( setting: AbstractStringSetting, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt similarity index 90% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt index 2a35a1b425..f3556eb415 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt @@ -1,10 +1,10 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.features.settings.model.AbstractStringSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractStringSetting class StringSingleChoiceSetting( private val stringSetting: AbstractStringSetting, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt similarity index 82% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt index e381af10a3..c88a6014c1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt @@ -1,11 +1,11 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.DrawableRes import androidx.annotation.StringRes -import org.suyu.suyu_emu.features.settings.model.Settings +import dev.suyu.suyu_emu.features.settings.model.Settings class SubmenuSetting( @StringRes titleId: Int = 0, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt similarity index 79% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt index f7d4b73f91..afa83ccfc0 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt @@ -1,12 +1,12 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.features.settings.model.AbstractBooleanSetting -import org.suyu.suyu_emu.features.settings.model.AbstractIntSetting -import org.suyu.suyu_emu.features.settings.model.AbstractSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractBooleanSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractIntSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractSetting class SwitchSetting( setting: AbstractSetting, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/InputDialogFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/InputDialogFragment.kt index af7767af51..904fdeef15 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/InputDialogFragment.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import android.app.Dialog import android.graphics.drawable.Animatable2 @@ -18,17 +18,17 @@ import android.view.ViewGroup import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.DialogMappingBinding -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.input.model.NativeAnalog -import org.suyu.suyu_emu.features.input.model.NativeButton -import org.suyu.suyu_emu.features.settings.model.view.AnalogInputSetting -import org.suyu.suyu_emu.features.settings.model.view.ButtonInputSetting -import org.suyu.suyu_emu.features.settings.model.view.InputSetting -import org.suyu.suyu_emu.features.settings.model.view.ModifierInputSetting -import org.suyu.suyu_emu.utils.InputHandler -import org.suyu.suyu_emu.utils.ParamPackage +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.DialogMappingBinding +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.model.NativeAnalog +import dev.suyu.suyu_emu.features.input.model.NativeButton +import dev.suyu.suyu_emu.features.settings.model.view.AnalogInputSetting +import dev.suyu.suyu_emu.features.settings.model.view.ButtonInputSetting +import dev.suyu.suyu_emu.features.settings.model.view.InputSetting +import dev.suyu.suyu_emu.features.settings.model.view.ModifierInputSetting +import dev.suyu.suyu_emu.utils.InputHandler +import dev.suyu.suyu_emu.utils.ParamPackage class InputDialogFragment : DialogFragment() { private var inputAccepted = false diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputProfileAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/InputProfileAdapter.kt similarity index 89% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputProfileAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/InputProfileAdapter.kt index 693cb77cbb..2b4dd0f98e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputProfileAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/InputProfileAdapter.kt @@ -2,16 +2,16 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.adapters.AbstractListAdapter -import org.suyu.suyu_emu.databinding.ListItemInputProfileBinding -import org.suyu.suyu_emu.viewholder.AbstractViewHolder -import org.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.adapters.AbstractListAdapter +import dev.suyu.suyu_emu.databinding.ListItemInputProfileBinding +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.R class InputProfileAdapter(options: List) : AbstractListAdapter>(options) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputProfileDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/InputProfileDialogFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputProfileDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/InputProfileDialogFragment.kt index 55acee9eda..aa37d86817 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputProfileDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/InputProfileDialogFragment.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import android.app.Dialog import android.os.Bundle @@ -14,11 +14,11 @@ import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.DialogInputProfilesBinding -import org.suyu.suyu_emu.features.settings.model.view.InputProfileSetting -import org.suyu.suyu_emu.fragments.MessageDialogFragment -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.DialogInputProfilesBinding +import dev.suyu.suyu_emu.features.settings.model.view.InputProfileSetting +import dev.suyu.suyu_emu.fragments.MessageDialogFragment +import dev.suyu.suyu_emu.utils.collect class InputProfileDialogFragment : DialogFragment() { private var position = 0 diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/NewInputProfileDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/NewInputProfileDialogFragment.kt similarity index 93% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/NewInputProfileDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/NewInputProfileDialogFragment.kt index e683caf190..abf02cf804 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/NewInputProfileDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/NewInputProfileDialogFragment.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import android.app.Dialog import android.os.Bundle @@ -10,9 +10,9 @@ import android.widget.Toast import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.databinding.DialogEditTextBinding -import org.suyu.suyu_emu.features.settings.model.view.InputProfileSetting -import org.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.DialogEditTextBinding +import dev.suyu.suyu_emu.features.settings.model.view.InputProfileSetting +import dev.suyu.suyu_emu.R class NewInputProfileDialogFragment : DialogFragment() { private var position = 0 diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt similarity index 93% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt index aaa621a1da..aa33a4afd6 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import android.os.Bundle import android.view.View @@ -16,14 +16,14 @@ import androidx.core.view.WindowInsetsCompat import androidx.navigation.fragment.NavHostFragment import androidx.navigation.navArgs import com.google.android.material.color.MaterialColors -import org.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.NativeLibrary import java.io.IOException -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.ActivitySettingsBinding -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.settings.utils.SettingsFile -import org.suyu.suyu_emu.fragments.ResetSettingsDialogFragment -import org.suyu.suyu_emu.utils.* +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.ActivitySettingsBinding +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.settings.utils.SettingsFile +import dev.suyu.suyu_emu.fragments.ResetSettingsDialogFragment +import dev.suyu.suyu_emu.utils.* class SettingsActivity : AppCompatActivity() { private lateinit var binding: ActivitySettingsBinding diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt similarity index 95% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt index 6693e16096..e72eb6a67e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import android.content.Context import android.icu.util.Calendar @@ -20,18 +20,18 @@ import androidx.recyclerview.widget.ListAdapter import com.google.android.material.datepicker.MaterialDatePicker import com.google.android.material.timepicker.MaterialTimePicker import com.google.android.material.timepicker.TimeFormat -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SettingsNavigationDirections -import org.suyu.suyu_emu.databinding.ListItemSettingBinding -import org.suyu.suyu_emu.databinding.ListItemSettingInputBinding -import org.suyu.suyu_emu.databinding.ListItemSettingSwitchBinding -import org.suyu.suyu_emu.databinding.ListItemSettingsHeaderBinding -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.input.model.AnalogDirection -import org.suyu.suyu_emu.features.settings.model.AbstractIntSetting -import org.suyu.suyu_emu.features.settings.model.view.* -import org.suyu.suyu_emu.features.settings.ui.viewholder.* -import org.suyu.suyu_emu.utils.ParamPackage +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SettingsNavigationDirections +import dev.suyu.suyu_emu.databinding.ListItemSettingBinding +import dev.suyu.suyu_emu.databinding.ListItemSettingInputBinding +import dev.suyu.suyu_emu.databinding.ListItemSettingSwitchBinding +import dev.suyu.suyu_emu.databinding.ListItemSettingsHeaderBinding +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.model.AnalogDirection +import dev.suyu.suyu_emu.features.settings.model.AbstractIntSetting +import dev.suyu.suyu_emu.features.settings.model.view.* +import dev.suyu.suyu_emu.features.settings.ui.viewholder.* +import dev.suyu.suyu_emu.utils.ParamPackage class SettingsAdapter( private val fragment: Fragment, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt index 8d22dc1d55..11b46e9338 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import android.app.Dialog import android.content.DialogInterface @@ -13,21 +13,21 @@ import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.slider.Slider -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.DialogEditTextBinding -import org.suyu.suyu_emu.databinding.DialogSliderBinding -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.input.model.AnalogDirection -import org.suyu.suyu_emu.features.settings.model.view.AnalogInputSetting -import org.suyu.suyu_emu.features.settings.model.view.ButtonInputSetting -import org.suyu.suyu_emu.features.settings.model.view.IntSingleChoiceSetting -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.model.view.SingleChoiceSetting -import org.suyu.suyu_emu.features.settings.model.view.SliderSetting -import org.suyu.suyu_emu.features.settings.model.view.StringInputSetting -import org.suyu.suyu_emu.features.settings.model.view.StringSingleChoiceSetting -import org.suyu.suyu_emu.utils.ParamPackage -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.DialogEditTextBinding +import dev.suyu.suyu_emu.databinding.DialogSliderBinding +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.model.AnalogDirection +import dev.suyu.suyu_emu.features.settings.model.view.AnalogInputSetting +import dev.suyu.suyu_emu.features.settings.model.view.ButtonInputSetting +import dev.suyu.suyu_emu.features.settings.model.view.IntSingleChoiceSetting +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.model.view.SingleChoiceSetting +import dev.suyu.suyu_emu.features.settings.model.view.SliderSetting +import dev.suyu.suyu_emu.features.settings.model.view.StringInputSetting +import dev.suyu.suyu_emu.features.settings.model.view.StringSingleChoiceSetting +import dev.suyu.suyu_emu.utils.ParamPackage +import dev.suyu.suyu_emu.utils.collect class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener { private var type = 0 diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt index 8e7896780a..4e53f925ac 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import android.annotation.SuppressLint import android.os.Bundle @@ -17,13 +17,13 @@ import androidx.navigation.findNavController import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.transition.MaterialSharedAxis -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.FragmentSettingsBinding -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.settings.model.Settings -import org.suyu.suyu_emu.fragments.MessageDialogFragment -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.FragmentSettingsBinding +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.settings.model.Settings +import dev.suyu.suyu_emu.fragments.MessageDialogFragment +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.utils.collect class SettingsFragment : Fragment() { private lateinit var presenter: SettingsFragmentPresenter diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt similarity index 96% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt index 876725a35e..0b22a5c063 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -1,32 +1,32 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import android.annotation.SuppressLint import android.os.Build import android.widget.Toast -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.input.model.AnalogDirection -import org.suyu.suyu_emu.features.input.model.NativeAnalog -import org.suyu.suyu_emu.features.input.model.NativeButton -import org.suyu.suyu_emu.features.input.model.NpadStyleIndex -import org.suyu.suyu_emu.features.settings.model.AbstractBooleanSetting -import org.suyu.suyu_emu.features.settings.model.AbstractIntSetting -import org.suyu.suyu_emu.features.settings.model.BooleanSetting -import org.suyu.suyu_emu.features.settings.model.ByteSetting -import org.suyu.suyu_emu.features.settings.model.IntSetting -import org.suyu.suyu_emu.features.settings.model.LongSetting -import org.suyu.suyu_emu.features.settings.model.Settings -import org.suyu.suyu_emu.features.settings.model.Settings.MenuTag -import org.suyu.suyu_emu.features.settings.model.ShortSetting -import org.suyu.suyu_emu.features.settings.model.StringSetting -import org.suyu.suyu_emu.features.settings.model.view.* -import org.suyu.suyu_emu.utils.InputHandler -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.model.AnalogDirection +import dev.suyu.suyu_emu.features.input.model.NativeAnalog +import dev.suyu.suyu_emu.features.input.model.NativeButton +import dev.suyu.suyu_emu.features.input.model.NpadStyleIndex +import dev.suyu.suyu_emu.features.settings.model.AbstractBooleanSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractIntSetting +import dev.suyu.suyu_emu.features.settings.model.BooleanSetting +import dev.suyu.suyu_emu.features.settings.model.ByteSetting +import dev.suyu.suyu_emu.features.settings.model.IntSetting +import dev.suyu.suyu_emu.features.settings.model.LongSetting +import dev.suyu.suyu_emu.features.settings.model.Settings +import dev.suyu.suyu_emu.features.settings.model.Settings.MenuTag +import dev.suyu.suyu_emu.features.settings.model.ShortSetting +import dev.suyu.suyu_emu.features.settings.model.StringSetting +import dev.suyu.suyu_emu.features.settings.model.view.* +import dev.suyu.suyu_emu.utils.InputHandler +import dev.suyu.suyu_emu.utils.NativeConfig class SettingsFragmentPresenter( private val settingsViewModel: SettingsViewModel, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt index bab4765b5a..2cd10632bd 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import android.content.Context import android.os.Bundle @@ -19,13 +19,13 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.divider.MaterialDividerItemDecoration import com.google.android.material.transition.MaterialSharedAxis import info.debatty.java.stringsimilarity.Cosine -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.FragmentSettingsSearchBinding -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.utils.NativeConfig -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.FragmentSettingsSearchBinding +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.utils.collect class SettingsSearchFragment : Fragment() { private var _binding: FragmentSettingsSearchBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt index e99dec076d..7f2faa336f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt @@ -1,18 +1,18 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import androidx.lifecycle.ViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.model.Game -import org.suyu.suyu_emu.utils.InputHandler -import org.suyu.suyu_emu.utils.ParamPackage +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.model.Game +import dev.suyu.suyu_emu.utils.InputHandler +import dev.suyu.suyu_emu.utils.ParamPackage class SettingsViewModel : ViewModel() { var game: Game? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt similarity index 82% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt index a996f044f9..1581fea850 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View import java.time.Instant @@ -9,11 +9,11 @@ import java.time.ZoneId import java.time.ZonedDateTime import java.time.format.DateTimeFormatter import java.time.format.FormatStyle -import org.suyu.suyu_emu.databinding.ListItemSettingBinding -import org.suyu.suyu_emu.features.settings.model.view.DateTimeSetting -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.databinding.ListItemSettingBinding +import dev.suyu.suyu_emu.features.settings.model.view.DateTimeSetting +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible class DateTimeViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : SettingViewHolder(binding.root, adapter) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt similarity index 70% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt index 7b9c8303d4..8768a387dd 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt @@ -1,12 +1,12 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View -import org.suyu.suyu_emu.databinding.ListItemSettingsHeaderBinding -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.databinding.ListItemSettingsHeaderBinding +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter class HeaderViewHolder(val binding: ListItemSettingsHeaderBinding, adapter: SettingsAdapter) : SettingViewHolder(binding.root, adapter) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt similarity index 72% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt index 72c27b668a..ea5ea262cc 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt @@ -2,15 +2,15 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View -import org.suyu.suyu_emu.databinding.ListItemSettingBinding -import org.suyu.suyu_emu.features.settings.model.view.InputProfileSetting -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.databinding.ListItemSettingBinding +import dev.suyu.suyu_emu.features.settings.model.view.InputProfileSetting +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible class InputProfileViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : SettingViewHolder(binding.root, adapter) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/InputViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/InputViewHolder.kt similarity index 76% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/InputViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/InputViewHolder.kt index d66e4e7581..9260a90c36 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/InputViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/InputViewHolder.kt @@ -2,18 +2,18 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View -import org.suyu.suyu_emu.databinding.ListItemSettingInputBinding -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.settings.model.view.AnalogInputSetting -import org.suyu.suyu_emu.features.settings.model.view.ButtonInputSetting -import org.suyu.suyu_emu.features.settings.model.view.InputSetting -import org.suyu.suyu_emu.features.settings.model.view.ModifierInputSetting -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.databinding.ListItemSettingInputBinding +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.settings.model.view.AnalogInputSetting +import dev.suyu.suyu_emu.features.settings.model.view.ButtonInputSetting +import dev.suyu.suyu_emu.features.settings.model.view.InputSetting +import dev.suyu.suyu_emu.features.settings.model.view.ModifierInputSetting +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible class InputViewHolder(val binding: ListItemSettingInputBinding, adapter: SettingsAdapter) : SettingViewHolder(binding.root, adapter) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt similarity index 79% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt index f210925fd2..886ea6adce 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt @@ -1,15 +1,15 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View import androidx.core.content.res.ResourcesCompat -import org.suyu.suyu_emu.databinding.ListItemSettingBinding -import org.suyu.suyu_emu.features.settings.model.view.RunnableSetting -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.databinding.ListItemSettingBinding +import dev.suyu.suyu_emu.features.settings.model.view.RunnableSetting +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible class RunnableViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : SettingViewHolder(binding.root, adapter) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt similarity index 84% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt index 93b0967462..c0d467ef92 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt @@ -1,14 +1,14 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View import androidx.recyclerview.widget.RecyclerView -import org.suyu.suyu_emu.databinding.ListItemSettingBinding -import org.suyu.suyu_emu.databinding.ListItemSettingSwitchBinding -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.databinding.ListItemSettingBinding +import dev.suyu.suyu_emu.databinding.ListItemSettingSwitchBinding +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter abstract class SettingViewHolder(itemView: View, protected val adapter: SettingsAdapter) : RecyclerView.ViewHolder(itemView), View.OnClickListener, View.OnLongClickListener { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt similarity index 85% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt index f8b891c94a..450424503e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt @@ -1,16 +1,16 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View -import org.suyu.suyu_emu.databinding.ListItemSettingBinding -import org.suyu.suyu_emu.features.settings.model.view.IntSingleChoiceSetting -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.model.view.SingleChoiceSetting -import org.suyu.suyu_emu.features.settings.model.view.StringSingleChoiceSetting -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.databinding.ListItemSettingBinding +import dev.suyu.suyu_emu.features.settings.model.view.IntSingleChoiceSetting +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.model.view.SingleChoiceSetting +import dev.suyu.suyu_emu.features.settings.model.view.StringSingleChoiceSetting +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible class SingleChoiceViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : SettingViewHolder(binding.root, adapter) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt similarity index 79% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt index 160dc33b75..3d9ef7caf7 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt @@ -1,15 +1,15 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.ListItemSettingBinding -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.model.view.SliderSetting -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.ListItemSettingBinding +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.model.view.SliderSetting +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible class SliderViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : SettingViewHolder(binding.root, adapter) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt similarity index 79% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt index 3acc7248cd..63ce59a84b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt @@ -2,14 +2,14 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View -import org.suyu.suyu_emu.databinding.ListItemSettingBinding -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.model.view.StringInputSetting -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.databinding.ListItemSettingBinding +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.model.view.StringInputSetting +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible class StringInputViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : SettingViewHolder(binding.root, adapter) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt similarity index 78% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt index 3701f0f46e..38102d672e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt @@ -1,15 +1,15 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View import androidx.core.content.res.ResourcesCompat -import org.suyu.suyu_emu.databinding.ListItemSettingBinding -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.model.view.SubmenuSetting -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.databinding.ListItemSettingBinding +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.model.view.SubmenuSetting +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible class SubmenuViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : SettingViewHolder(binding.root, adapter) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt similarity index 81% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt index 93e50f381b..4b45251298 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt @@ -1,15 +1,15 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View import android.widget.CompoundButton -import org.suyu.suyu_emu.databinding.ListItemSettingSwitchBinding -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.model.view.SwitchSetting -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.databinding.ListItemSettingSwitchBinding +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.model.view.SwitchSetting +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible class SwitchSettingViewHolder(val binding: ListItemSettingSwitchBinding, adapter: SettingsAdapter) : SettingViewHolder(binding.root, adapter) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/utils/SettingsFile.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/utils/SettingsFile.kt similarity index 77% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/utils/SettingsFile.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/utils/SettingsFile.kt index 3c05c2c219..3532cdef87 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/utils/SettingsFile.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/utils/SettingsFile.kt @@ -1,14 +1,14 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.utils +package dev.suyu.suyu_emu.features.settings.utils import android.net.Uri -import org.suyu.suyu_emu.model.Game +import dev.suyu.suyu_emu.model.Game import java.io.* -import org.suyu.suyu_emu.utils.DirectoryInitialization -import org.suyu.suyu_emu.utils.FileUtil -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.DirectoryInitialization +import dev.suyu.suyu_emu.utils.FileUtil +import dev.suyu.suyu_emu.utils.NativeConfig /** * Contains static methods for interacting with .ini files in which settings are stored. diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AboutFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AboutFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AboutFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AboutFragment.kt index 66b4fd5604..5902a997aa 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AboutFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AboutFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.content.ClipData import android.content.ClipboardManager @@ -21,11 +21,11 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.findNavController import com.google.android.material.transition.MaterialSharedAxis -import org.suyu.suyu_emu.BuildConfig -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.FragmentAboutBinding -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.BuildConfig +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.FragmentAboutBinding +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins class AboutFragment : Fragment() { private var _binding: FragmentAboutBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt similarity index 88% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt index bfc06a31c9..6e75e5d139 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.content.DialogInterface @@ -10,11 +10,11 @@ import android.os.Bundle import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.DialogAddFolderBinding -import org.suyu.suyu_emu.model.GameDir -import org.suyu.suyu_emu.model.GamesViewModel -import org.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.DialogAddFolderBinding +import dev.suyu.suyu_emu.model.GameDir +import dev.suyu.suyu_emu.model.GamesViewModel +import dev.suyu.suyu_emu.model.HomeViewModel class AddGameFolderDialogFragment : DialogFragment() { private val homeViewModel: HomeViewModel by activityViewModels() diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddonsFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AddonsFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddonsFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AddonsFragment.kt index 825b0869de..7d2b9a2f27 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddonsFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AddonsFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.content.Intent import android.os.Bundle @@ -19,16 +19,15 @@ import androidx.navigation.findNavController import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.transition.MaterialSharedAxis -import kotlinx.coroutines.launch -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.adapters.AddonAdapter -import org.suyu.suyu_emu.databinding.FragmentAddonsBinding -import org.suyu.suyu_emu.model.AddonViewModel -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.utils.AddonUtil -import org.suyu.suyu_emu.utils.FileUtil.copyFilesTo -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.adapters.AddonAdapter +import dev.suyu.suyu_emu.databinding.FragmentAddonsBinding +import dev.suyu.suyu_emu.model.AddonViewModel +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.utils.AddonUtil +import dev.suyu.suyu_emu.utils.FileUtil.copyFilesTo +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.utils.collect import java.io.File class AddonsFragment : Fragment() { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AppletLauncherFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AppletLauncherFragment.kt similarity index 91% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AppletLauncherFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AppletLauncherFragment.kt index 138e5074af..622ef144a0 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AppletLauncherFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AppletLauncherFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.os.Bundle import android.view.LayoutInflater @@ -15,13 +15,13 @@ import androidx.fragment.app.activityViewModels import androidx.navigation.findNavController import androidx.recyclerview.widget.GridLayoutManager import com.google.android.material.transition.MaterialSharedAxis -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.adapters.AppletAdapter -import org.suyu.suyu_emu.databinding.FragmentAppletLauncherBinding -import org.suyu.suyu_emu.model.Applet -import org.suyu.suyu_emu.model.AppletInfo -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.adapters.AppletAdapter +import dev.suyu.suyu_emu.databinding.FragmentAppletLauncherBinding +import dev.suyu.suyu_emu.model.Applet +import dev.suyu.suyu_emu.model.AppletInfo +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins class AppletLauncherFragment : Fragment() { private var _binding: FragmentAppletLauncherBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt similarity index 86% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt index dce2c8ca1f..8be5d21ea0 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.os.Bundle @@ -11,9 +11,9 @@ import android.view.ViewGroup import androidx.fragment.app.DialogFragment import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.adapters.CabinetLauncherDialogAdapter -import org.suyu.suyu_emu.databinding.DialogListBinding +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.adapters.CabinetLauncherDialogAdapter +import dev.suyu.suyu_emu.databinding.DialogListBinding class CabinetLauncherDialogFragment : DialogFragment() { private lateinit var binding: DialogListBinding diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt index 5bbf751a3a..a11e058a73 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.content.DialogInterface @@ -10,10 +10,10 @@ import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import androidx.preference.PreferenceManager import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.model.AddonViewModel -import org.suyu.suyu_emu.ui.main.MainActivity +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.model.AddonViewModel +import dev.suyu.suyu_emu.ui.main.MainActivity class ContentTypeSelectionDialogFragment : DialogFragment() { private val addonViewModel: AddonViewModel by activityViewModels() diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CoreErrorDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/CoreErrorDialogFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CoreErrorDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/CoreErrorDialogFragment.kt index 16f3e8b08f..bcba2b9750 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CoreErrorDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/CoreErrorDialogFragment.kt @@ -2,15 +2,15 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.content.DialogInterface import android.os.Bundle import androidx.fragment.app.DialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R class CoreErrorDialogFragment : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriverManagerFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/DriverManagerFragment.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriverManagerFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/DriverManagerFragment.kt index 812037563b..1645400b41 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriverManagerFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/DriverManagerFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.os.Bundle import android.view.LayoutInflater @@ -18,20 +18,19 @@ import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.GridLayoutManager import com.google.android.material.transition.MaterialSharedAxis import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.adapters.DriverAdapter -import org.suyu.suyu_emu.databinding.FragmentDriverManagerBinding -import org.suyu.suyu_emu.features.settings.model.StringSetting -import org.suyu.suyu_emu.model.Driver.Companion.toDriver -import org.suyu.suyu_emu.model.DriverViewModel -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.utils.FileUtil -import org.suyu.suyu_emu.utils.GpuDriverHelper -import org.suyu.suyu_emu.utils.NativeConfig -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.adapters.DriverAdapter +import dev.suyu.suyu_emu.databinding.FragmentDriverManagerBinding +import dev.suyu.suyu_emu.features.settings.model.StringSetting +import dev.suyu.suyu_emu.model.Driver.Companion.toDriver +import dev.suyu.suyu_emu.model.DriverViewModel +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.utils.FileUtil +import dev.suyu.suyu_emu.utils.GpuDriverHelper +import dev.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.utils.collect import java.io.File import java.io.IOException diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt similarity index 87% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt index 993eb015d7..6f97d5a4eb 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.os.Bundle @@ -11,10 +11,10 @@ import android.view.ViewGroup import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.DialogProgressBarBinding -import org.suyu.suyu_emu.model.DriverViewModel -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.DialogProgressBarBinding +import dev.suyu.suyu_emu.model.DriverViewModel +import dev.suyu.suyu_emu.utils.collect class DriversLoadingDialogFragment : DialogFragment() { private val driverViewModel: DriverViewModel by activityViewModels() diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EarlyAccessFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/EarlyAccessFragment.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EarlyAccessFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/EarlyAccessFragment.kt index 7eebf77159..28215693b6 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EarlyAccessFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/EarlyAccessFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.content.Intent import android.net.Uri @@ -16,10 +16,10 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController import com.google.android.material.transition.MaterialSharedAxis -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.FragmentEarlyAccessBinding -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.FragmentEarlyAccessBinding +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins class EarlyAccessFragment : Fragment() { private var _binding: FragmentEarlyAccessBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/EmulationFragment.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EmulationFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/EmulationFragment.kt index 62fbcaf629..79a7078e53 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/EmulationFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.annotation.SuppressLint import android.app.AlertDialog @@ -39,25 +39,25 @@ import androidx.window.layout.WindowInfoTracker import androidx.window.layout.WindowLayoutInfo import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.slider.Slider -import org.suyu.suyu_emu.HomeNavigationDirections -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.activities.EmulationActivity -import org.suyu.suyu_emu.databinding.DialogOverlayAdjustBinding -import org.suyu.suyu_emu.databinding.FragmentEmulationBinding -import org.suyu.suyu_emu.features.settings.model.BooleanSetting -import org.suyu.suyu_emu.features.settings.model.IntSetting -import org.suyu.suyu_emu.features.settings.model.Settings -import org.suyu.suyu_emu.features.settings.model.Settings.EmulationOrientation -import org.suyu.suyu_emu.features.settings.model.Settings.EmulationVerticalAlignment -import org.suyu.suyu_emu.features.settings.utils.SettingsFile -import org.suyu.suyu_emu.model.DriverViewModel -import org.suyu.suyu_emu.model.Game -import org.suyu.suyu_emu.model.EmulationViewModel -import org.suyu.suyu_emu.overlay.model.OverlayControl -import org.suyu.suyu_emu.overlay.model.OverlayLayout -import org.suyu.suyu_emu.utils.* -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.HomeNavigationDirections +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.activities.EmulationActivity +import dev.suyu.suyu_emu.databinding.DialogOverlayAdjustBinding +import dev.suyu.suyu_emu.databinding.FragmentEmulationBinding +import dev.suyu.suyu_emu.features.settings.model.BooleanSetting +import dev.suyu.suyu_emu.features.settings.model.IntSetting +import dev.suyu.suyu_emu.features.settings.model.Settings +import dev.suyu.suyu_emu.features.settings.model.Settings.EmulationOrientation +import dev.suyu.suyu_emu.features.settings.model.Settings.EmulationVerticalAlignment +import dev.suyu.suyu_emu.features.settings.utils.SettingsFile +import dev.suyu.suyu_emu.model.DriverViewModel +import dev.suyu.suyu_emu.model.Game +import dev.suyu.suyu_emu.model.EmulationViewModel +import dev.suyu.suyu_emu.overlay.model.OverlayControl +import dev.suyu.suyu_emu.overlay.model.OverlayLayout +import dev.suyu.suyu_emu.utils.* +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible import java.lang.NullPointerException class EmulationFragment : Fragment(), SurfaceHolder.Callback { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt similarity index 88% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt index e65f0f5e6c..f40c4daaae 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.content.DialogInterface @@ -9,12 +9,12 @@ import android.os.Bundle import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.DialogFolderPropertiesBinding -import org.suyu.suyu_emu.model.GameDir -import org.suyu.suyu_emu.model.GamesViewModel -import org.suyu.suyu_emu.utils.NativeConfig -import org.suyu.suyu_emu.utils.SerializableHelper.parcelable +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.DialogFolderPropertiesBinding +import dev.suyu.suyu_emu.model.GameDir +import dev.suyu.suyu_emu.model.GamesViewModel +import dev.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.SerializableHelper.parcelable class GameFolderPropertiesDialogFragment : DialogFragment() { private val gamesViewModel: GamesViewModel by activityViewModels() diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFoldersFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GameFoldersFragment.kt similarity index 89% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFoldersFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GameFoldersFragment.kt index 7b9ccce0a1..198afc26a1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFoldersFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GameFoldersFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.content.Intent import android.os.Bundle @@ -16,15 +16,14 @@ import androidx.fragment.app.activityViewModels import androidx.navigation.findNavController import androidx.recyclerview.widget.GridLayoutManager import com.google.android.material.transition.MaterialSharedAxis -import kotlinx.coroutines.launch -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.adapters.FolderAdapter -import org.suyu.suyu_emu.databinding.FragmentFoldersBinding -import org.suyu.suyu_emu.model.GamesViewModel -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.ui.main.MainActivity -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.adapters.FolderAdapter +import dev.suyu.suyu_emu.databinding.FragmentFoldersBinding +import dev.suyu.suyu_emu.model.GamesViewModel +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.ui.main.MainActivity +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.utils.collect class GameFoldersFragment : Fragment() { private var _binding: FragmentFoldersBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameInfoFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GameInfoFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameInfoFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GameInfoFragment.kt index 16901fead4..743389016f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameInfoFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GameInfoFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.content.ClipData import android.content.ClipboardManager @@ -21,14 +21,14 @@ import androidx.fragment.app.activityViewModels import androidx.navigation.findNavController import androidx.navigation.fragment.navArgs import com.google.android.material.transition.MaterialSharedAxis -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.FragmentGameInfoBinding -import org.suyu.suyu_emu.model.GameVerificationResult -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.utils.GameMetadata -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.FragmentGameInfoBinding +import dev.suyu.suyu_emu.model.GameVerificationResult +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.utils.GameMetadata +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins class GameInfoFragment : Fragment() { private var _binding: FragmentGameInfoBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GamePropertiesFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GamePropertiesFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GamePropertiesFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GamePropertiesFragment.kt index e56b186d06..751aa29a3f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GamePropertiesFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GamePropertiesFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.content.pm.ShortcutInfo import android.content.pm.ShortcutManager @@ -24,27 +24,27 @@ import com.google.android.material.transition.MaterialSharedAxis import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.suyu.suyu_emu.HomeNavigationDirections -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.adapters.GamePropertiesAdapter -import org.suyu.suyu_emu.databinding.FragmentGamePropertiesBinding -import org.suyu.suyu_emu.features.settings.model.Settings -import org.suyu.suyu_emu.model.DriverViewModel -import org.suyu.suyu_emu.model.GameProperty -import org.suyu.suyu_emu.model.GamesViewModel -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.model.InstallableProperty -import org.suyu.suyu_emu.model.SubmenuProperty -import org.suyu.suyu_emu.model.TaskState -import org.suyu.suyu_emu.utils.DirectoryInitialization -import org.suyu.suyu_emu.utils.FileUtil -import org.suyu.suyu_emu.utils.GameIconUtils -import org.suyu.suyu_emu.utils.GpuDriverHelper -import org.suyu.suyu_emu.utils.MemoryUtil -import org.suyu.suyu_emu.utils.ViewUtils.marquee -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.HomeNavigationDirections +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.adapters.GamePropertiesAdapter +import dev.suyu.suyu_emu.databinding.FragmentGamePropertiesBinding +import dev.suyu.suyu_emu.features.settings.model.Settings +import dev.suyu.suyu_emu.model.DriverViewModel +import dev.suyu.suyu_emu.model.GameProperty +import dev.suyu.suyu_emu.model.GamesViewModel +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.model.InstallableProperty +import dev.suyu.suyu_emu.model.SubmenuProperty +import dev.suyu.suyu_emu.model.TaskState +import dev.suyu.suyu_emu.utils.DirectoryInitialization +import dev.suyu.suyu_emu.utils.FileUtil +import dev.suyu.suyu_emu.utils.GameIconUtils +import dev.suyu.suyu_emu.utils.GpuDriverHelper +import dev.suyu.suyu_emu.utils.MemoryUtil +import dev.suyu.suyu_emu.utils.ViewUtils.marquee +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.utils.collect import java.io.BufferedOutputStream import java.io.File diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/HomeSettingsFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/HomeSettingsFragment.kt similarity index 95% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/HomeSettingsFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/HomeSettingsFragment.kt index 790ca7a54b..6b80f7ee79 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/HomeSettingsFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/HomeSettingsFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.Manifest import android.content.ActivityNotFoundException @@ -27,23 +27,22 @@ import androidx.navigation.findNavController import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.GridLayoutManager import com.google.android.material.transition.MaterialSharedAxis -import org.suyu.suyu_emu.BuildConfig -import org.suyu.suyu_emu.HomeNavigationDirections -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.adapters.HomeSettingAdapter -import org.suyu.suyu_emu.databinding.FragmentHomeSettingsBinding -import org.suyu.suyu_emu.features.DocumentProvider -import org.suyu.suyu_emu.features.settings.model.Settings -import org.suyu.suyu_emu.model.DriverViewModel -import org.suyu.suyu_emu.model.HomeSetting -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.ui.main.MainActivity -import org.suyu.suyu_emu.utils.FileUtil -import org.suyu.suyu_emu.utils.GpuDriverHelper -import org.suyu.suyu_emu.utils.Log -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.HomeNavigationDirections +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.adapters.HomeSettingAdapter +import dev.suyu.suyu_emu.databinding.FragmentHomeSettingsBinding +import dev.suyu.suyu_emu.features.DocumentProvider +import dev.suyu.suyu_emu.features.settings.model.Settings +import dev.suyu.suyu_emu.model.DriverViewModel +import dev.suyu.suyu_emu.model.HomeSetting +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.ui.main.MainActivity +import dev.suyu.suyu_emu.utils.FileUtil +import dev.suyu.suyu_emu.utils.GpuDriverHelper +import dev.suyu.suyu_emu.utils.Log +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins class HomeSettingsFragment : Fragment() { private var _binding: FragmentHomeSettingsBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/InstallableFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/InstallableFragment.kt similarity index 95% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/InstallableFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/InstallableFragment.kt index 4a4dd11f4f..659811e33d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/InstallableFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/InstallableFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.os.Bundle import android.view.LayoutInflater @@ -18,21 +18,20 @@ import androidx.navigation.findNavController import androidx.recyclerview.widget.GridLayoutManager import com.google.android.material.transition.MaterialSharedAxis import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.adapters.InstallableAdapter -import org.suyu.suyu_emu.databinding.FragmentInstallablesBinding -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.model.Installable -import org.suyu.suyu_emu.model.TaskState -import org.suyu.suyu_emu.ui.main.MainActivity -import org.suyu.suyu_emu.utils.DirectoryInitialization -import org.suyu.suyu_emu.utils.FileUtil -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.adapters.InstallableAdapter +import dev.suyu.suyu_emu.databinding.FragmentInstallablesBinding +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.model.Installable +import dev.suyu.suyu_emu.model.TaskState +import dev.suyu.suyu_emu.ui.main.MainActivity +import dev.suyu.suyu_emu.utils.DirectoryInitialization +import dev.suyu.suyu_emu.utils.FileUtil +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.utils.collect import java.io.BufferedOutputStream import java.io.File import java.math.BigInteger diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt similarity index 90% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt index 4cc4f62407..bd78b3480c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.content.DialogInterface @@ -9,10 +9,10 @@ import android.os.Bundle import androidx.fragment.app.DialogFragment import androidx.navigation.fragment.findNavController import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.HomeNavigationDirections -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.model.Game -import org.suyu.suyu_emu.utils.SerializableHelper.parcelable +import dev.suyu.suyu_emu.HomeNavigationDirections +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.model.Game +import dev.suyu.suyu_emu.utils.SerializableHelper.parcelable class LaunchGameDialogFragment : DialogFragment() { private var selectedItem = 1 diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt similarity index 90% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt index 76e34b62da..f473acb881 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.os.Bundle import android.view.LayoutInflater @@ -9,9 +9,9 @@ import android.view.View import android.view.ViewGroup import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialogFragment -import org.suyu.suyu_emu.databinding.DialogLicenseBinding -import org.suyu.suyu_emu.model.License -import org.suyu.suyu_emu.utils.SerializableHelper.parcelable +import dev.suyu.suyu_emu.databinding.DialogLicenseBinding +import dev.suyu.suyu_emu.model.License +import dev.suyu.suyu_emu.utils.SerializableHelper.parcelable class LicenseBottomSheetDialogFragment : BottomSheetDialogFragment() { private var _binding: DialogLicenseBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicensesFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/LicensesFragment.kt similarity index 93% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicensesFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/LicensesFragment.kt index b5709d624e..71bdec1ea0 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicensesFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/LicensesFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.os.Bundle import android.view.LayoutInflater @@ -16,12 +16,12 @@ import androidx.fragment.app.activityViewModels import androidx.navigation.findNavController import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.transition.MaterialSharedAxis -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.adapters.LicenseAdapter -import org.suyu.suyu_emu.databinding.FragmentLicensesBinding -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.model.License -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.adapters.LicenseAdapter +import dev.suyu.suyu_emu.databinding.FragmentLicensesBinding +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.model.License +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins class LicensesFragment : Fragment() { private var _binding: FragmentLicensesBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/MessageDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/MessageDialogFragment.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/MessageDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/MessageDialogFragment.kt index ed80521354..75414251e1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/MessageDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/MessageDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.content.Intent @@ -13,9 +13,9 @@ import androidx.fragment.app.FragmentActivity import androidx.fragment.app.activityViewModels import androidx.lifecycle.ViewModelProvider import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.model.MessageDialogViewModel -import org.suyu.suyu_emu.utils.Log +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.model.MessageDialogViewModel +import dev.suyu.suyu_emu.utils.Log class MessageDialogFragment : DialogFragment() { private val messageDialogViewModel: MessageDialogViewModel by activityViewModels() diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt similarity index 95% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt index c384584b19..02e91db633 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.content.DialogInterface @@ -11,7 +11,7 @@ import android.os.Bundle import android.provider.Settings import androidx.fragment.app.DialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R +import dev.suyu.suyu_emu.R class PermissionDeniedDialogFragment : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ProgressDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/ProgressDialogFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ProgressDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/ProgressDialogFragment.kt index c1221f383c..db6a7c4e82 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ProgressDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/ProgressDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.os.Bundle @@ -15,11 +15,11 @@ import androidx.fragment.app.FragmentActivity import androidx.fragment.app.activityViewModels import androidx.lifecycle.ViewModelProvider import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.DialogProgressBarBinding -import org.suyu.suyu_emu.model.TaskViewModel -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.DialogProgressBarBinding +import dev.suyu.suyu_emu.model.TaskViewModel +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.utils.collect class ProgressDialogFragment : DialogFragment() { private val taskViewModel: TaskViewModel by activityViewModels() diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt similarity index 88% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt index 24f9f6a10a..ff96b1f8d5 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt @@ -1,14 +1,14 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.os.Bundle import androidx.fragment.app.DialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.features.settings.ui.SettingsActivity +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.features.settings.ui.SettingsActivity class ResetSettingsDialogFragment : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SearchFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/SearchFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SearchFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/SearchFragment.kt index 54155bdc43..7216fc641e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SearchFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/SearchFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.content.Context import android.content.SharedPreferences @@ -21,16 +21,16 @@ import androidx.preference.PreferenceManager import info.debatty.java.stringsimilarity.Jaccard import info.debatty.java.stringsimilarity.JaroWinkler import java.util.Locale -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.adapters.GameAdapter -import org.suyu.suyu_emu.databinding.FragmentSearchBinding -import org.suyu.suyu_emu.layout.AutofitGridLayoutManager -import org.suyu.suyu_emu.model.Game -import org.suyu.suyu_emu.model.GamesViewModel -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.adapters.GameAdapter +import dev.suyu.suyu_emu.databinding.FragmentSearchBinding +import dev.suyu.suyu_emu.layout.AutofitGridLayoutManager +import dev.suyu.suyu_emu.model.Game +import dev.suyu.suyu_emu.model.GamesViewModel +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.utils.collect class SearchFragment : Fragment() { private var _binding: FragmentSearchBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/SetupFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/SetupFragment.kt index fdbdb20b65..3c2ccf4bcd 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/SetupFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.Manifest import android.content.Intent @@ -26,24 +26,23 @@ import androidx.navigation.findNavController import androidx.preference.PreferenceManager import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback import com.google.android.material.transition.MaterialFadeThrough -import kotlinx.coroutines.launch -import org.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.NativeLibrary import java.io.File -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.adapters.SetupAdapter -import org.suyu.suyu_emu.databinding.FragmentSetupBinding -import org.suyu.suyu_emu.features.settings.model.Settings -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.model.SetupCallback -import org.suyu.suyu_emu.model.SetupPage -import org.suyu.suyu_emu.model.StepState -import org.suyu.suyu_emu.ui.main.MainActivity -import org.suyu.suyu_emu.utils.DirectoryInitialization -import org.suyu.suyu_emu.utils.NativeConfig -import org.suyu.suyu_emu.utils.ViewUtils -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.adapters.SetupAdapter +import dev.suyu.suyu_emu.databinding.FragmentSetupBinding +import dev.suyu.suyu_emu.features.settings.model.Settings +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.model.SetupCallback +import dev.suyu.suyu_emu.model.SetupPage +import dev.suyu.suyu_emu.model.StepState +import dev.suyu.suyu_emu.ui.main.MainActivity +import dev.suyu.suyu_emu.utils.DirectoryInitialization +import dev.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.ViewUtils +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.utils.collect class SetupFragment : Fragment() { private var _binding: FragmentSetupBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt index a508ebfd33..70556f57a6 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.content.DialogInterface @@ -10,7 +10,7 @@ import android.net.Uri import android.os.Bundle import androidx.fragment.app.DialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R +import dev.suyu.suyu_emu.R class SetupWarningDialogFragment : DialogFragment() { private var titleId: Int = 0 diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt index 6d37cf4f8b..b5bad73c03 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt @@ -1,13 +1,13 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.layout +package dev.suyu.suyu_emu.layout import android.content.Context import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.Recycler -import org.suyu.suyu_emu.R +import dev.suyu.suyu_emu.R /** * Cut down version of the solution provided here diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/AddonViewModel.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/AddonViewModel.kt similarity index 96% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/AddonViewModel.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/AddonViewModel.kt index e67611631e..184668475c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/AddonViewModel.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/AddonViewModel.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -10,8 +10,8 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.utils.NativeConfig import java.util.concurrent.atomic.AtomicBoolean class AddonViewModel : ViewModel() { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Applet.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/Applet.kt similarity index 96% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/Applet.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/Applet.kt index af22fd0bc4..37f50588df 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Applet.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/Applet.kt @@ -1,11 +1,11 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import androidx.annotation.DrawableRes import androidx.annotation.StringRes -import org.suyu.suyu_emu.R +import dev.suyu.suyu_emu.R data class Applet( @StringRes val titleId: Int, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Driver.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/Driver.kt similarity index 89% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/Driver.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/Driver.kt index cf1f72bcc1..a866ceb6b8 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Driver.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/Driver.kt @@ -2,9 +2,9 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model -import org.suyu.suyu_emu.utils.GpuDriverMetadata +import dev.suyu.suyu_emu.utils.GpuDriverMetadata data class Driver( override var selected: Boolean, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/DriverViewModel.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/DriverViewModel.kt similarity index 93% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/DriverViewModel.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/DriverViewModel.kt index 7009d453ae..7d4f59c493 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/DriverViewModel.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/DriverViewModel.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -14,14 +14,14 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.features.settings.model.StringSetting -import org.suyu.suyu_emu.features.settings.utils.SettingsFile -import org.suyu.suyu_emu.model.Driver.Companion.toDriver -import org.suyu.suyu_emu.utils.GpuDriverHelper -import org.suyu.suyu_emu.utils.GpuDriverMetadata -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.features.settings.model.StringSetting +import dev.suyu.suyu_emu.features.settings.utils.SettingsFile +import dev.suyu.suyu_emu.model.Driver.Companion.toDriver +import dev.suyu.suyu_emu.utils.GpuDriverHelper +import dev.suyu.suyu_emu.utils.GpuDriverMetadata +import dev.suyu.suyu_emu.utils.NativeConfig import java.io.File class DriverViewModel : ViewModel() { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/EmulationViewModel.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/EmulationViewModel.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/EmulationViewModel.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/EmulationViewModel.kt index 3d6e744e93..3a0124b8b0 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/EmulationViewModel.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/EmulationViewModel.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import androidx.lifecycle.ViewModel import kotlinx.coroutines.flow.MutableStateFlow diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Game.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/Game.kt similarity index 91% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/Game.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/Game.kt index 039ce3d302..b186df68ab 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Game.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/Game.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import android.content.Intent import android.net.Uri @@ -9,12 +9,12 @@ import android.os.Parcelable import java.util.HashSet import kotlinx.parcelize.Parcelize import kotlinx.serialization.Serializable -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.activities.EmulationActivity -import org.suyu.suyu_emu.utils.DirectoryInitialization -import org.suyu.suyu_emu.utils.FileUtil +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.activities.EmulationActivity +import dev.suyu.suyu_emu.utils.DirectoryInitialization +import dev.suyu.suyu_emu.utils.FileUtil import java.time.LocalDateTime import java.time.format.DateTimeFormatter diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameDir.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/GameDir.kt similarity index 89% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/GameDir.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/GameDir.kt index b3f7a8d14a..881b6c992e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameDir.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/GameDir.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import android.os.Parcelable import kotlinx.parcelize.Parcelize diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameProperties.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/GameProperties.kt similarity index 96% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/GameProperties.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/GameProperties.kt index abeee8f73b..c052f4aaae 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameProperties.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/GameProperties.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import androidx.annotation.DrawableRes import androidx.annotation.StringRes diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameVerificationResult.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/GameVerificationResult.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/GameVerificationResult.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/GameVerificationResult.kt index 61c6014469..4964e16209 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameVerificationResult.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/GameVerificationResult.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model enum class GameVerificationResult(val int: Int) { Success(0), diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GamesViewModel.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/GamesViewModel.kt similarity index 96% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/GamesViewModel.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/GamesViewModel.kt index f5a1e55256..58105ae341 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GamesViewModel.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/GamesViewModel.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import android.net.Uri import androidx.documentfile.provider.DocumentFile @@ -17,10 +17,10 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.utils.GameHelper -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.utils.GameHelper +import dev.suyu.suyu_emu.utils.NativeConfig import java.util.concurrent.atomic.AtomicBoolean class GamesViewModel : ViewModel() { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/HomeSetting.kt similarity index 93% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/HomeSetting.kt index 114e4a89ad..6097181df2 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/HomeSetting.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeViewModel.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/HomeViewModel.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeViewModel.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/HomeViewModel.kt index 6cfbb725c8..d0e9a44149 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeViewModel.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/HomeViewModel.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import android.net.Uri import androidx.lifecycle.ViewModel diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/InstallResult.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/InstallResult.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/InstallResult.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/InstallResult.kt index 110da0f32b..40668f192d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/InstallResult.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/InstallResult.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model enum class InstallResult(val int: Int) { Success(0), diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Installable.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/Installable.kt similarity index 90% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/Installable.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/Installable.kt index 6b15d54afe..632121f191 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Installable.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/Installable.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import androidx.annotation.StringRes diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/License.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/License.kt similarity index 91% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/License.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/License.kt index 735b07ee65..e10a68f668 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/License.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/License.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import android.os.Parcelable import kotlinx.parcelize.Parcelize diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/MessageDialogViewModel.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/MessageDialogViewModel.kt similarity index 91% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/MessageDialogViewModel.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/MessageDialogViewModel.kt index 1f51bb3a06..02474352c5 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/MessageDialogViewModel.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/MessageDialogViewModel.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import androidx.lifecycle.ViewModel diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/MinimalDocumentFile.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/MinimalDocumentFile.kt similarity index 91% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/MinimalDocumentFile.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/MinimalDocumentFile.kt index 176c6f3b71..f6580c8e2a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/MinimalDocumentFile.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/MinimalDocumentFile.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import android.net.Uri import android.provider.DocumentsContract diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Patch.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/Patch.kt similarity index 90% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/Patch.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/Patch.kt index 6e9d09d1be..aa105c3401 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Patch.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/Patch.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import androidx.annotation.Keep diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/PatchType.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/PatchType.kt similarity index 91% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/PatchType.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/PatchType.kt index 1880f876ec..b48cc843dd 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/PatchType.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/PatchType.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model enum class PatchType(val int: Int) { Update(0), diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/SelectableItem.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/SelectableItem.kt similarity index 89% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/SelectableItem.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/SelectableItem.kt index b8209e3f1d..a98315c653 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/SelectableItem.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/SelectableItem.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model interface SelectableItem { var selected: Boolean diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/SetupPage.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/SetupPage.kt similarity index 95% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/SetupPage.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/SetupPage.kt index 0316009d6c..4766b1870a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/SetupPage.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/SetupPage.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model data class SetupPage( val iconId: Int, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/TaskViewModel.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/TaskViewModel.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/TaskViewModel.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/TaskViewModel.kt index e4d635ff4f..b3f9daaf98 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/TaskViewModel.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/TaskViewModel.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlay.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlay.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlay.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlay.kt index 76e33bef37..dd5d906b53 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlay.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlay.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.overlay +package dev.suyu.suyu_emu.overlay import android.app.Activity import android.content.Context @@ -24,17 +24,17 @@ import androidx.core.content.ContextCompat import androidx.window.layout.WindowMetricsCalculator import kotlin.math.max import kotlin.math.min -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.features.input.model.NativeAnalog -import org.suyu.suyu_emu.features.input.model.NativeButton -import org.suyu.suyu_emu.features.input.model.NpadStyleIndex -import org.suyu.suyu_emu.features.settings.model.BooleanSetting -import org.suyu.suyu_emu.features.settings.model.IntSetting -import org.suyu.suyu_emu.overlay.model.OverlayControl -import org.suyu.suyu_emu.overlay.model.OverlayControlData -import org.suyu.suyu_emu.overlay.model.OverlayLayout -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.features.input.model.NativeAnalog +import dev.suyu.suyu_emu.features.input.model.NativeButton +import dev.suyu.suyu_emu.features.input.model.NpadStyleIndex +import dev.suyu.suyu_emu.features.settings.model.BooleanSetting +import dev.suyu.suyu_emu.features.settings.model.IntSetting +import dev.suyu.suyu_emu.overlay.model.OverlayControl +import dev.suyu.suyu_emu.overlay.model.OverlayControlData +import dev.suyu.suyu_emu.overlay.model.OverlayLayout +import dev.suyu.suyu_emu.utils.NativeConfig /** * Draws the interactive input overlay on top of the diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt similarity index 95% rename from src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt index 0ba7205e58..3d94061bb5 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.overlay +package dev.suyu.suyu_emu.overlay import android.content.res.Resources import android.graphics.Bitmap @@ -9,9 +9,9 @@ import android.graphics.Canvas import android.graphics.Rect import android.graphics.drawable.BitmapDrawable import android.view.MotionEvent -import org.suyu.suyu_emu.features.input.NativeInput.ButtonState -import org.suyu.suyu_emu.features.input.model.NativeButton -import org.suyu.suyu_emu.overlay.model.OverlayControlData +import dev.suyu.suyu_emu.features.input.NativeInput.ButtonState +import dev.suyu.suyu_emu.features.input.model.NativeButton +import dev.suyu.suyu_emu.overlay.model.OverlayControlData /** * Custom [BitmapDrawable] that is capable diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt index 6f24f5c1da..35d1f70f5e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.overlay +package dev.suyu.suyu_emu.overlay import android.content.res.Resources import android.graphics.Bitmap @@ -9,8 +9,8 @@ import android.graphics.Canvas import android.graphics.Rect import android.graphics.drawable.BitmapDrawable import android.view.MotionEvent -import org.suyu.suyu_emu.features.input.NativeInput.ButtonState -import org.suyu.suyu_emu.features.input.model.NativeButton +import dev.suyu.suyu_emu.features.input.NativeInput.ButtonState +import dev.suyu.suyu_emu.features.input.model.NativeButton /** * Custom [BitmapDrawable] that is capable diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt index e6f8b5d21a..8afa134ae4 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.overlay +package dev.suyu.suyu_emu.overlay import android.content.res.Resources import android.graphics.Bitmap @@ -13,10 +13,10 @@ import kotlin.math.atan2 import kotlin.math.cos import kotlin.math.sin import kotlin.math.sqrt -import org.suyu.suyu_emu.features.input.NativeInput.ButtonState -import org.suyu.suyu_emu.features.input.model.NativeAnalog -import org.suyu.suyu_emu.features.input.model.NativeButton -import org.suyu.suyu_emu.features.settings.model.BooleanSetting +import dev.suyu.suyu_emu.features.input.NativeInput.ButtonState +import dev.suyu.suyu_emu.features.input.model.NativeAnalog +import dev.suyu.suyu_emu.features.input.model.NativeButton +import dev.suyu.suyu_emu.features.settings.model.BooleanSetting /** * Custom [BitmapDrawable] that is capable diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControl.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayControl.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControl.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayControl.kt index 605f63ff79..a9e32675e8 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControl.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayControl.kt @@ -1,11 +1,11 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.overlay.model +package dev.suyu.suyu_emu.overlay.model import androidx.annotation.IntegerRes -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication enum class OverlayControl( val id: String, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlData.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayControlData.kt similarity index 93% rename from src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlData.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayControlData.kt index 7559bcfe2d..2a4267da2e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlData.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayControlData.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.overlay.model +package dev.suyu.suyu_emu.overlay.model data class OverlayControlData( val id: String, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt similarity index 90% rename from src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt index 0df2e4ff8b..74ca6edec4 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.overlay.model +package dev.suyu.suyu_emu.overlay.model import androidx.annotation.IntegerRes diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayLayout.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayLayout.kt similarity index 84% rename from src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayLayout.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayLayout.kt index 1eb0105352..f8595593d9 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayLayout.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayLayout.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.overlay.model +package dev.suyu.suyu_emu.overlay.model enum class OverlayLayout(val id: String) { Landscape("Landscape"), diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/GamesFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/ui/GamesFragment.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/ui/GamesFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/ui/GamesFragment.kt index b37aa23850..39b1ef8b77 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/GamesFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/ui/GamesFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.ui +package dev.suyu.suyu_emu.ui import android.os.Bundle import android.view.LayoutInflater @@ -14,15 +14,15 @@ import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import com.google.android.material.color.MaterialColors -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.adapters.GameAdapter -import org.suyu.suyu_emu.databinding.FragmentGamesBinding -import org.suyu.suyu_emu.layout.AutofitGridLayoutManager -import org.suyu.suyu_emu.model.GamesViewModel -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.adapters.GameAdapter +import dev.suyu.suyu_emu.databinding.FragmentGamesBinding +import dev.suyu.suyu_emu.layout.AutofitGridLayoutManager +import dev.suyu.suyu_emu.model.GamesViewModel +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.utils.collect class GamesFragment : Fragment() { private var _binding: FragmentGamesBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/ui/main/MainActivity.kt similarity index 96% rename from src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/MainActivity.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/ui/main/MainActivity.kt index ea5ba39a32..c994a3510d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/ui/main/MainActivity.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.ui.main +package dev.suyu.suyu_emu.ui.main import android.content.Intent import android.net.Uri @@ -27,23 +27,23 @@ import com.google.android.material.color.MaterialColors import com.google.android.material.navigation.NavigationBarView import java.io.File import java.io.FilenameFilter -import org.suyu.suyu_emu.HomeNavigationDirections -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.ActivityMainBinding -import org.suyu.suyu_emu.features.settings.model.Settings -import org.suyu.suyu_emu.fragments.AddGameFolderDialogFragment -import org.suyu.suyu_emu.fragments.ProgressDialogFragment -import org.suyu.suyu_emu.fragments.MessageDialogFragment -import org.suyu.suyu_emu.model.AddonViewModel -import org.suyu.suyu_emu.model.DriverViewModel -import org.suyu.suyu_emu.model.GamesViewModel -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.model.InstallResult -import org.suyu.suyu_emu.model.TaskState -import org.suyu.suyu_emu.model.TaskViewModel -import org.suyu.suyu_emu.utils.* -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.HomeNavigationDirections +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.ActivityMainBinding +import dev.suyu.suyu_emu.features.settings.model.Settings +import dev.suyu.suyu_emu.fragments.AddGameFolderDialogFragment +import dev.suyu.suyu_emu.fragments.ProgressDialogFragment +import dev.suyu.suyu_emu.fragments.MessageDialogFragment +import dev.suyu.suyu_emu.model.AddonViewModel +import dev.suyu.suyu_emu.model.DriverViewModel +import dev.suyu.suyu_emu.model.GamesViewModel +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.model.InstallResult +import dev.suyu.suyu_emu.model.TaskState +import dev.suyu.suyu_emu.model.TaskViewModel +import dev.suyu.suyu_emu.utils.* +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible import java.io.BufferedInputStream import java.io.BufferedOutputStream import java.util.zip.ZipEntry diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/ThemeProvider.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/ui/main/ThemeProvider.kt similarity index 88% rename from src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/ThemeProvider.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/ui/main/ThemeProvider.kt index 3ba6c5cd16..c9c7f87636 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/ThemeProvider.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/ui/main/ThemeProvider.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.ui.main +package dev.suyu.suyu_emu.ui.main interface ThemeProvider { /** diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/AddonUtil.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/AddonUtil.kt similarity index 85% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/AddonUtil.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/AddonUtil.kt index adc4228bc0..c1d93ba585 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/AddonUtil.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/AddonUtil.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils object AddonUtil { val validAddonDirectories = listOf("cheats", "exefs", "romfs") diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DirectoryInitialization.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/DirectoryInitialization.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/DirectoryInitialization.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/DirectoryInitialization.kt index 451757fea3..dd0257a0e5 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DirectoryInitialization.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/DirectoryInitialization.kt @@ -1,19 +1,19 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import androidx.preference.PreferenceManager import java.io.IOException -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.features.settings.model.BooleanSetting -import org.suyu.suyu_emu.features.settings.model.IntSetting -import org.suyu.suyu_emu.features.settings.model.Settings -import org.suyu.suyu_emu.overlay.model.OverlayControlData -import org.suyu.suyu_emu.overlay.model.OverlayControl -import org.suyu.suyu_emu.overlay.model.OverlayLayout -import org.suyu.suyu_emu.utils.PreferenceUtil.migratePreference +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.features.settings.model.BooleanSetting +import dev.suyu.suyu_emu.features.settings.model.IntSetting +import dev.suyu.suyu_emu.features.settings.model.Settings +import dev.suyu.suyu_emu.overlay.model.OverlayControlData +import dev.suyu.suyu_emu.overlay.model.OverlayControl +import dev.suyu.suyu_emu.overlay.model.OverlayLayout +import dev.suyu.suyu_emu.utils.PreferenceUtil.migratePreference object DirectoryInitialization { private var userPath: String? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DocumentsTree.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/DocumentsTree.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/DocumentsTree.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/DocumentsTree.kt index 8269cbc238..fab217f538 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DocumentsTree.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/DocumentsTree.kt @@ -1,13 +1,13 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.net.Uri import androidx.documentfile.provider.DocumentFile import java.io.File import java.util.* -import org.suyu.suyu_emu.model.MinimalDocumentFile +import dev.suyu.suyu_emu.model.MinimalDocumentFile class DocumentsTree { private var root: DocumentsNode? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/FileUtil.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/FileUtil.kt similarity index 99% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/FileUtil.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/FileUtil.kt index 61a40992a8..8f10ab6711 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/FileUtil.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/FileUtil.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.database.Cursor import android.net.Uri @@ -14,9 +14,9 @@ import java.io.InputStream import java.net.URLDecoder import java.util.zip.ZipEntry import java.util.zip.ZipInputStream -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.model.MinimalDocumentFile -import org.suyu.suyu_emu.model.TaskState +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.model.MinimalDocumentFile +import dev.suyu.suyu_emu.model.TaskState import java.io.BufferedOutputStream import java.io.OutputStream import java.lang.NullPointerException diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameHelper.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GameHelper.kt similarity index 95% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameHelper.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GameHelper.kt index 4800c5cb4e..a413a44cd8 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameHelper.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GameHelper.kt @@ -1,18 +1,18 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.content.SharedPreferences import android.net.Uri import androidx.preference.PreferenceManager import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.model.Game -import org.suyu.suyu_emu.model.GameDir -import org.suyu.suyu_emu.model.MinimalDocumentFile +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.model.Game +import dev.suyu.suyu_emu.model.GameDir +import dev.suyu.suyu_emu.model.MinimalDocumentFile object GameHelper { private const val KEY_OLD_GAME_PATH = "game_path" diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameIconUtils.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GameIconUtils.kt similarity index 96% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameIconUtils.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GameIconUtils.kt index 692030c218..f941e9eb60 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameIconUtils.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GameIconUtils.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.graphics.Bitmap import android.graphics.BitmapFactory @@ -21,9 +21,9 @@ import coil.key.Keyer import coil.memory.MemoryCache import coil.request.ImageRequest import coil.request.Options -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.model.Game +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.model.Game class GameIconFetcher( private val game: Game, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameMetadata.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GameMetadata.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameMetadata.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GameMetadata.kt index d8f278e902..9847f81cc1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameMetadata.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GameMetadata.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils object GameMetadata { external fun getIsValid(path: String): Boolean diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverHelper.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GpuDriverHelper.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverHelper.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GpuDriverHelper.kt index 28486d32de..2d7bc81553 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverHelper.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GpuDriverHelper.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.graphics.SurfaceTexture import android.net.Uri @@ -9,9 +9,9 @@ import android.os.Build import android.view.Surface import java.io.File import java.io.IOException -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.features.settings.model.StringSetting +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.features.settings.model.StringSetting import java.io.FileNotFoundException import java.util.zip.ZipException import java.util.zip.ZipFile diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverMetadata.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GpuDriverMetadata.kt similarity index 99% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverMetadata.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GpuDriverMetadata.kt index c12e49d2cd..5b992ef1ce 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverMetadata.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GpuDriverMetadata.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import java.io.IOException import org.json.JSONException diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InputHandler.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/InputHandler.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/InputHandler.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/InputHandler.kt index 90afcea9aa..394f6b8e24 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InputHandler.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/InputHandler.kt @@ -1,14 +1,14 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.view.InputDevice import android.view.KeyEvent import android.view.MotionEvent -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.input.SuyuInputOverlayDevice -import org.suyu.suyu_emu.features.input.SuyuPhysicalDevice +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.SuyuInputOverlayDevice +import dev.suyu.suyu_emu.features.input.SuyuPhysicalDevice object InputHandler { var androidControllers = mapOf() diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InsetsHelper.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/InsetsHelper.kt similarity index 95% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/InsetsHelper.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/InsetsHelper.kt index d5621f42cc..e2eb325742 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InsetsHelper.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/InsetsHelper.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.annotation.SuppressLint import android.content.Context diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/LifecycleUtils.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/LifecycleUtils.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/LifecycleUtils.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/LifecycleUtils.kt index e1b73c11d6..4cb1910f67 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/LifecycleUtils.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/LifecycleUtils.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/Log.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/Log.kt similarity index 96% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/Log.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/Log.kt index 794f03629d..703f17361e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/Log.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/Log.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.os.Build diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/MemoryUtil.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/MemoryUtil.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/MemoryUtil.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/MemoryUtil.kt index 3617b0dc54..abc08c7d4e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/MemoryUtil.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/MemoryUtil.kt @@ -1,13 +1,13 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.app.ActivityManager import android.content.Context import android.os.Build -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication import java.util.Locale import kotlin.math.ceil diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NativeConfig.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/NativeConfig.kt similarity index 96% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/NativeConfig.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/NativeConfig.kt index 248b02515c..fac09e9e16 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NativeConfig.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/NativeConfig.kt @@ -1,12 +1,12 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils -import org.suyu.suyu_emu.model.GameDir -import org.suyu.suyu_emu.overlay.model.OverlayControlData +import dev.suyu.suyu_emu.model.GameDir +import dev.suyu.suyu_emu.overlay.model.OverlayControlData -import org.suyu.suyu_emu.features.input.model.PlayerInput +import dev.suyu.suyu_emu.features.input.model.PlayerInput object NativeConfig { /** diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NfcReader.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/NfcReader.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/NfcReader.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/NfcReader.kt index 2a8045202c..b32f246498 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NfcReader.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/NfcReader.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.app.Activity import android.app.PendingIntent @@ -14,7 +14,7 @@ import android.os.Build import android.os.Handler import android.os.Looper import java.io.IOException -import org.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.NativeInput class NfcReader(private val activity: Activity) { private var nfcAdapter: NfcAdapter? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ParamPackage.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/ParamPackage.kt similarity index 99% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/ParamPackage.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/ParamPackage.kt index 98a906c8e3..30ff051910 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ParamPackage.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/ParamPackage.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils // Kotlin version of src/common/param_package.h class ParamPackage(serialized: String = "") { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/PreferenceUtil.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/PreferenceUtil.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/PreferenceUtil.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/PreferenceUtil.kt index ad8fd59211..1c16b3b401 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/PreferenceUtil.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/PreferenceUtil.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.content.SharedPreferences diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/SerializableHelper.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/SerializableHelper.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/SerializableHelper.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/SerializableHelper.kt index 71438c2866..d75a47beea 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/SerializableHelper.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/SerializableHelper.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.content.Intent import android.os.Build diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ThemeHelper.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/ThemeHelper.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/ThemeHelper.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/ThemeHelper.kt index 2c0b3ea2ed..eaff5893c5 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ThemeHelper.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/ThemeHelper.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.content.res.Configuration import android.graphics.Color @@ -12,10 +12,10 @@ import androidx.appcompat.app.AppCompatDelegate import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsControllerCompat import kotlin.math.roundToInt -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.features.settings.model.BooleanSetting -import org.suyu.suyu_emu.features.settings.model.IntSetting -import org.suyu.suyu_emu.ui.main.ThemeProvider +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.features.settings.model.BooleanSetting +import dev.suyu.suyu_emu.features.settings.model.IntSetting +import dev.suyu.suyu_emu.ui.main.ThemeProvider object ThemeHelper { const val SYSTEM_BAR_ALPHA = 0.9f diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ViewUtils.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/ViewUtils.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/ViewUtils.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/ViewUtils.kt index b81e146673..94bf0d890f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ViewUtils.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/ViewUtils.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.text.TextUtils import android.view.View diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/viewholder/AbstractViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/viewholder/AbstractViewHolder.kt similarity index 80% rename from src/android/app/src/main/java/org/suyu/suyu_emu/viewholder/AbstractViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/viewholder/AbstractViewHolder.kt index ee149eae7d..c1991d609a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/viewholder/AbstractViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/viewholder/AbstractViewHolder.kt @@ -2,12 +2,12 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.viewholder +package dev.suyu.suyu_emu.viewholder import androidx.recyclerview.widget.RecyclerView import androidx.viewbinding.ViewBinding -import org.suyu.suyu_emu.adapters.AbstractDiffAdapter -import org.suyu.suyu_emu.adapters.AbstractListAdapter +import dev.suyu.suyu_emu.adapters.AbstractDiffAdapter +import dev.suyu.suyu_emu.adapters.AbstractListAdapter /** * [RecyclerView.ViewHolder] meant to work together with a [AbstractDiffAdapter] or a diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/views/FixedRatioSurfaceView.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/views/FixedRatioSurfaceView.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/views/FixedRatioSurfaceView.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/views/FixedRatioSurfaceView.kt index 7d4708ce12..181ddca032 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/views/FixedRatioSurfaceView.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/views/FixedRatioSurfaceView.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.views +package dev.suyu.suyu_emu.views import android.content.Context import android.util.AttributeSet diff --git a/src/android/app/src/main/jni/game_metadata.cpp b/src/android/app/src/main/jni/game_metadata.cpp index 489f862978..52d29ce3ff 100644 --- a/src/android/app/src/main/jni/game_metadata.cpp +++ b/src/android/app/src/main/jni/game_metadata.cpp @@ -75,7 +75,7 @@ RomMetadata GetRomMetadata(const std::string& path, bool reload = false) { extern "C" { -jboolean Java_org_suyu_suyu_1emu_utils_GameMetadata_getIsValid(JNIEnv* env, jobject obj, +jboolean Java_dev_suyu_suyu_1emu_utils_GameMetadata_getIsValid(JNIEnv* env, jobject obj, jstring jpath) { const auto file = EmulationSession::GetInstance().System().GetFilesystem()->OpenFile( Common::Android::GetJString(env, jpath), FileSys::OpenMode::Read); @@ -101,31 +101,31 @@ jboolean Java_org_suyu_suyu_1emu_utils_GameMetadata_getIsValid(JNIEnv* env, jobj return true; } -jstring Java_org_suyu_suyu_1emu_utils_GameMetadata_getTitle(JNIEnv* env, jobject obj, +jstring Java_dev_suyu_suyu_1emu_utils_GameMetadata_getTitle(JNIEnv* env, jobject obj, jstring jpath) { return Common::Android::ToJString( env, GetRomMetadata(Common::Android::GetJString(env, jpath)).title); } -jstring Java_org_suyu_suyu_1emu_utils_GameMetadata_getProgramId(JNIEnv* env, jobject obj, +jstring Java_dev_suyu_suyu_1emu_utils_GameMetadata_getProgramId(JNIEnv* env, jobject obj, jstring jpath) { return Common::Android::ToJString( env, std::to_string(GetRomMetadata(Common::Android::GetJString(env, jpath)).programId)); } -jstring Java_org_suyu_suyu_1emu_utils_GameMetadata_getDeveloper(JNIEnv* env, jobject obj, +jstring Java_dev_suyu_suyu_1emu_utils_GameMetadata_getDeveloper(JNIEnv* env, jobject obj, jstring jpath) { return Common::Android::ToJString( env, GetRomMetadata(Common::Android::GetJString(env, jpath)).developer); } -jstring Java_org_suyu_suyu_1emu_utils_GameMetadata_getVersion(JNIEnv* env, jobject obj, +jstring Java_dev_suyu_suyu_1emu_utils_GameMetadata_getVersion(JNIEnv* env, jobject obj, jstring jpath, jboolean jreload) { return Common::Android::ToJString( env, GetRomMetadata(Common::Android::GetJString(env, jpath), jreload).version); } -jbyteArray Java_org_suyu_suyu_1emu_utils_GameMetadata_getIcon(JNIEnv* env, jobject obj, +jbyteArray Java_dev_suyu_suyu_1emu_utils_GameMetadata_getIcon(JNIEnv* env, jobject obj, jstring jpath) { auto icon_data = GetRomMetadata(Common::Android::GetJString(env, jpath)).icon; jbyteArray icon = env->NewByteArray(static_cast(icon_data.size())); @@ -134,13 +134,13 @@ jbyteArray Java_org_suyu_suyu_1emu_utils_GameMetadata_getIcon(JNIEnv* env, jobje return icon; } -jboolean Java_org_suyu_suyu_1emu_utils_GameMetadata_getIsHomebrew(JNIEnv* env, jobject obj, +jboolean Java_dev_suyu_suyu_1emu_utils_GameMetadata_getIsHomebrew(JNIEnv* env, jobject obj, jstring jpath) { return static_cast( GetRomMetadata(Common::Android::GetJString(env, jpath)).isHomebrew); } -void Java_org_suyu_suyu_1emu_utils_GameMetadata_resetMetadata(JNIEnv* env, jobject obj) { +void Java_dev_suyu_suyu_1emu_utils_GameMetadata_resetMetadata(JNIEnv* env, jobject obj) { m_rom_metadata_cache.clear(); } diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index 35ca93a78d..be8e36dbe3 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -435,24 +435,24 @@ static Core::SystemResultStatus RunEmulation(const std::string& filepath, extern "C" { -void Java_org_suyu_suyu_1emu_NativeLibrary_surfaceChanged(JNIEnv* env, jobject instance, +void Java_dev_suyu_suyu_1emu_NativeLibrary_surfaceChanged(JNIEnv* env, jobject instance, [[maybe_unused]] jobject surf) { EmulationSession::GetInstance().SetNativeWindow(ANativeWindow_fromSurface(env, surf)); EmulationSession::GetInstance().SurfaceChanged(); } -void Java_org_suyu_suyu_1emu_NativeLibrary_surfaceDestroyed(JNIEnv* env, jobject instance) { +void Java_dev_suyu_suyu_1emu_NativeLibrary_surfaceDestroyed(JNIEnv* env, jobject instance) { ANativeWindow_release(EmulationSession::GetInstance().NativeWindow()); EmulationSession::GetInstance().SetNativeWindow(nullptr); EmulationSession::GetInstance().SurfaceChanged(); } -void Java_org_suyu_suyu_1emu_NativeLibrary_setAppDirectory(JNIEnv* env, jobject instance, +void Java_dev_suyu_suyu_1emu_NativeLibrary_setAppDirectory(JNIEnv* env, jobject instance, [[maybe_unused]] jstring j_directory) { Common::FS::SetAppDirectory(Common::Android::GetJString(env, j_directory)); } -int Java_org_suyu_suyu_1emu_NativeLibrary_installFileToNand(JNIEnv* env, jobject instance, +int Java_dev_suyu_suyu_1emu_NativeLibrary_installFileToNand(JNIEnv* env, jobject instance, jstring j_file, jobject jcallback) { auto jlambdaClass = env->GetObjectClass(jcallback); auto jlambdaInvokeMethod = env->GetMethodID( @@ -470,7 +470,7 @@ int Java_org_suyu_suyu_1emu_NativeLibrary_installFileToNand(JNIEnv* env, jobject Common::Android::GetJString(env, j_file), callback)); } -jboolean Java_org_suyu_suyu_1emu_NativeLibrary_doesUpdateMatchProgram(JNIEnv* env, jobject jobj, +jboolean Java_dev_suyu_suyu_1emu_NativeLibrary_doesUpdateMatchProgram(JNIEnv* env, jobject jobj, jstring jprogramId, jstring jupdatePath) { u64 program_id = EmulationSession::GetProgramId(env, jprogramId); @@ -491,7 +491,7 @@ jboolean Java_org_suyu_suyu_1emu_NativeLibrary_doesUpdateMatchProgram(JNIEnv* en return false; } -void JNICALL Java_org_suyu_suyu_1emu_NativeLibrary_initializeGpuDriver(JNIEnv* env, jclass clazz, +void JNICALL Java_dev_suyu_suyu_1emu_NativeLibrary_initializeGpuDriver(JNIEnv* env, jclass clazz, jstring hook_lib_dir, jstring custom_driver_dir, jstring custom_driver_name, @@ -513,7 +513,7 @@ void JNICALL Java_org_suyu_suyu_1emu_NativeLibrary_initializeGpuDriver(JNIEnv* e return android_get_device_api_level() >= 28 && CheckKgslPresent(); } -jboolean JNICALL Java_org_suyu_suyu_1emu_utils_GpuDriverHelper_supportsCustomDriverLoading( +jboolean JNICALL Java_dev_suyu_suyu_1emu_utils_GpuDriverHelper_supportsCustomDriverLoading( JNIEnv* env, jobject instance) { #ifdef ARCHITECTURE_arm64 // If the KGSL device exists custom drivers can be loaded using adrenotools @@ -523,7 +523,7 @@ jboolean JNICALL Java_org_suyu_suyu_1emu_utils_GpuDriverHelper_supportsCustomDri #endif } -jobjectArray Java_org_suyu_suyu_1emu_utils_GpuDriverHelper_getSystemDriverInfo( +jobjectArray Java_dev_suyu_suyu_1emu_utils_GpuDriverHelper_getSystemDriverInfo( JNIEnv* env, jobject j_obj, jobject j_surf, jstring j_hook_lib_dir) { const char* file_redirect_dir_{}; int featureFlags{}; @@ -555,32 +555,32 @@ jobjectArray Java_org_suyu_suyu_1emu_utils_GpuDriverHelper_getSystemDriverInfo( return j_driver_info; } -jboolean Java_org_suyu_suyu_1emu_NativeLibrary_reloadKeys(JNIEnv* env, jclass clazz) { +jboolean Java_dev_suyu_suyu_1emu_NativeLibrary_reloadKeys(JNIEnv* env, jclass clazz) { Core::Crypto::KeyManager::Instance().ReloadKeys(); return static_cast(Core::Crypto::KeyManager::Instance().AreKeysLoaded()); } -void Java_org_suyu_suyu_1emu_NativeLibrary_unpauseEmulation(JNIEnv* env, jclass clazz) { +void Java_dev_suyu_suyu_1emu_NativeLibrary_unpauseEmulation(JNIEnv* env, jclass clazz) { EmulationSession::GetInstance().UnPauseEmulation(); } -void Java_org_suyu_suyu_1emu_NativeLibrary_pauseEmulation(JNIEnv* env, jclass clazz) { +void Java_dev_suyu_suyu_1emu_NativeLibrary_pauseEmulation(JNIEnv* env, jclass clazz) { EmulationSession::GetInstance().PauseEmulation(); } -void Java_org_suyu_suyu_1emu_NativeLibrary_stopEmulation(JNIEnv* env, jclass clazz) { +void Java_dev_suyu_suyu_1emu_NativeLibrary_stopEmulation(JNIEnv* env, jclass clazz) { EmulationSession::GetInstance().HaltEmulation(); } -jboolean Java_org_suyu_suyu_1emu_NativeLibrary_isRunning(JNIEnv* env, jclass clazz) { +jboolean Java_dev_suyu_suyu_1emu_NativeLibrary_isRunning(JNIEnv* env, jclass clazz) { return static_cast(EmulationSession::GetInstance().IsRunning()); } -jboolean Java_org_suyu_suyu_1emu_NativeLibrary_isPaused(JNIEnv* env, jclass clazz) { +jboolean Java_dev_suyu_suyu_1emu_NativeLibrary_isPaused(JNIEnv* env, jclass clazz) { return static_cast(EmulationSession::GetInstance().IsPaused()); } -void Java_org_suyu_suyu_1emu_NativeLibrary_initializeSystem(JNIEnv* env, jclass clazz, +void Java_dev_suyu_suyu_1emu_NativeLibrary_initializeSystem(JNIEnv* env, jclass clazz, jboolean reload) { // Initialize the emulated system. if (!reload) { @@ -589,7 +589,7 @@ void Java_org_suyu_suyu_1emu_NativeLibrary_initializeSystem(JNIEnv* env, jclass EmulationSession::GetInstance().InitializeSystem(reload); } -jdoubleArray Java_org_suyu_suyu_1emu_NativeLibrary_getPerfStats(JNIEnv* env, jclass clazz) { +jdoubleArray Java_dev_suyu_suyu_1emu_NativeLibrary_getPerfStats(JNIEnv* env, jclass clazz) { jdoubleArray j_stats = env->NewDoubleArray(4); if (EmulationSession::GetInstance().IsRunning()) { @@ -605,7 +605,7 @@ jdoubleArray Java_org_suyu_suyu_1emu_NativeLibrary_getPerfStats(JNIEnv* env, jcl return j_stats; } -jstring Java_org_suyu_suyu_1emu_NativeLibrary_getCpuBackend(JNIEnv* env, jclass clazz) { +jstring Java_dev_suyu_suyu_1emu_NativeLibrary_getCpuBackend(JNIEnv* env, jclass clazz) { if (Settings::IsNceEnabled()) { return Common::Android::ToJString(env, "NCE"); } @@ -613,21 +613,21 @@ jstring Java_org_suyu_suyu_1emu_NativeLibrary_getCpuBackend(JNIEnv* env, jclass return Common::Android::ToJString(env, "JIT"); } -jstring Java_org_suyu_suyu_1emu_NativeLibrary_getGpuDriver(JNIEnv* env, jobject jobj) { +jstring Java_dev_suyu_suyu_1emu_NativeLibrary_getGpuDriver(JNIEnv* env, jobject jobj) { return Common::Android::ToJString( env, EmulationSession::GetInstance().System().GPU().Renderer().GetDeviceVendor()); } -void Java_org_suyu_suyu_1emu_NativeLibrary_applySettings(JNIEnv* env, jobject jobj) { +void Java_dev_suyu_suyu_1emu_NativeLibrary_applySettings(JNIEnv* env, jobject jobj) { EmulationSession::GetInstance().System().ApplySettings(); EmulationSession::GetInstance().System().HIDCore().ReloadInputDevices(); } -void Java_org_suyu_suyu_1emu_NativeLibrary_logSettings(JNIEnv* env, jobject jobj) { +void Java_dev_suyu_suyu_1emu_NativeLibrary_logSettings(JNIEnv* env, jobject jobj) { Settings::LogSettings(); } -void Java_org_suyu_suyu_1emu_NativeLibrary_run(JNIEnv* env, jobject jobj, jstring j_path, +void Java_dev_suyu_suyu_1emu_NativeLibrary_run(JNIEnv* env, jobject jobj, jstring j_path, jint j_program_index, jboolean j_frontend_initiated) { const std::string path = Common::Android::GetJString(env, j_path); @@ -641,23 +641,23 @@ void Java_org_suyu_suyu_1emu_NativeLibrary_run(JNIEnv* env, jobject jobj, jstrin } } -void Java_org_suyu_suyu_1emu_NativeLibrary_logDeviceInfo(JNIEnv* env, jclass clazz) { +void Java_dev_suyu_suyu_1emu_NativeLibrary_logDeviceInfo(JNIEnv* env, jclass clazz) { LOG_INFO(Frontend, "suyu Version: {}-{}", Common::g_scm_branch, Common::g_scm_desc); LOG_INFO(Frontend, "Host OS: Android API level {}", android_get_device_api_level()); } -void Java_org_suyu_suyu_1emu_NativeLibrary_submitInlineKeyboardText(JNIEnv* env, jclass clazz, +void Java_dev_suyu_suyu_1emu_NativeLibrary_submitInlineKeyboardText(JNIEnv* env, jclass clazz, jstring j_text) { const std::u16string input = Common::UTF8ToUTF16(Common::Android::GetJString(env, j_text)); EmulationSession::GetInstance().SoftwareKeyboard()->SubmitInlineKeyboardText(input); } -void Java_org_suyu_suyu_1emu_NativeLibrary_submitInlineKeyboardInput(JNIEnv* env, jclass clazz, +void Java_dev_suyu_suyu_1emu_NativeLibrary_submitInlineKeyboardInput(JNIEnv* env, jclass clazz, jint j_key_code) { EmulationSession::GetInstance().SoftwareKeyboard()->SubmitInlineKeyboardInput(j_key_code); } -void Java_org_suyu_suyu_1emu_NativeLibrary_initializeEmptyUserDirectory(JNIEnv* env, +void Java_dev_suyu_suyu_1emu_NativeLibrary_initializeEmptyUserDirectory(JNIEnv* env, jobject instance) { const auto nand_dir = Common::FS::GetSuyuPath(Common::FS::SuyuPath::NANDDir); auto vfs_nand_dir = EmulationSession::GetInstance().System().GetFilesystem()->OpenDirectory( @@ -677,7 +677,7 @@ void Java_org_suyu_suyu_1emu_NativeLibrary_initializeEmptyUserDirectory(JNIEnv* } } -jstring Java_org_suyu_suyu_1emu_NativeLibrary_getAppletLaunchPath(JNIEnv* env, jclass clazz, +jstring Java_dev_suyu_suyu_1emu_NativeLibrary_getAppletLaunchPath(JNIEnv* env, jclass clazz, jlong jid) { auto bis_system = EmulationSession::GetInstance().System().GetFileSystemController().GetSystemNANDContents(); @@ -694,18 +694,18 @@ jstring Java_org_suyu_suyu_1emu_NativeLibrary_getAppletLaunchPath(JNIEnv* env, j return Common::Android::ToJString(env, applet_nca->GetFullPath()); } -void Java_org_suyu_suyu_1emu_NativeLibrary_setCurrentAppletId(JNIEnv* env, jclass clazz, +void Java_dev_suyu_suyu_1emu_NativeLibrary_setCurrentAppletId(JNIEnv* env, jclass clazz, jint jappletId) { EmulationSession::GetInstance().SetAppletId(jappletId); } -void Java_org_suyu_suyu_1emu_NativeLibrary_setCabinetMode(JNIEnv* env, jclass clazz, +void Java_dev_suyu_suyu_1emu_NativeLibrary_setCabinetMode(JNIEnv* env, jclass clazz, jint jcabinetMode) { EmulationSession::GetInstance().System().GetFrontendAppletHolder().SetCabinetMode( static_cast(jcabinetMode)); } -jboolean Java_org_suyu_suyu_1emu_NativeLibrary_isFirmwareAvailable(JNIEnv* env, jclass clazz) { +jboolean Java_dev_suyu_suyu_1emu_NativeLibrary_isFirmwareAvailable(JNIEnv* env, jclass clazz) { auto bis_system = EmulationSession::GetInstance().System().GetFileSystemController().GetSystemNANDContents(); if (!bis_system) { @@ -721,7 +721,7 @@ jboolean Java_org_suyu_suyu_1emu_NativeLibrary_isFirmwareAvailable(JNIEnv* env, return true; } -jobjectArray Java_org_suyu_suyu_1emu_NativeLibrary_getPatchesForFile(JNIEnv* env, jobject jobj, +jobjectArray Java_dev_suyu_suyu_1emu_NativeLibrary_getPatchesForFile(JNIEnv* env, jobject jobj, jstring jpath, jstring jprogramId) { const auto path = Common::Android::GetJString(env, jpath); @@ -757,27 +757,27 @@ jobjectArray Java_org_suyu_suyu_1emu_NativeLibrary_getPatchesForFile(JNIEnv* env return jpatchArray; } -void Java_org_suyu_suyu_1emu_NativeLibrary_removeUpdate(JNIEnv* env, jobject jobj, +void Java_dev_suyu_suyu_1emu_NativeLibrary_removeUpdate(JNIEnv* env, jobject jobj, jstring jprogramId) { auto program_id = EmulationSession::GetProgramId(env, jprogramId); ContentManager::RemoveUpdate(EmulationSession::GetInstance().System().GetFileSystemController(), program_id); } -void Java_org_suyu_suyu_1emu_NativeLibrary_removeDLC(JNIEnv* env, jobject jobj, +void Java_dev_suyu_suyu_1emu_NativeLibrary_removeDLC(JNIEnv* env, jobject jobj, jstring jprogramId) { auto program_id = EmulationSession::GetProgramId(env, jprogramId); ContentManager::RemoveAllDLC(EmulationSession::GetInstance().System(), program_id); } -void Java_org_suyu_suyu_1emu_NativeLibrary_removeMod(JNIEnv* env, jobject jobj, jstring jprogramId, +void Java_dev_suyu_suyu_1emu_NativeLibrary_removeMod(JNIEnv* env, jobject jobj, jstring jprogramId, jstring jname) { auto program_id = EmulationSession::GetProgramId(env, jprogramId); ContentManager::RemoveMod(EmulationSession::GetInstance().System().GetFileSystemController(), program_id, Common::Android::GetJString(env, jname)); } -jobjectArray Java_org_suyu_suyu_1emu_NativeLibrary_verifyInstalledContents(JNIEnv* env, +jobjectArray Java_dev_suyu_suyu_1emu_NativeLibrary_verifyInstalledContents(JNIEnv* env, jobject jobj, jobject jcallback) { auto jlambdaClass = env->GetObjectClass(jcallback); @@ -801,7 +801,7 @@ jobjectArray Java_org_suyu_suyu_1emu_NativeLibrary_verifyInstalledContents(JNIEn return jresult; } -jint Java_org_suyu_suyu_1emu_NativeLibrary_verifyGameContents(JNIEnv* env, jobject jobj, +jint Java_dev_suyu_suyu_1emu_NativeLibrary_verifyGameContents(JNIEnv* env, jobject jobj, jstring jpath, jobject jcallback) { auto jlambdaClass = env->GetObjectClass(jcallback); auto jlambdaInvokeMethod = env->GetMethodID( @@ -817,7 +817,7 @@ jint Java_org_suyu_suyu_1emu_NativeLibrary_verifyGameContents(JNIEnv* env, jobje session.System(), Common::Android::GetJString(env, jpath), callback)); } -jstring Java_org_suyu_suyu_1emu_NativeLibrary_getSavePath(JNIEnv* env, jobject jobj, +jstring Java_dev_suyu_suyu_1emu_NativeLibrary_getSavePath(JNIEnv* env, jobject jobj, jstring jprogramId) { auto program_id = EmulationSession::GetProgramId(env, jprogramId); if (program_id == 0) { @@ -841,7 +841,7 @@ jstring Java_org_suyu_suyu_1emu_NativeLibrary_getSavePath(JNIEnv* env, jobject j return Common::Android::ToJString(env, user_save_data_path); } -jstring Java_org_suyu_suyu_1emu_NativeLibrary_getDefaultProfileSaveDataRoot(JNIEnv* env, +jstring Java_dev_suyu_suyu_1emu_NativeLibrary_getDefaultProfileSaveDataRoot(JNIEnv* env, jobject jobj, jboolean jfuture) { Service::Account::ProfileManager manager; @@ -854,17 +854,17 @@ jstring Java_org_suyu_suyu_1emu_NativeLibrary_getDefaultProfileSaveDataRoot(JNIE return Common::Android::ToJString(env, user_save_data_root); } -void Java_org_suyu_suyu_1emu_NativeLibrary_addFileToFilesystemProvider(JNIEnv* env, jobject jobj, +void Java_dev_suyu_suyu_1emu_NativeLibrary_addFileToFilesystemProvider(JNIEnv* env, jobject jobj, jstring jpath) { EmulationSession::GetInstance().ConfigureFilesystemProvider( Common::Android::GetJString(env, jpath)); } -void Java_org_suyu_suyu_1emu_NativeLibrary_clearFilesystemProvider(JNIEnv* env, jobject jobj) { +void Java_dev_suyu_suyu_1emu_NativeLibrary_clearFilesystemProvider(JNIEnv* env, jobject jobj) { EmulationSession::GetInstance().GetContentProvider()->ClearAllEntries(); } -jboolean Java_org_suyu_suyu_1emu_NativeLibrary_areKeysPresent(JNIEnv* env, jobject jobj) { +jboolean Java_dev_suyu_suyu_1emu_NativeLibrary_areKeysPresent(JNIEnv* env, jobject jobj) { auto& system = EmulationSession::GetInstance().System(); system.GetFileSystemController().CreateFactories(*system.GetFilesystem()); return ContentManager::AreKeysPresent(); diff --git a/src/android/app/src/main/jni/native_config.cpp b/src/android/app/src/main/jni/native_config.cpp index 88282657f1..cad322297b 100644 --- a/src/android/app/src/main/jni/native_config.cpp +++ b/src/android/app/src/main/jni/native_config.cpp @@ -34,23 +34,23 @@ Settings::Setting* getSetting(JNIEnv* env, jstring jkey) { extern "C" { -void Java_org_suyu_suyu_1emu_utils_NativeConfig_initializeGlobalConfig(JNIEnv* env, jobject obj) { +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_initializeGlobalConfig(JNIEnv* env, jobject obj) { global_config = std::make_unique(); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_unloadGlobalConfig(JNIEnv* env, jobject obj) { +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_unloadGlobalConfig(JNIEnv* env, jobject obj) { global_config.reset(); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_reloadGlobalConfig(JNIEnv* env, jobject obj) { +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_reloadGlobalConfig(JNIEnv* env, jobject obj) { global_config->AndroidConfig::ReloadAllValues(); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_saveGlobalConfig(JNIEnv* env, jobject obj) { +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_saveGlobalConfig(JNIEnv* env, jobject obj) { global_config->AndroidConfig::SaveAllValues(); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_initializePerGameConfig(JNIEnv* env, jobject obj, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_initializePerGameConfig(JNIEnv* env, jobject obj, jstring jprogramId, jstring jfileName) { auto program_id = EmulationSession::GetProgramId(env, jprogramId); @@ -60,20 +60,20 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_initializePerGameConfig(JNIEnv* std::make_unique(config_file_name, Config::ConfigType::PerGameConfig); } -jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_isPerGameConfigLoaded(JNIEnv* env, +jboolean Java_dev_suyu_suyu_1emu_utils_NativeConfig_isPerGameConfigLoaded(JNIEnv* env, jobject obj) { return per_game_config != nullptr; } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_savePerGameConfig(JNIEnv* env, jobject obj) { +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_savePerGameConfig(JNIEnv* env, jobject obj) { per_game_config->AndroidConfig::SaveAllValues(); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_unloadPerGameConfig(JNIEnv* env, jobject obj) { +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_unloadPerGameConfig(JNIEnv* env, jobject obj) { per_game_config.reset(); } -jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_getBoolean(JNIEnv* env, jobject obj, +jboolean Java_dev_suyu_suyu_1emu_utils_NativeConfig_getBoolean(JNIEnv* env, jobject obj, jstring jkey, jboolean needGlobal) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -82,7 +82,7 @@ jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_getBoolean(JNIEnv* env, jobj return setting->GetValue(static_cast(needGlobal)); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setBoolean(JNIEnv* env, jobject obj, jstring jkey, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setBoolean(JNIEnv* env, jobject obj, jstring jkey, jboolean value) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -91,7 +91,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setBoolean(JNIEnv* env, jobject setting->SetValue(static_cast(value)); } -jbyte Java_org_suyu_suyu_1emu_utils_NativeConfig_getByte(JNIEnv* env, jobject obj, jstring jkey, +jbyte Java_dev_suyu_suyu_1emu_utils_NativeConfig_getByte(JNIEnv* env, jobject obj, jstring jkey, jboolean needGlobal) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -100,7 +100,7 @@ jbyte Java_org_suyu_suyu_1emu_utils_NativeConfig_getByte(JNIEnv* env, jobject ob return setting->GetValue(static_cast(needGlobal)); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setByte(JNIEnv* env, jobject obj, jstring jkey, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setByte(JNIEnv* env, jobject obj, jstring jkey, jbyte value) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -109,7 +109,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setByte(JNIEnv* env, jobject obj setting->SetValue(value); } -jshort Java_org_suyu_suyu_1emu_utils_NativeConfig_getShort(JNIEnv* env, jobject obj, jstring jkey, +jshort Java_dev_suyu_suyu_1emu_utils_NativeConfig_getShort(JNIEnv* env, jobject obj, jstring jkey, jboolean needGlobal) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -118,7 +118,7 @@ jshort Java_org_suyu_suyu_1emu_utils_NativeConfig_getShort(JNIEnv* env, jobject return setting->GetValue(static_cast(needGlobal)); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setShort(JNIEnv* env, jobject obj, jstring jkey, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setShort(JNIEnv* env, jobject obj, jstring jkey, jshort value) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -127,7 +127,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setShort(JNIEnv* env, jobject ob setting->SetValue(value); } -jint Java_org_suyu_suyu_1emu_utils_NativeConfig_getInt(JNIEnv* env, jobject obj, jstring jkey, +jint Java_dev_suyu_suyu_1emu_utils_NativeConfig_getInt(JNIEnv* env, jobject obj, jstring jkey, jboolean needGlobal) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -136,7 +136,7 @@ jint Java_org_suyu_suyu_1emu_utils_NativeConfig_getInt(JNIEnv* env, jobject obj, return setting->GetValue(needGlobal); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setInt(JNIEnv* env, jobject obj, jstring jkey, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setInt(JNIEnv* env, jobject obj, jstring jkey, jint value) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -145,7 +145,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setInt(JNIEnv* env, jobject obj, setting->SetValue(value); } -jfloat Java_org_suyu_suyu_1emu_utils_NativeConfig_getFloat(JNIEnv* env, jobject obj, jstring jkey, +jfloat Java_dev_suyu_suyu_1emu_utils_NativeConfig_getFloat(JNIEnv* env, jobject obj, jstring jkey, jboolean needGlobal) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -154,7 +154,7 @@ jfloat Java_org_suyu_suyu_1emu_utils_NativeConfig_getFloat(JNIEnv* env, jobject return setting->GetValue(static_cast(needGlobal)); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setFloat(JNIEnv* env, jobject obj, jstring jkey, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setFloat(JNIEnv* env, jobject obj, jstring jkey, jfloat value) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -163,7 +163,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setFloat(JNIEnv* env, jobject ob setting->SetValue(value); } -jlong Java_org_suyu_suyu_1emu_utils_NativeConfig_getLong(JNIEnv* env, jobject obj, jstring jkey, +jlong Java_dev_suyu_suyu_1emu_utils_NativeConfig_getLong(JNIEnv* env, jobject obj, jstring jkey, jboolean needGlobal) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -172,7 +172,7 @@ jlong Java_org_suyu_suyu_1emu_utils_NativeConfig_getLong(JNIEnv* env, jobject ob return setting->GetValue(static_cast(needGlobal)); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setLong(JNIEnv* env, jobject obj, jstring jkey, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setLong(JNIEnv* env, jobject obj, jstring jkey, jlong value) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -181,7 +181,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setLong(JNIEnv* env, jobject obj setting->SetValue(value); } -jstring Java_org_suyu_suyu_1emu_utils_NativeConfig_getString(JNIEnv* env, jobject obj, jstring jkey, +jstring Java_dev_suyu_suyu_1emu_utils_NativeConfig_getString(JNIEnv* env, jobject obj, jstring jkey, jboolean needGlobal) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -190,7 +190,7 @@ jstring Java_org_suyu_suyu_1emu_utils_NativeConfig_getString(JNIEnv* env, jobjec return Common::Android::ToJString(env, setting->GetValue(static_cast(needGlobal))); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setString(JNIEnv* env, jobject obj, jstring jkey, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setString(JNIEnv* env, jobject obj, jstring jkey, jstring value) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -200,7 +200,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setString(JNIEnv* env, jobject o setting->SetValue(Common::Android::GetJString(env, value)); } -jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_getIsRuntimeModifiable(JNIEnv* env, jobject obj, +jboolean Java_dev_suyu_suyu_1emu_utils_NativeConfig_getIsRuntimeModifiable(JNIEnv* env, jobject obj, jstring jkey) { auto setting = getSetting(env, jkey); if (setting != nullptr) { @@ -209,7 +209,7 @@ jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_getIsRuntimeModifiable(JNIEn return true; } -jstring Java_org_suyu_suyu_1emu_utils_NativeConfig_getPairedSettingKey(JNIEnv* env, jobject obj, +jstring Java_dev_suyu_suyu_1emu_utils_NativeConfig_getPairedSettingKey(JNIEnv* env, jobject obj, jstring jkey) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -222,7 +222,7 @@ jstring Java_org_suyu_suyu_1emu_utils_NativeConfig_getPairedSettingKey(JNIEnv* e return Common::Android::ToJString(env, setting->PairedSetting()->GetLabel()); } -jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_getIsSwitchable(JNIEnv* env, jobject obj, +jboolean Java_dev_suyu_suyu_1emu_utils_NativeConfig_getIsSwitchable(JNIEnv* env, jobject obj, jstring jkey) { auto setting = getSetting(env, jkey); if (setting != nullptr) { @@ -231,7 +231,7 @@ jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_getIsSwitchable(JNIEnv* env, return false; } -jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_usingGlobal(JNIEnv* env, jobject obj, +jboolean Java_dev_suyu_suyu_1emu_utils_NativeConfig_usingGlobal(JNIEnv* env, jobject obj, jstring jkey) { auto setting = getSetting(env, jkey); if (setting != nullptr) { @@ -240,7 +240,7 @@ jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_usingGlobal(JNIEnv* env, job return true; } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setGlobal(JNIEnv* env, jobject obj, jstring jkey, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setGlobal(JNIEnv* env, jobject obj, jstring jkey, jboolean global) { auto setting = getSetting(env, jkey); if (setting != nullptr) { @@ -248,7 +248,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setGlobal(JNIEnv* env, jobject o } } -jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_getIsSaveable(JNIEnv* env, jobject obj, +jboolean Java_dev_suyu_suyu_1emu_utils_NativeConfig_getIsSaveable(JNIEnv* env, jobject obj, jstring jkey) { auto setting = getSetting(env, jkey); if (setting != nullptr) { @@ -257,7 +257,7 @@ jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_getIsSaveable(JNIEnv* env, j return false; } -jstring Java_org_suyu_suyu_1emu_utils_NativeConfig_getDefaultToString(JNIEnv* env, jobject obj, +jstring Java_dev_suyu_suyu_1emu_utils_NativeConfig_getDefaultToString(JNIEnv* env, jobject obj, jstring jkey) { auto setting = getSetting(env, jkey); if (setting != nullptr) { @@ -266,7 +266,7 @@ jstring Java_org_suyu_suyu_1emu_utils_NativeConfig_getDefaultToString(JNIEnv* en return Common::Android::ToJString(env, ""); } -jobjectArray Java_org_suyu_suyu_1emu_utils_NativeConfig_getGameDirs(JNIEnv* env, jobject obj) { +jobjectArray Java_dev_suyu_suyu_1emu_utils_NativeConfig_getGameDirs(JNIEnv* env, jobject obj) { jclass gameDirClass = Common::Android::GetGameDirClass(); jmethodID gameDirConstructor = Common::Android::GetGameDirConstructor(); jobjectArray jgameDirArray = @@ -281,7 +281,7 @@ jobjectArray Java_org_suyu_suyu_1emu_utils_NativeConfig_getGameDirs(JNIEnv* env, return jgameDirArray; } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setGameDirs(JNIEnv* env, jobject obj, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setGameDirs(JNIEnv* env, jobject obj, jobjectArray gameDirs) { AndroidSettings::values.game_dirs.clear(); int size = env->GetArrayLength(gameDirs); @@ -304,7 +304,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setGameDirs(JNIEnv* env, jobject } } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_addGameDir(JNIEnv* env, jobject obj, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_addGameDir(JNIEnv* env, jobject obj, jobject gameDir) { jclass gameDirClass = Common::Android::GetGameDirClass(); jfieldID uriStringField = env->GetFieldID(gameDirClass, "uriString", "Ljava/lang/String;"); @@ -317,7 +317,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_addGameDir(JNIEnv* env, jobject AndroidSettings::GameDir{uriString, static_cast(jdeepScanBoolean)}); } -jobjectArray Java_org_suyu_suyu_1emu_utils_NativeConfig_getDisabledAddons(JNIEnv* env, jobject obj, +jobjectArray Java_dev_suyu_suyu_1emu_utils_NativeConfig_getDisabledAddons(JNIEnv* env, jobject obj, jstring jprogramId) { auto program_id = EmulationSession::GetProgramId(env, jprogramId); auto& disabledAddons = Settings::values.disabled_addons[program_id]; @@ -331,7 +331,7 @@ jobjectArray Java_org_suyu_suyu_1emu_utils_NativeConfig_getDisabledAddons(JNIEnv return jdisabledAddonsArray; } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setDisabledAddons(JNIEnv* env, jobject obj, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setDisabledAddons(JNIEnv* env, jobject obj, jstring jprogramId, jobjectArray jdisabledAddons) { auto program_id = EmulationSession::GetProgramId(env, jprogramId); @@ -345,7 +345,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setDisabledAddons(JNIEnv* env, j Settings::values.disabled_addons[program_id] = disabled_addons; } -jobjectArray Java_org_suyu_suyu_1emu_utils_NativeConfig_getOverlayControlData(JNIEnv* env, +jobjectArray Java_dev_suyu_suyu_1emu_utils_NativeConfig_getOverlayControlData(JNIEnv* env, jobject obj) { jobjectArray joverlayControlDataArray = env->NewObjectArray(AndroidSettings::values.overlay_control_data.size(), @@ -375,7 +375,7 @@ jobjectArray Java_org_suyu_suyu_1emu_utils_NativeConfig_getOverlayControlData(JN return joverlayControlDataArray; } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setOverlayControlData( +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setOverlayControlData( JNIEnv* env, jobject obj, jobjectArray joverlayControlDataArray) { AndroidSettings::values.overlay_control_data.clear(); int size = env->GetArrayLength(joverlayControlDataArray); @@ -424,7 +424,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setOverlayControlData( } } -jobjectArray Java_org_suyu_suyu_1emu_utils_NativeConfig_getInputSettings(JNIEnv* env, jobject obj, +jobjectArray Java_dev_suyu_suyu_1emu_utils_NativeConfig_getInputSettings(JNIEnv* env, jobject obj, jboolean j_global) { Settings::values.players.SetGlobal(static_cast(j_global)); auto& players = Settings::values.players.GetValue(); @@ -474,7 +474,7 @@ jobjectArray Java_org_suyu_suyu_1emu_utils_NativeConfig_getInputSettings(JNIEnv* return j_input_settings; } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setInputSettings(JNIEnv* env, jobject obj, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setInputSettings(JNIEnv* env, jobject obj, jobjectArray j_value, jboolean j_global) { auto& players = Settings::values.players.GetValue(static_cast(j_global)); @@ -530,7 +530,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setInputSettings(JNIEnv* env, jo } } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_saveControlPlayerValues(JNIEnv* env, jobject obj) { +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_saveControlPlayerValues(JNIEnv* env, jobject obj) { Settings::values.players.SetGlobal(false); // Clear all controls from the config in case the user reverted back to globals diff --git a/src/android/app/src/main/jni/native_input.cpp b/src/android/app/src/main/jni/native_input.cpp index 5f83c3fe1b..d3523eb30d 100644 --- a/src/android/app/src/main/jni/native_input.cpp +++ b/src/android/app/src/main/jni/native_input.cpp @@ -186,24 +186,24 @@ void ConnectController(size_t player_index, bool connected) { extern "C" { -jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_isHandheldOnly(JNIEnv* env, +jboolean Java_dev_suyu_suyu_1emu_features_input_NativeInput_isHandheldOnly(JNIEnv* env, jobject j_obj) { return IsHandheldOnly(); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onGamePadButtonEvent( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onGamePadButtonEvent( JNIEnv* env, jobject j_obj, jstring j_guid, jint j_port, jint j_button_id, jint j_action) { EmulationSession::GetInstance().GetInputSubsystem().GetAndroid()->SetButtonState( Common::Android::GetJString(env, j_guid), j_port, j_button_id, j_action != 0); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onGamePadAxisEvent( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onGamePadAxisEvent( JNIEnv* env, jobject j_obj, jstring j_guid, jint j_port, jint j_stick_id, jfloat j_value) { EmulationSession::GetInstance().GetInputSubsystem().GetAndroid()->SetAxisPosition( Common::Android::GetJString(env, j_guid), j_port, j_stick_id, j_value); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onGamePadMotionEvent( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onGamePadMotionEvent( JNIEnv* env, jobject j_obj, jstring j_guid, jint j_port, jlong j_delta_timestamp, jfloat j_x_gyro, jfloat j_y_gyro, jfloat j_z_gyro, jfloat j_x_accel, jfloat j_y_accel, jfloat j_z_accel) { @@ -212,7 +212,7 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_onGamePadMotionEvent( j_z_gyro, j_x_accel, j_y_accel, j_z_accel); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onReadNfcTag(JNIEnv* env, jobject j_obj, +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onReadNfcTag(JNIEnv* env, jobject j_obj, jbyteArray j_data) { jboolean isCopy{false}; std::span data(reinterpret_cast(env->GetByteArrayElements(j_data, &isCopy)), @@ -223,13 +223,13 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_onReadNfcTag(JNIEnv* env } } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onRemoveNfcTag(JNIEnv* env, jobject j_obj) { +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onRemoveNfcTag(JNIEnv* env, jobject j_obj) { if (EmulationSession::GetInstance().IsRunning()) { EmulationSession::GetInstance().GetInputSubsystem().GetVirtualAmiibo()->CloseAmiibo(); } } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onTouchPressed(JNIEnv* env, jobject j_obj, +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onTouchPressed(JNIEnv* env, jobject j_obj, jint j_id, jfloat j_x_axis, jfloat j_y_axis) { if (EmulationSession::GetInstance().IsRunning()) { @@ -237,7 +237,7 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_onTouchPressed(JNIEnv* e } } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onTouchMoved(JNIEnv* env, jobject j_obj, +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onTouchMoved(JNIEnv* env, jobject j_obj, jint j_id, jfloat j_x_axis, jfloat j_y_axis) { if (EmulationSession::GetInstance().IsRunning()) { @@ -245,14 +245,14 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_onTouchMoved(JNIEnv* env } } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onTouchReleased(JNIEnv* env, jobject j_obj, +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onTouchReleased(JNIEnv* env, jobject j_obj, jint j_id) { if (EmulationSession::GetInstance().IsRunning()) { EmulationSession::GetInstance().Window().OnTouchReleased(j_id); } } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onOverlayButtonEventImpl( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onOverlayButtonEventImpl( JNIEnv* env, jobject j_obj, jint j_port, jint j_button_id, jint j_action) { if (EmulationSession::GetInstance().IsRunning()) { EmulationSession::GetInstance().GetInputSubsystem().GetVirtualGamepad()->SetButtonState( @@ -260,7 +260,7 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_onOverlayButtonEventImpl } } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onOverlayJoystickEventImpl( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onOverlayJoystickEventImpl( JNIEnv* env, jobject j_obj, jint j_port, jint j_stick_id, jfloat j_x_axis, jfloat j_y_axis) { if (EmulationSession::GetInstance().IsRunning()) { EmulationSession::GetInstance().GetInputSubsystem().GetVirtualGamepad()->SetStickPosition( @@ -268,7 +268,7 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_onOverlayJoystickEventIm } } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onDeviceMotionEvent( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onDeviceMotionEvent( JNIEnv* env, jobject j_obj, jint j_port, jlong j_delta_timestamp, jfloat j_x_gyro, jfloat j_y_gyro, jfloat j_z_gyro, jfloat j_x_accel, jfloat j_y_accel, jfloat j_z_accel) { if (EmulationSession::GetInstance().IsRunning()) { @@ -278,18 +278,18 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_onDeviceMotionEvent( } } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_reloadInputDevices(JNIEnv* env, +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_reloadInputDevices(JNIEnv* env, jobject j_obj) { EmulationSession::GetInstance().System().HIDCore().ReloadInputDevices(); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_registerController(JNIEnv* env, +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_registerController(JNIEnv* env, jobject j_obj, jobject j_device) { EmulationSession::GetInstance().GetInputSubsystem().GetAndroid()->RegisterController(j_device); } -jobjectArray Java_org_suyu_suyu_1emu_features_input_NativeInput_getInputDevices(JNIEnv* env, +jobjectArray Java_dev_suyu_suyu_1emu_features_input_NativeInput_getInputDevices(JNIEnv* env, jobject j_obj) { auto devices = EmulationSession::GetInstance().GetInputSubsystem().GetInputDevices(); jobjectArray jdevices = env->NewObjectArray(devices.size(), Common::Android::GetStringClass(), @@ -301,7 +301,7 @@ jobjectArray Java_org_suyu_suyu_1emu_features_input_NativeInput_getInputDevices( return jdevices; } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_loadInputProfiles(JNIEnv* env, +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_loadInputProfiles(JNIEnv* env, jobject j_obj) { map_profiles.clear(); const auto input_profile_loc = @@ -327,7 +327,7 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_loadInputProfiles(JNIEnv } } -jobjectArray Java_org_suyu_suyu_1emu_features_input_NativeInput_getInputProfileNames( +jobjectArray Java_dev_suyu_suyu_1emu_features_input_NativeInput_getInputProfileNames( JNIEnv* env, jobject j_obj) { std::vector profile_names; profile_names.reserve(map_profiles.size()); @@ -357,14 +357,14 @@ jobjectArray Java_org_suyu_suyu_1emu_features_input_NativeInput_getInputProfileN return j_profile_names; } -jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_isProfileNameValid(JNIEnv* env, +jboolean Java_dev_suyu_suyu_1emu_features_input_NativeInput_isProfileNameValid(JNIEnv* env, jobject j_obj, jstring j_name) { return Common::Android::GetJString(env, j_name).find_first_of("<>:;\"/\\|,.!?*") == std::string::npos; } -jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_createProfile(JNIEnv* env, +jboolean Java_dev_suyu_suyu_1emu_features_input_NativeInput_createProfile(JNIEnv* env, jobject j_obj, jstring j_name, jint j_player_index) { @@ -380,7 +380,7 @@ jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_createProfile(JNIEnv return SaveProfile(profile_name, j_player_index); } -jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_deleteProfile(JNIEnv* env, +jboolean Java_dev_suyu_suyu_1emu_features_input_NativeInput_deleteProfile(JNIEnv* env, jobject j_obj, jstring j_name, jint j_player_index) { @@ -398,21 +398,21 @@ jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_deleteProfile(JNIEnv return !ProfileExistsInMap(profile_name) && !ProfileExistsInFilesystem(profile_name); } -jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_loadProfile(JNIEnv* env, jobject j_obj, +jboolean Java_dev_suyu_suyu_1emu_features_input_NativeInput_loadProfile(JNIEnv* env, jobject j_obj, jstring j_name, jint j_player_index) { auto profile_name = Common::Android::GetJString(env, j_name); return LoadProfile(profile_name, j_player_index); } -jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_saveProfile(JNIEnv* env, jobject j_obj, +jboolean Java_dev_suyu_suyu_1emu_features_input_NativeInput_saveProfile(JNIEnv* env, jobject j_obj, jstring j_name, jint j_player_index) { auto profile_name = Common::Android::GetJString(env, j_name); return SaveProfile(profile_name, j_player_index); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_loadPerGameConfiguration( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_loadPerGameConfiguration( JNIEnv* env, jobject j_obj, jint j_player_index, jint j_selected_index, jstring j_selected_profile_name) { static constexpr size_t HANDHELD_INDEX = 8; @@ -460,23 +460,23 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_loadPerGameConfiguration handheld_controller->ReloadFromSettings(); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_beginMapping(JNIEnv* env, jobject j_obj, +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_beginMapping(JNIEnv* env, jobject j_obj, jint jtype) { EmulationSession::GetInstance().GetInputSubsystem().BeginMapping( static_cast(jtype)); } -jstring Java_org_suyu_suyu_1emu_features_input_NativeInput_getNextInput(JNIEnv* env, +jstring Java_dev_suyu_suyu_1emu_features_input_NativeInput_getNextInput(JNIEnv* env, jobject j_obj) { return Common::Android::ToJString( env, EmulationSession::GetInstance().GetInputSubsystem().GetNextInput().Serialize()); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_stopMapping(JNIEnv* env, jobject j_obj) { +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_stopMapping(JNIEnv* env, jobject j_obj) { EmulationSession::GetInstance().GetInputSubsystem().StopMapping(); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_updateMappingsWithDefaultImpl( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_updateMappingsWithDefaultImpl( JNIEnv* env, jobject j_obj, jint j_player_index, jstring j_device_params, jstring j_display_name) { auto& input_subsystem = EmulationSession::GetInstance().GetInputSubsystem(); @@ -516,7 +516,7 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_updateMappingsWithDefaul } } -jstring Java_org_suyu_suyu_1emu_features_input_NativeInput_getButtonParamImpl(JNIEnv* env, +jstring Java_dev_suyu_suyu_1emu_features_input_NativeInput_getButtonParamImpl(JNIEnv* env, jobject j_obj, jint j_player_index, jint j_button) { @@ -528,7 +528,7 @@ jstring Java_org_suyu_suyu_1emu_features_input_NativeInput_getButtonParamImpl(JN .Serialize()); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_setButtonParamImpl( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_setButtonParamImpl( JNIEnv* env, jobject j_obj, jint j_player_index, jint j_button_id, jstring j_param) { ApplyControllerConfig(j_player_index, [&](Core::HID::EmulatedController* controller) { controller->SetButtonParam(j_button_id, @@ -536,7 +536,7 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_setButtonParamImpl( }); } -jstring Java_org_suyu_suyu_1emu_features_input_NativeInput_getStickParamImpl(JNIEnv* env, +jstring Java_dev_suyu_suyu_1emu_features_input_NativeInput_getStickParamImpl(JNIEnv* env, jobject j_obj, jint j_player_index, jint j_stick) { @@ -548,7 +548,7 @@ jstring Java_org_suyu_suyu_1emu_features_input_NativeInput_getStickParamImpl(JNI .Serialize()); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_setStickParamImpl( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_setStickParamImpl( JNIEnv* env, jobject j_obj, jint j_player_index, jint j_stick_id, jstring j_param) { ApplyControllerConfig(j_player_index, [&](Core::HID::EmulatedController* controller) { controller->SetStickParam(j_stick_id, @@ -556,14 +556,14 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_setStickParamImpl( }); } -jint Java_org_suyu_suyu_1emu_features_input_NativeInput_getButtonNameImpl(JNIEnv* env, +jint Java_dev_suyu_suyu_1emu_features_input_NativeInput_getButtonNameImpl(JNIEnv* env, jobject j_obj, jstring j_param) { return static_cast(EmulationSession::GetInstance().GetInputSubsystem().GetButtonName( Common::ParamPackage(Common::Android::GetJString(env, j_param)))); } -jintArray Java_org_suyu_suyu_1emu_features_input_NativeInput_getSupportedStyleTagsImpl( +jintArray Java_dev_suyu_suyu_1emu_features_input_NativeInput_getSupportedStyleTagsImpl( JNIEnv* env, jobject j_obj, jint j_player_index) { auto supported_styles = GetSupportedStyles(j_player_index); jintArray j_supported_indexes = env->NewIntArray(supported_styles.size()); @@ -572,7 +572,7 @@ jintArray Java_org_suyu_suyu_1emu_features_input_NativeInput_getSupportedStyleTa return j_supported_indexes; } -jint Java_org_suyu_suyu_1emu_features_input_NativeInput_getStyleIndexImpl(JNIEnv* env, +jint Java_dev_suyu_suyu_1emu_features_input_NativeInput_getStyleIndexImpl(JNIEnv* env, jobject j_obj, jint j_player_index) { return static_cast(EmulationSession::GetInstance() @@ -582,7 +582,7 @@ jint Java_org_suyu_suyu_1emu_features_input_NativeInput_getStyleIndexImpl(JNIEnv ->GetNpadStyleIndex(true)); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_setStyleIndexImpl(JNIEnv* env, +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_setStyleIndexImpl(JNIEnv* env, jobject j_obj, jint j_player_index, jint j_style_index) { @@ -599,14 +599,14 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_setStyleIndexImpl(JNIEnv } } -jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_isControllerImpl(JNIEnv* env, +jboolean Java_dev_suyu_suyu_1emu_features_input_NativeInput_isControllerImpl(JNIEnv* env, jobject j_obj, jstring jparams) { return static_cast(EmulationSession::GetInstance().GetInputSubsystem().IsController( Common::ParamPackage(Common::Android::GetJString(env, jparams)))); } -jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_getIsConnected(JNIEnv* env, +jboolean Java_dev_suyu_suyu_1emu_features_input_NativeInput_getIsConnected(JNIEnv* env, jobject j_obj, jint j_player_index) { auto& hid_core = EmulationSession::GetInstance().System().HIDCore(); @@ -618,7 +618,7 @@ jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_getIsConnected(JNIEn return controller->IsConnected(true); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_connectControllersImpl( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_connectControllersImpl( JNIEnv* env, jobject j_obj, jbooleanArray j_connected) { jboolean isCopy = false; auto j_connected_array_size = env->GetArrayLength(j_connected); @@ -628,7 +628,7 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_connectControllersImpl( } } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_resetControllerMappings( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_resetControllerMappings( JNIEnv* env, jobject j_obj, jint j_player_index) { // Clear all previous mappings for (int button_id = 0; button_id < Settings::NativeButton::NumButtons; ++button_id) { diff --git a/src/android/app/src/main/jni/native_log.cpp b/src/android/app/src/main/jni/native_log.cpp index e1f74d4701..29a33119e6 100644 --- a/src/android/app/src/main/jni/native_log.cpp +++ b/src/android/app/src/main/jni/native_log.cpp @@ -7,23 +7,23 @@ extern "C" { -void Java_org_suyu_suyu_1emu_utils_Log_debug(JNIEnv* env, jobject obj, jstring jmessage) { +void Java_dev_suyu_suyu_1emu_utils_Log_debug(JNIEnv* env, jobject obj, jstring jmessage) { LOG_DEBUG(Frontend, "{}", Common::Android::GetJString(env, jmessage)); } -void Java_org_suyu_suyu_1emu_utils_Log_warning(JNIEnv* env, jobject obj, jstring jmessage) { +void Java_dev_suyu_suyu_1emu_utils_Log_warning(JNIEnv* env, jobject obj, jstring jmessage) { LOG_WARNING(Frontend, "{}", Common::Android::GetJString(env, jmessage)); } -void Java_org_suyu_suyu_1emu_utils_Log_info(JNIEnv* env, jobject obj, jstring jmessage) { +void Java_dev_suyu_suyu_1emu_utils_Log_info(JNIEnv* env, jobject obj, jstring jmessage) { LOG_INFO(Frontend, "{}", Common::Android::GetJString(env, jmessage)); } -void Java_org_suyu_suyu_1emu_utils_Log_error(JNIEnv* env, jobject obj, jstring jmessage) { +void Java_dev_suyu_suyu_1emu_utils_Log_error(JNIEnv* env, jobject obj, jstring jmessage) { LOG_ERROR(Frontend, "{}", Common::Android::GetJString(env, jmessage)); } -void Java_org_suyu_suyu_1emu_utils_Log_critical(JNIEnv* env, jobject obj, jstring jmessage) { +void Java_dev_suyu_suyu_1emu_utils_Log_critical(JNIEnv* env, jobject obj, jstring jmessage) { LOG_CRITICAL(Frontend, "{}", Common::Android::GetJString(env, jmessage)); } diff --git a/src/android/app/src/main/res/layout/fragment_emulation.xml b/src/android/app/src/main/res/layout/fragment_emulation.xml index fb56b3c9d8..e43e9fe208 100644 --- a/src/android/app/src/main/res/layout/fragment_emulation.xml +++ b/src/android/app/src/main/res/layout/fragment_emulation.xml @@ -6,7 +6,7 @@ android:layout_height="match_parent" android:keepScreenOn="true" android:defaultFocusHighlightEnabled="false" - tools:context="org.suyu.suyu_emu.fragments.EmulationFragment" + tools:context="dev.suyu.suyu_emu.fragments.EmulationFragment" tools:openDrawer="start"> - - + app:argType="dev.suyu.suyu_emu.features.settings.model.Settings$MenuTag" /> + app:argType="dev.suyu.suyu_emu.features.settings.model.Settings$MenuTag" /> + app:argType="dev.suyu.suyu_emu.model.Game" /> @@ -157,19 +157,19 @@ app:destination="@id/perGamePropertiesFragment" /> + app:argType="dev.suyu.suyu_emu.model.Game" /> + app:argType="dev.suyu.suyu_emu.model.Game" /> diff --git a/src/android/app/src/main/res/navigation/settings_navigation.xml b/src/android/app/src/main/res/navigation/settings_navigation.xml index 94ba7b61a6..31993fb171 100644 --- a/src/android/app/src/main/res/navigation/settings_navigation.xml +++ b/src/android/app/src/main/res/navigation/settings_navigation.xml @@ -6,14 +6,14 @@ + app:argType="dev.suyu.suyu_emu.features.settings.model.Settings$MenuTag" /> diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml index 2eacae1d5c..6717a3527a 100644 --- a/src/android/app/src/main/res/values-ar/strings.xml +++ b/src/android/app/src/main/res/values-ar/strings.xml @@ -34,7 +34,7 @@ يسمح لـ يوزو بملء قائمة الألعاب تخطي تحديد مجلد الألعاب؟ لن يتم عرض الألعاب في قائمة الألعاب إذا لم يتم تحديد مجلد - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games البحث عن ألعاب إعدادات البحث تم تحديد مجلد الألعاب @@ -42,7 +42,7 @@ مطلوب لفك تشفير ألعاب البيع بالتجزئة تخطي إضافة المفاتيح؟ مطلوب مفاتيح صالحة لمحاكاة ألعاب البيع بالتجزئة. ستعمل تطبيقات البيرة المنزلية فقط إذا تابعت - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction الإشعارات امنح إذن الإشعار باستخدام الزر أدناه منح الإذن @@ -63,7 +63,7 @@ وحاول مرة أخر keys تحقق من أن ملف المفاتيح له امتداد وحاول مرة أخر bin تحقق من أن ملف المفاتيح له امتداد مفاتيح التشفير غير صالحة - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys الملف المحدد غير صحيح أو تالف. يرجى إعادة المفاتيح الخاصة بك GPU مدير برنامج تشغيل GPU تثبيت برنامج تشغيل @@ -107,7 +107,7 @@ لا يُسمح بتثبيت الألعاب الأساسية لتجنب التعارضات المحتملة. %1$d تم التثبيت بنجاح %1$d تمت الكتابة فوقه بنجاح - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates برامج التشغيل المخصصة غير مدعومة تحميل برنامج التشغيل المخصص غير معتمد حاليًا لهذا الجهاز.\nحدد هذا الخيار مرة أخرى في المستقبل لمعرفة ما إذا تمت إضافة الدعم! إدارة بيانات يوزو @@ -150,7 +150,7 @@ تم استيراد بيانات المستخدم بنجاح تم إلغاء التصدير https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu diff --git a/src/android/app/src/main/res/values-ckb/strings.xml b/src/android/app/src/main/res/values-ckb/strings.xml index bb630f934a..510b33bcad 100644 --- a/src/android/app/src/main/res/values-ckb/strings.xml +++ b/src/android/app/src/main/res/values-ckb/strings.xml @@ -1,7 +1,7 @@ - ئەم نەرمەکاڵایە یارییەکانی کۆنسۆلی نینتێندۆ سویچ کارپێدەکات. هیچ ناونیشانێکی یاری و کلیلی تێدا نییە..<br /><br />پێش ئەوەی دەست پێ بکەیت، تکایە شوێنی فایلی prod.keys ]]> دیاریبکە لە نێو کۆگای ئامێرەکەت.<br /><br />زیاتر فێربە]]> + ئەم نەرمەکاڵایە یارییەکانی کۆنسۆلی نینتێندۆ سویچ کارپێدەکات. هیچ ناونیشانێکی یاری و کلیلی تێدا نییە..<br /><br />پێش ئەوەی دەست پێ بکەیت، تکایە شوێنی فایلی prod.keys ]]> دیاریبکە لە نێو کۆگای ئامێرەکەت.<br /><br />زیاتر فێربە]]> ئاگاداری و هەڵەکان ئاگادارکردنەوەکان پیشان دەدات کاتێک شتێک بە هەڵەدا دەچێت. مۆڵەتی ئاگادارکردنەوە نەدراوە! @@ -32,14 +32,14 @@ ڕێگە بە یوزو دەدات بۆ پڕکردنەوەی لیستی یارییەکان هەڵبژاردنی فۆڵدەری یارییەکان تێپەڕدەکەیت؟ یارییەکان لە لیستی یارییەکاندا پیشان نادرێن ئەگەر فۆڵدەرێک هەڵنەبژێردرێت. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games گەڕان بەدوای یارییەکاندا ناونیشانی یارییەکان هەڵبژێردرا دابمەزرێنە prod.keys پێویستە بۆ کۆدکردنەوەى یارییە تاکەکەسییەکان زیادکردنی کلیلەکان تێپەڕدەکەیت؟ کلیلی دروست پێویستە بۆ وەرگرتنی یارییەکانی تاکەکەسی. تەنها ئەپەکانی homebrew کاردەکەن ئەگەر بەردەوام بیت. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction ئاگادارکردنەوەکان بە دوگمەی خوارەوە مۆڵەتی ئاگادارکردنەوەکە بدە. مۆڵەت بدە @@ -60,7 +60,7 @@ دڵنیابەوە کە فایلی کلیلەکانت درێژکراوەی .keys ی هەیە و دووبارە هەوڵبدەرەوە. دڵنیابە کە فایلی کلیلەکانت درێژکراوەی .bin ی هەیە و دووبارە هەوڵبدەرەوە. کلیلی کۆدکردنی نادروستە - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys فایلە هەڵبژێردراوەکە هەڵەیە یان تێکچووە. تکایە دووبارە کلیلەکانت دەربێنەوە. دامەزراندنی وەگەڕخەری GPU دامەزراندنی وەگەڕخەری بەدیل بۆ ئەوەی بە ئەگەرێکی زۆرەوە کارایی باشتر یان وردبینی هەبێت @@ -94,8 +94,8 @@ هیچ فایلێکی لۆگ نەدۆزراوە دامەزراندنی ناوەڕۆکی یاری دامەزراندنی نوێکاری یارییەکان یان DLC - https://suyu-emu.org/help/quickstart/#dumping-installed-updates - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-decryption-keys گایا ڕاستەقینە نییە @@ -107,7 +107,7 @@ ئەو پڕۆژانەی کە یوزوی بۆ ئەندرۆید ڕەخساند بونیات https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -246,7 +246,7 @@ وەشان ڕۆمەکەت کۆدکراوە - prod.keys فایلەکەت بۆ ئەوەی بتوانرێت یارییەکان کۆد بکرێنەوە.]]> + prod.keys فایلەکەت بۆ ئەوەی بتوانرێت یارییەکان کۆد بکرێنەوە.]]> هەڵەیەک لە دەستپێکردنی ناوەکی ڤیدیۆکەدا ڕوویدا ئەمەش بەزۆری بەهۆی وەگەڕخەرێکی ناتەبای GPU ەوەیە. دامەزراندنی وەگەڕخەری GPU ی تایبەتمەندکراو لەوانەیە ئەم کێشەیە چارەسەر بکات. ناتوانرێت ڕۆم باربکرێت diff --git a/src/android/app/src/main/res/values-cs/strings.xml b/src/android/app/src/main/res/values-cs/strings.xml index 6d09b552cd..4318d89afd 100644 --- a/src/android/app/src/main/res/values-cs/strings.xml +++ b/src/android/app/src/main/res/values-cs/strings.xml @@ -26,10 +26,10 @@ Hledat a filtrovat hry Vybrat složku s hrami Spravovat složky s hrami - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Instalovat prod.keys Přeskočit přidávání klíčů? - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Oznámení Udělit oprávnění Přeskočit udělení oprávnění k oznámení? @@ -47,7 +47,7 @@ Klíče úspěšně nainstalovány Chyba při čtení šifrovacích klíčů Neplatné šifrovací klíče - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Správce ovladače GPU Instalovat GPU ovladač Pokročilé nastavení @@ -97,7 +97,7 @@ Uživatelská data byla úspěšně importována. Export zrušen https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu https://play.google.com/store/apps/details?id=org.suyu.suyu_emu.ea diff --git a/src/android/app/src/main/res/values-de/strings.xml b/src/android/app/src/main/res/values-de/strings.xml index 8a69115433..b74c08c6ce 100644 --- a/src/android/app/src/main/res/values-de/strings.xml +++ b/src/android/app/src/main/res/values-de/strings.xml @@ -1,7 +1,7 @@ - Diese Software kann Spiele für die Nintendo Switch abspielen. Keine Spiele oder Spielekeys sind enthalten.<br /><br />Bevor du beginnst, bitte halte deine prod.keys ]]> auf deinem Gerät bereit. .<br /><br />Mehr Infos]]> + Diese Software kann Spiele für die Nintendo Switch abspielen. Keine Spiele oder Spielekeys sind enthalten.<br /><br />Bevor du beginnst, bitte halte deine prod.keys ]]> auf deinem Gerät bereit. .<br /><br />Mehr Infos]]> Hinweise und Fehler Zeigt Benachrichtigungen an, wenn etwas schief läuft. Berechtigung für Benachrichtigungen nicht erlaubt! @@ -35,7 +35,7 @@ Erlaubt suyu die Spieleliste zu füllen Auswahl des Spieleverzeichnisses überspringen? Spiele werden in der Spieleliste nicht angezeigt, wenn kein Ordner ausgewählt ist. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Spiele suchen Einstellungen suchen Spieleverzeichnis ausgewählt @@ -43,7 +43,7 @@ Zum Entschlüsseln von Spielen benötigt Hinzufügen der Schlüssel überspringen? Für die Emulation von Spielen sind gültige Schlüssel erforderlich. Wenn du fortfährst, funktionieren nur Homebrew-Anwendungen. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Benachrichtigungen Erteile mit dem Knopf unten die Berechtigung, Benachrichtigungen zu senden. Berechtigung erteilen @@ -63,7 +63,7 @@ Überprüfen Sie, ob Ihre Schlüsseldatei die Erweiterung \".keys\" hat, und versuchen Sie es erneut. Überprüfen Sie, ob Ihre Schlüsseldatei die Erweiterung \".bin\" hat, und versuchen Sie es erneut. Ungültige Schlüssel - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Die ausgewählte Datei ist falsch oder beschädigt. Bitte kopieren Sie Ihre Schlüssel erneut. GPU-Treiber Verwaltung GPU-Treiber installieren @@ -108,12 +108,12 @@ Wirklich fortfahren? %1$d Installationsfehler %1$d erfolgreich installiert %1$d erfolgreich überschrieben - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates suyu-Daten Verwalten Speicherdaten teilen Spiele-Ordner Spiele-Ordner hinzufügen - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Firmware nicht installiert @@ -132,7 +132,7 @@ Wirklich fortfahren? Nutzerdaten erfolgreich importiert Export abgebrochen https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -319,7 +319,7 @@ Wirklich fortfahren? Integritätsüberprüfung konnte nicht durchgeführt werden Das ROM ist verschlüsselt - prod.keys Datei installiert ist, damit Spiele entschlüsselt werden können.]]> + prod.keys Datei installiert ist, damit Spiele entschlüsselt werden können.]]> Bei der Initialisierung des Videokerns ist ein Fehler aufgetreten Dies wird normalerweise durch einen inkompatiblen GPU-Treiber verursacht. Die Installation eines passenden GPU-Treibers kann dieses Problem beheben. ROM konnte nicht geladen werden diff --git a/src/android/app/src/main/res/values-es/strings.xml b/src/android/app/src/main/res/values-es/strings.xml index ebe05df24a..7262bff489 100644 --- a/src/android/app/src/main/res/values-es/strings.xml +++ b/src/android/app/src/main/res/values-es/strings.xml @@ -1,7 +1,7 @@ - Este software ejecuta juegos para la videoconsola Nintendo Switch. Los videojuegos o claves no vienen incluidos.<br /><br />Antes de empezar, por favor, localice el archivo prod.keys ]]>en el almacenamiento de su dispositivo..<br /><br />Saber más]]> + Este software ejecuta juegos para la videoconsola Nintendo Switch. Los videojuegos o claves no vienen incluidos.<br /><br />Antes de empezar, por favor, localice el archivo prod.keys ]]>en el almacenamiento de su dispositivo..<br /><br />Saber más]]> Avisos y errores Mostrar notificaciones cuándo algo vaya mal. ¡Permisos de notificación no concedidos! @@ -35,7 +35,7 @@ Permite que suyu llene la lista de juegos ¿Omitir la selección de la carpeta de juegos? No se mostrará ningún juego si no se ha seleccionado una carpeta de juegos. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Buscar juegos Buscar configuración Directorio de juegos seleccionado @@ -43,7 +43,7 @@ Requerido para descifrar juegos ¿Omitir agregar claves? Se requieren claves válidas para emular juegos. Solo las aplicaciones homebrew funcionarán si continúas. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Notificaciones Otorga el permiso de notificación con el botón de abajo. Conceder permiso @@ -64,7 +64,7 @@ Compruebe que el archivo de claves tenga una extensión .keys y pruebe otra vez. Compruebe que el archivo de claves tenga una extensión .bin y pruebe otra vez. Claves de cifrado no válidas - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys El archivo seleccionado es incorrecto o está corrupto. Vuelva a redumpear sus claves. Explorador de drivers de GPU Instalar driver de GPU @@ -114,7 +114,7 @@ Contenido(s) de juego instalado/s con éxito %1$d instalado con éxito %1$d sobreescrito con éxito - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates Drivers personalizados no soportados En estos momentos, la carga de drivers personalizados no está disponible para este dispositivo..\n¡Comprueba esta opción en el futuro para ver si ya está añadido el soporte a ese dispositivo! Administrar datos de suyu @@ -141,14 +141,14 @@ Comprueba todo el contenido instalado por si hubiese alguno corrupto Faltan las claves de encriptación El firmware y los juegos no se pueden desencriptar - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Ejecutador de applet Ejecutar applets de sistema usando el firmware instalado Firmware no instalado Applet no disponible - prod.keys y el firmware estén instalados e inténtelo de nuevo.]]> + prod.keys y el firmware estén instalados e inténtelo de nuevo.]]> Álbum Ver las imágenes que están en la carpeta \"screenshots\" del usuario con el visor de fotos del sistema Editor de Mii @@ -181,7 +181,7 @@ Exportación cancelada Asegúrese de que las carpetas de datos de usuario estén en la raíz de la carpeta del zip y contengan un archivo config en config/config.ini e inténtelo de nuevo. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -410,8 +410,8 @@ Su ROM está encriptada - cartuchos de juegos o títulos instalados.]]> - prod.keys está instalado, para que los juegos sean descifrados.]]> + cartuchos de juegos o títulos instalados.]]> + prod.keys está instalado, para que los juegos sean descifrados.]]> Ocurrió un error al inicializar el núcleo de video, posiblemente debido a una incompatibilidad con el driver seleccionado Esto suele deberse a un driver de GPU incompatible. La instalación de un controlador de GPU personalizado puede resolver este problema. No se pudo cargar la ROM diff --git a/src/android/app/src/main/res/values-fa/strings.xml b/src/android/app/src/main/res/values-fa/strings.xml index 8112b8a853..884e9e4334 100644 --- a/src/android/app/src/main/res/values-fa/strings.xml +++ b/src/android/app/src/main/res/values-fa/strings.xml @@ -35,7 +35,7 @@ به suyu اجازه می دهد تا لیست باز‌ی‌ها را پر کند از انتخاب پوشه بازی رد می‌شوید؟ اگر پوشه‌ای انتخاب نشده باشد، بازی‌ها در لیست بازی‌ها نمایش داده نمی‌شوند. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games جستجو در بازی‌ها جستجو در تنظیمات پوشه بازی‌ها انتخاب شد @@ -43,7 +43,7 @@ برای رمزگشایی بازی‌های فروشگاهی مورد نیاز است افزودن کلیدها را رد می‌کنید؟ کلیدهای معتبر برای شبیه‌سازی بازی‌های فروشگاهی مورد نیاز است. اگر ادامه دهید، فقط برنامه‌های سیستم ریزکامپیوتری کار خواهند کرد. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction اعلان‌ها مجوز اعلان را با دکمه زیر اعطا کنید. اجازه بدهید @@ -64,7 +64,7 @@ بررسی کنید که فایل کلیدهای شما دارای پسوند keys. باشد و دوباره امتحان کنید. بررسی کنید که فایل کلیدهای شما دارای پسوند bin. باشد و دوباره امتحان کنید. کلیدهای رمزگذاری نامعتبر - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys فایل انتخابی نادرست یا خراب است. لطفا کلیدهای خود را دوباره استخراج کنید. مدیریت درایور پردازنده گرافیکی نصب درایور پردازنده گرافیکی @@ -114,7 +114,7 @@ محتوا(های) بازی با موفقیت نصب شد %1$dبا موفقیت نصب شد %1$dبا موفقیت بازنویسی شد - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates درایورهای سفارشی پشتیبانی نمی‌شوند بارگیری درایور سفارشی در حال حاضر برای این دستگاه پشتیبانی نمی‌شود.\nاین گزینه را دوباره در آینده بررسی کنید تا ببینید آیا پشتیبانی اضافه شده است یا خیر! مدیریت داده‌های suyu @@ -139,14 +139,14 @@ تمام محتوای نصب شده را از نظر خرابی بررسی می‌کند کلیدهای رمزگذاری وجود ندارند ثابت‌افزار و بازی‌های فروشگاهی قابل رمزگشایی نیستند - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys اجراکننده برنامک برنامک‌های سیستم را با استفاده از ثابت‌افزار نصب شده راه اندازی کنید ثابت‌افزار نصب نیست برنامک در دسترس نیست - prod.keys و ثابت‌افزار شما نصب شده است و دوباره امتحان کنید.]]> + prod.keys و ثابت‌افزار شما نصب شده است و دوباره امتحان کنید.]]> آلبوم تصاویر ذخیره شده در پوشه اسکرین شات‌های کاربر را با نمایشگر عکس سیستم مشاهده کنید ویرایش Mii @@ -179,7 +179,7 @@ صدور لغو شد مطمئن شوید که پوشه‌های داده کاربر در ریشه پوشه zip و حاوی یک فایل پیکربندی در config/config.ini هستند سپس دوباره امتحان کنید. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -410,7 +410,7 @@ رام شما رمزگذاری شده است - کارتیج‌های بازی یا عناوین نصب شده خود را استخراج کنید.]]> + کارتیج‌های بازی یا عناوین نصب شده خود را استخراج کنید.]]> در راه‌اندازی اولیه هسته ویدیو خطایی رخ داد این مورد معمولاً توسط یک درایور گرافیکی ناسازگار ایجاد می‌شود. نصب درایور گرافیکی سفارشی ممکن است این مشکل را حل کند. diff --git a/src/android/app/src/main/res/values-fr/strings.xml b/src/android/app/src/main/res/values-fr/strings.xml index f98ea6a35f..34bfd2cb79 100644 --- a/src/android/app/src/main/res/values-fr/strings.xml +++ b/src/android/app/src/main/res/values-fr/strings.xml @@ -1,7 +1,7 @@ - Ce logiciel exécutera des jeux pour la console de jeu Nintendo Switch. Aucun jeux ou clés n\'est inclus.<br /><br />Avant de commencer, veuillez localiser votre fichier prod.keys ]]> sur le stockage de votre appareil.<br /><br />En savoir plus]]> + Ce logiciel exécutera des jeux pour la console de jeu Nintendo Switch. Aucun jeux ou clés n\'est inclus.<br /><br />Avant de commencer, veuillez localiser votre fichier prod.keys ]]> sur le stockage de votre appareil.<br /><br />En savoir plus]]> Avis et erreurs Affiche des notifications en cas de problème. Permission de notification non accordée ! @@ -35,7 +35,7 @@ Permet à suyu de remplir la liste des jeux Ne pas sélectionner le dossier des jeux ? Les jeux ne seront pas affichés dans la liste des jeux si aucun dossier n\'est sélectionné. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Rechercher des jeux Rechercher un paramètre Répertoire de jeux sélectionné @@ -43,7 +43,7 @@ Nécessaire pour décrypter les jeux commerciaux. Sauter l\'ajout des clés ? Des clés valides sont nécessaires pour émuler des jeux commerciaux. Seules les applications homebrew fonctionneront si vous continuez. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Notifications Accorder la permission de notification avec le bouton ci-dessous. Accorder la permission @@ -64,7 +64,7 @@ Vérifiez que votre fichier de clés a une extension .keys et réessayez. Vérifiez que votre fichier de clés a une extension .bin et réessayez. Clés de chiffrement invalides - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Le fichier sélectionné est incorrect ou corrompu. Veuillez dumper à nouveau vos clés. Gestionnaire de pilotes du GPU Installer le pilote du GPU @@ -114,7 +114,7 @@ Contenu du jeu installé avec succès %1$d installé avec succès %1$d écrasé avec succès - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates Pilotes personnalisés non supporté Le chargement des pilotes personnalisés ne sont pas actuellement pris en charge pour ce périphérique. Vérifiez à nouveau cette option à l\'avenir pour voir si la prise en charge a été ajoutée ! Gérer les données de suyu @@ -141,14 +141,14 @@ Vérifie l\'intégrité des contenus installés Les clés de chiffrement sont manquantes. Le firmware et les jeux commerciaux ne peuvent pas être déchiffrés - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Lanceur d\'applets Lancer des applets système en utilisant le firmware installé Firmware non installé Applet non disponible - prod.keys et le firmware sont installés et essayez à nouveau.]]> + prod.keys et le firmware sont installés et essayez à nouveau.]]> Album Afficher les images stockées dans le dossier de captures d\'écran de l\'utilisateur avec le visualiseur de photos système. Éditeur Mii @@ -181,7 +181,7 @@ Exportation annulée Assurez-vous que les dossiers de données utilisateur se trouvent à la racine du dossier ZIP et contiennent un fichier de configuration à config/config.ini, puis réessayez. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -460,8 +460,8 @@ Votre ROM est cryptée - cartouches de jeu ou de vos titres installés.]]> - prod.keys est installé pour que les jeux puissent être déchiffrés.]]> + cartouches de jeu ou de vos titres installés.]]> + prod.keys est installé pour que les jeux puissent être déchiffrés.]]> Une erreur s\'est produite lors de l\'initialisation du noyau vidéo Cela est généralement dû à un pilote GPU incompatible. L\'installation d\'un pilote GPU personnalisé peut résoudre ce problème. Impossible de charger la ROM diff --git a/src/android/app/src/main/res/values-he/strings.xml b/src/android/app/src/main/res/values-he/strings.xml index f1087d6131..ee8be05463 100644 --- a/src/android/app/src/main/res/values-he/strings.xml +++ b/src/android/app/src/main/res/values-he/strings.xml @@ -1,7 +1,7 @@ - התוכנה תריץ משחקים לקונסולת ה Nintendo Switch. אף משחק או קבצים בעלי זכויות יוצרים נכללים.<br /><br /> לפני שאת/ה מתחיל בבקשה מצא את קובץ prod.keys]]> על המכשיר.<br /><br />קרא עוד]]> + התוכנה תריץ משחקים לקונסולת ה Nintendo Switch. אף משחק או קבצים בעלי זכויות יוצרים נכללים.<br /><br /> לפני שאת/ה מתחיל בבקשה מצא את קובץ prod.keys]]> על המכשיר.<br /><br />קרא עוד]]> התראות ותקלות מציג התראות כאשר משהו הולך לא כשורה. הרשאות התראות לא ניתנה! @@ -35,7 +35,7 @@ אפשר ל suyu לאכלס את רשימת המשחקים לדלג על בחירת תיקיית המשחקים? משחקים לא יוצגו ברשימת המשחקים אם לנבחרה תיקיית משחקים. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games חפש משחקים חפש בהגדרות ספריית משחקים נבחרה @@ -43,7 +43,7 @@ הכרחי בכדי לפענח משחקים לדלג על הוספת מפתחות? מפתחות חוקיים הכרחיים כדי לשחק במשחקים. רק אפליקציות פירטיות יפעלו אם תמשיך. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction התראות תן גישה להתראות עם הכפתור למטה. תן הרשאה @@ -64,7 +64,7 @@ ודא שלקובץ המפתחות שלך יש סיומת של key. ונסה/י שוב. ודא/י שלקובץ המפתחות שלך יש סיומת של bin. ונסה/י שוב. מפתחות הצפנה לא חוקיים - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys קבוץ שנבחר מושחת או לא נכון. בבקשה הוצא מחדש את המפתחות שלך. מנהל הדרייברים של המעבד הגרפי התקן דרייבר למעבד הגרפי @@ -114,7 +114,7 @@ תוכן (או תכני) המשחק הותקנו בהצלחה %1$d הותקן בהצלחה %1$d נדרס/נכתב מעל בהצלחה - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates דרייברים מותאמים אישית לא נתמכים הטענת דרייבים מותאמים אישית לא נתמך כרגע על מכשיר זה. \nבבקשה בדוק אופציה זו בעתיד בכדי לראות אם נוספה תמיכה! נהל את המידע של suyu @@ -126,14 +126,14 @@ הוסף תיקיית משחקים התיקייה הזו נוספה כבר! מאפייני תיקיית משחקים - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys משגר Applet מערכת שיגור Applet משתמשת בתוכנה המותקנת ה Firmware לא מותקן Applet לא זמין - prod.keysו firmwareשלך מותקנים ונסה שוב.]]> + prod.keysו firmwareשלך מותקנים ונסה שוב.]]> אלבום צפה בתמונות השמורות בתיקיית צילומי המסך של המשתמש בעזרת מציג התמונות של המערכת עורך Mii @@ -166,7 +166,7 @@ ייצוא בוטל ודא שנתוני המשתמש נמצאים בשורש קובץ ה zip ושהוא מכיל קובץ סידור ב config/config.ini ונסה שוב. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -325,8 +325,8 @@ אימות התקינות הצליח! המשחק שלך מוצפן - כרטיסי המשחקאו הכותרות המותקנות שלך.]]> - prod.keys מותקן כך שניתן יהיה לפענח משחקים.]]> + כרטיסי המשחקאו הכותרות המותקנות שלך.]]> + prod.keys מותקן כך שניתן יהיה לפענח משחקים.]]> התרחשה בעיה באתחול של ליבת הווידאו זה בדרך כלל נגרם על ידי דרייבר לא מתאים עבור המעבד הגרפי. התקנת דרייבר אשר מתאים למעבד הגרפי יכול לפתור את הבעיה הזו. אין אפשרות לטעון את המשחק diff --git a/src/android/app/src/main/res/values-hu/strings.xml b/src/android/app/src/main/res/values-hu/strings.xml index 098d65f9fa..61d44a91fe 100644 --- a/src/android/app/src/main/res/values-hu/strings.xml +++ b/src/android/app/src/main/res/values-hu/strings.xml @@ -1,7 +1,7 @@ - Ez a szoftver Nintendo Switch játékkonzolhoz készült játékokat futtat. Nem tartalmaz játékokat vagy kulcsokat. .<br /><br />Mielőtt hozzákezdenél, kérjük, válaszd ki a prod.keys]]> fájl helyét a készülék tárhelyén<br /><br />Tudj meg többet]]> + Ez a szoftver Nintendo Switch játékkonzolhoz készült játékokat futtat. Nem tartalmaz játékokat vagy kulcsokat. .<br /><br />Mielőtt hozzákezdenél, kérjük, válaszd ki a prod.keys]]> fájl helyét a készülék tárhelyén<br /><br />Tudj meg többet]]> Megjegyzések és hibák Értesítések megjelenítése, ha valami rosszul sül el. Nincs engedély az értesítés megjelenítéséhez! @@ -34,7 +34,7 @@ Játékmappák kezelése Kihagyod a játékok mappa kiválasztását? A játékok nem jelennek meg a Játékok listában, ha egy mappa nincs kijelölve. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Játékok keresése Beállítások keresése Játékok könyvtár kiválasztva @@ -42,7 +42,7 @@ Kiskereskedelmi játékok dekódolásához szükséges Kihagyod a kulcsok hozzáadását? A kiskereskedelmi játékok emulálásához érvényes kulcsokra van szükség. Csak a homebrew alkalmazások fognak működni, ha folytatod. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Értesítések Értesítési engedélyek megadása az alábbi gombbal. Engedély megadása @@ -63,7 +63,7 @@ Győződj meg róla, hogy a titkosító fájlod .keys kiterjesztéssel rendelkezik, majd próbáld újra. Győződj meg róla, hogy a titkosító fájlod .bin kiterjesztéssel rendelkezik, majd próbáld újra. Érvénytelen titkosítókulcsok - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys A kiválasztott fájl helytelen, vagy sérült. Állíts össze egy új kulcsot. GPU illesztőprogram-kezelő GPU illesztőprogram telepítése @@ -112,7 +112,7 @@ Játéktartalom sikeresen telepítve %1$d sikeresen telepítve %1$d sikeresen felülírva - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates Egyéni illesztőprogramok nem támogatottak Egyéni illesztőprogram telepítése jelenleg nem támogatott ezen az eszközön.\nNézz vissza később, hátha hozzáadtuk a támogatását! suyu adatok kezelése @@ -137,14 +137,14 @@ A telepített tartalom épségét ellenőrzi Hiányzó titkosítókulcsok A Firmware és a kiskereskedelmi (retail) játékok nem dekódolhatók - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Applet indító Rendszer appletek indítása a telepített firmware-rel Firmware nincs telepítve Applet nem elérhető - prod.keys fájl és a firmware telepítve van, majd próbáld újra.]]> + prod.keys fájl és a firmware telepítve van, majd próbáld újra.]]> Album Képernyőképek megtekintése a rendszer fényképnézegetőjével Mii szerkesztés @@ -176,7 +176,7 @@ Exportálás megszakítva Ellenőrizd, hogy a felhasználói adatok mappái a zip mappa gyökerében vannak, és tartalmaznak egy konfig fájlt a config/config.ini címen, majd próbáld meg újra. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -448,7 +448,7 @@ ROM titkosítva - prod.keys fájl telepítve van, hogy a játékok visszafejthetők legyenek.]]> + prod.keys fájl telepítve van, hogy a játékok visszafejthetők legyenek.]]> Hiba lépett fel a videómag inicializása során Ezt általában egy nem kompatibilis GPU illesztő okozza. Egyéni GPU illesztőprogram telepítése megoldhatja a problémát. Nem sikerült betölteni a ROM-ot diff --git a/src/android/app/src/main/res/values-id/strings.xml b/src/android/app/src/main/res/values-id/strings.xml index c8437b45c1..b80ceb837b 100644 --- a/src/android/app/src/main/res/values-id/strings.xml +++ b/src/android/app/src/main/res/values-id/strings.xml @@ -1,7 +1,7 @@ - Perangkat lunak ini akan menjalankan game untuk konsol game Nintendo Switch. Tidak ada judul game atau kunci yang disertakan.<br /><br />Sebelum memulai, harap cari file prod.keys ]]> di penyimpanan perangkat anda. <br /><br /> Selengkapnya ]]> + Perangkat lunak ini akan menjalankan game untuk konsol game Nintendo Switch. Tidak ada judul game atau kunci yang disertakan.<br /><br />Sebelum memulai, harap cari file prod.keys ]]> di penyimpanan perangkat anda. <br /><br /> Selengkapnya ]]> Pemberitahuan dan error Menampilkan pemberitahuan ketika terjadi kesalahan. Izin notifikasi tidak diberikan! @@ -35,7 +35,7 @@ Izinkan suyu mengisi daftar game Lewati pemilihan folder game? Game tidak akan muncul di list jika tidak ada folder yang dipilih. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Cari permainan Cari pengaturan Direktori game sudah terpilih @@ -43,7 +43,7 @@ Diperlukan untuk mendekripsi game retail Lewati penginstalan keys? Perlu keys yang valid untuk meng-emulate game retail. Hanya homebrew apps yang akan berfungsi jika kamu melanjutkan. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Notifikasi Berikan izin notifikasi dengan tombol di bawah ini. Berikan izin @@ -64,7 +64,7 @@ Pastikan file keys anda memiliki format .keys dan coba lagi. Pastikan file keys anda memiliki format .bin dan coba lagi. Keys enkripsi tidak valid - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys File yang dipilih salah atau rusak. Silakan masukkan kembali kunci Anda. Manajer driver GPU Install driver GPU @@ -114,7 +114,7 @@ Konten(-konten) game sudah berhasil terinstal. %1$d telah berhasil terinstal %1$d telah berhasil ditimpa. - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates Driver kustom tidak didukung Driver kustom saat ini tidak dapat digunakan pada perangkat ini. \nCek opsi ini lain waktu untuk mengetahui apakah dapat digunakan! Kelola data Suyu. @@ -137,7 +137,7 @@ Memeriksa semua konten yang terinstal dari kerusakan Kunci enkripsi hilang Firmware dan game retail tidak dapat didekripsi - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Luncurkan applet @@ -177,7 +177,7 @@ Ekspor Dibatalkan Pastikan folder data pengguna berada di akar folder zip dan berisi file konfigurasi di config/config.ini dan coba lagi. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -402,8 +402,8 @@ ROM-mu ter-enkripsi - kartu permainan atau judul yang terinstal.]]> - prod.keys diinstal sehingga game dapat didekripsi.]]> + kartu permainan atau judul yang terinstal.]]> + prod.keys diinstal sehingga game dapat didekripsi.]]> Terjadi kesalahan ketika menginisialisasi inti video. Hal ini biasanya disebabkan oleh driver GPU yang tidak kompatibel. Menginstal driver GPU khusus dapat mengatasi masalah ini Tidak Dapat Memuat ROM diff --git a/src/android/app/src/main/res/values-it/strings.xml b/src/android/app/src/main/res/values-it/strings.xml index 10552f1504..7a923d2fc3 100644 --- a/src/android/app/src/main/res/values-it/strings.xml +++ b/src/android/app/src/main/res/values-it/strings.xml @@ -1,7 +1,7 @@ - Questo software permette di giocare ai giochi della console Nintendo Switch. Nessun gioco o chiave è inclusa.<br /><br />Prima di iniziare, perfavore individua il file prod.keys ]]> nella memoria del tuo dispositivo.<br /><br />Scopri di più]]> + Questo software permette di giocare ai giochi della console Nintendo Switch. Nessun gioco o chiave è inclusa.<br /><br />Prima di iniziare, perfavore individua il file prod.keys ]]> nella memoria del tuo dispositivo.<br /><br />Scopri di più]]> Avvisi ed errori Mostra le notifiche quando qualcosa va storto. Autorizzazione di notifica non concessa! @@ -35,7 +35,7 @@ Consente a suyu di popolare l\'elenco dei giochi Saltare la selezione della cartella dei giochi? I giochi non saranno mostrati nella lista dei giochi se una cartella non è selezionata. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Cerca giochi Cerca impostazione Cartella dei giochi selezionata @@ -43,7 +43,7 @@ Necessario per decrittografare i giochi Saltare l\'aggiunta delle chiavi? Sono necessarie delle chiavi valide per emulare i giochi. Se continui, funzioneranno solo le app homebrew. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Notifiche Concedi l\'autorizzazione alle notifiche con il pulsante in basso. Concedere l\'autorizzazione @@ -64,7 +64,7 @@ Controlla che le tue chiavi abbiano l\'estensione .keys e prova di nuovo. Controlla che le tue chiavi abbiano l\'estensione .bin e prova di nuovo Chiavi di crittografia non valide - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Il file selezionato è incorretto o corrotto. Per favore riesegui il dump delle tue chiavi. Gestore driver GPU Installa i driver GPU @@ -114,7 +114,7 @@ Contenuto/i di gioco installato/i con successo. %1$dinstallato con successo. %1$dsovrascritto con successo - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates I driver personalizzati non sono supportati. I driver personalizzati non sono attualmente supportati su questo dispositivo.\n Ricontrolla in futuro. Gestisci i dati di Suyu @@ -129,14 +129,14 @@ Nessun salvataggio trovato Verifica i contenuti installati Verifica l\'integrità di tutti i contenuti installati. - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Avvia applet Avvia applet di sistema usando il firmware installato Firmware non installato Applet non disponibile - prod.keys e il firmware siano installati e riprova.]]> + prod.keys e il firmware siano installati e riprova.]]> Album Visualizza le immagini salvate nella cartella screenshots dell\'utente con il visualizzatore immagini di sistema Modifica Mii @@ -169,7 +169,7 @@ Esportazione annullata Assicurati che la cartella dei Dati dell\'utente stiano nella radice del file.zip e che sia presente una cartella config in config/config.ini, poi, riprova. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -364,8 +364,8 @@ L\'integrità dei contenuti non è stata validata La tua ROM è criptata - dump delle tue cartucce di giocooppure dei titoli già installati.]]> - prod.keys sia installato in modo che i giochi possano essere decrittati.]]> + dump delle tue cartucce di giocooppure dei titoli già installati.]]> + prod.keys sia installato in modo che i giochi possano essere decrittati.]]> È stato riscontrato un errore nell\'inizializzazione del core video Questo è causato solitamente dal driver incompatibile di una GPU. L\'installazione di driver GPU personalizzati potrebbe risolvere questo problema. Impossibile caricare la ROM diff --git a/src/android/app/src/main/res/values-ja/strings.xml b/src/android/app/src/main/res/values-ja/strings.xml index 21e2070e31..5294298faa 100644 --- a/src/android/app/src/main/res/values-ja/strings.xml +++ b/src/android/app/src/main/res/values-ja/strings.xml @@ -1,7 +1,7 @@ - このソフトウェアでは、Nintendo Switchのゲームを実行できます。 ゲームソフトやキーは含まれません。<br /><br />事前に、 prod.keys ]]> ファイルをストレージに配置しておいてください。<br /><br />詳細]]> + このソフトウェアでは、Nintendo Switchのゲームを実行できます。 ゲームソフトやキーは含まれません。<br /><br />事前に、 prod.keys ]]> ファイルをストレージに配置しておいてください。<br /><br />詳細]]> 通知とエラー 問題の発生時に通知を表示します。 通知が許可されていません! @@ -34,7 +34,7 @@ ゲームをsuyuのゲームリストに追加します ゲームフォルダの選択をスキップしますか? フォルダを選択しないと、ゲームがリストに表示されません。 - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games ゲームを検索 設定を検索 フォルダを選択しました @@ -42,7 +42,7 @@ 製品版ゲームの復号化に必要です キーの追加をスキップしますか? 製品版ゲームのエミュレーションには、有効なキーが必要です。続行すると自作アプリしか機能しません。 - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction 通知 下のボタンで通知を許可してください。 許可 @@ -63,7 +63,7 @@ キーの拡張子が.keysであることを確認し、再度お試しください。 キーの拡張子が.binであることを確認し、再度お試しください。 暗号化キーが無効 - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys ファイルが間違っているか破損しています。キーを再ダンプしてください。 GPUドライバーの管理 GPUドライバー @@ -107,11 +107,11 @@ ゲームコンテンツのインストールに成功しました %1$d のインストールに成功しました %1$d の上書きに成功しました - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates カスタムドライバはサポートされていません suyu データを管理 セーブファイルを共有 - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys ファームウェア未インストール アルバム @@ -133,7 +133,7 @@ ユーザデータのインポートに成功しました エクスポートをキャンセルしました https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -299,7 +299,7 @@ 整合性の確認に失敗しました! ROMが暗号化されています - prod.keys ファイルがインストールされていることを確認してください。]]> + prod.keys ファイルがインストールされていることを確認してください。]]> ビデオコアの初期化中にエラーが発生しました これは通常、互換性のないGPUドライバーが原因で発生します。 カスタムGPUドライバーをインストールすると、問題が解決する可能性があります。 ROMの読み込みに失敗しました diff --git a/src/android/app/src/main/res/values-ko/strings.xml b/src/android/app/src/main/res/values-ko/strings.xml index a2d2bb9511..4a32020520 100644 --- a/src/android/app/src/main/res/values-ko/strings.xml +++ b/src/android/app/src/main/res/values-ko/strings.xml @@ -1,7 +1,7 @@ - 이 소프트웨어는 Nintendo Switch 게임을 실행합니다. 게임 타이틀이나 키는 포함되어 있지 않습니다.<br /><br />시작하기 전에 장치 저장소에서 prod.keys ]]> 파일을 찾아주세요.<br /><br />자세히 알아보기]]> + 이 소프트웨어는 Nintendo Switch 게임을 실행합니다. 게임 타이틀이나 키는 포함되어 있지 않습니다.<br /><br />시작하기 전에 장치 저장소에서 prod.keys ]]> 파일을 찾아주세요.<br /><br />자세히 알아보기]]> 알림 및 오류 문제가 발생하면 알림을 표시합니다. 알림 권한이 부여되지 않았습니다! @@ -35,7 +35,7 @@ suyu에 게임 목록 추가하기 게임 폴더 선택을 건너뛰겠습니까? 폴더를 선택하지 않으면 게임 목록에 게임이 표시되지 않습니다. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games 게임 검색 검색 설정 게임 디렉터리를 설정했습니다. @@ -43,7 +43,7 @@ 패키지 게임 암호 해독에 필요 키 추가를 건너뛰겠습니까? 패키지 게임을 에뮬레이트하려면 유효한 키 값이 필요합니다. 이 단계를 건너뛰면 홈브류 게임만 실행할 수 있습니다. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction 알림 아래 버튼으로 알림 권한을 부여합니다. 알림 켜기 @@ -64,7 +64,7 @@ 키 파일의 확장자가 .keys인지 확인하고 다시 시도하세요. 키 파일의 확장자가 .bin인지 확인하고 다시 시도하세요. 암호화 키가 올바르지 않음 - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys 선택한 파일이 잘못되었거나 손상되었습니다. 키를 다시 덤프하세요. GPU 드라이버 관리자 GPU 드라이버 설치 @@ -114,7 +114,7 @@ 게임 콘텐츠 설치됨 %1$d개를 설치했습니다. %1$d개를 덮어씌웠습니다. - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates 사용자 지정 드라이버는 지원하지 않습니다. 이 장치의 사용자 지정 드라이버 로딩은 현재 지원하지 않습니다.\n나중에 이 옵션을 확인하면 지원이 추가되었는지 확인할 수 있습니다. suyu 데이터 관리 @@ -137,14 +137,14 @@ 전체 설치된 콘텐츠의 손상을 확인합니다. 암호화 키를 찾을 수 없음 펌웨어 및 패키지 게임을 해독할 수 없음 - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys 애플릿 런처 설치된 펌웨어를 사용해 시스템 애플릿을 실행합니다. 펌웨어가 설치되지 않았습니다. 애플릿을 사용할 수 없음 - prod.keys 파일과 펌웨어가 설치되었는지 확인하고 다시 시도하세요.]]> + prod.keys 파일과 펌웨어가 설치되었는지 확인하고 다시 시도하세요.]]> 앨범 시스템 사진 뷰어로 유저 스크린샷 폴더에 저장된 이미지를 확인합니다. Mii 편집 @@ -177,7 +177,7 @@ 내보내기 취소됨 유저 데이터 폴더가 ZIP 폴더의 루트 디렉토리에 위치하고 config/config.ini 구성 파일이 있는지 확인하고 다시 시도하세요. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -403,8 +403,8 @@ 롬 파일이 암호화되어있음 - 게임 카트리지 또는 설치된 타이틀을 다시 덤프하세요.]]> - prod.keys 파일이 설치되어 있는지 확인하세요.]]> + 게임 카트리지 또는 설치된 타이틀을 다시 덤프하세요.]]> + prod.keys 파일이 설치되어 있는지 확인하세요.]]> 비디오 코어를 초기화하는 동안 오류 발생 일반적으로 이 문제는 호환되지 않는 GPU 드라이버로 인해 발생합니다. 사용자 지정 GPU 드라이버를 설치하면 이 문제가 해결될 수 있습니다. 롬 파일을 불러올 수 없음 diff --git a/src/android/app/src/main/res/values-nb/strings.xml b/src/android/app/src/main/res/values-nb/strings.xml index 9ce92d899f..c9ba29339b 100644 --- a/src/android/app/src/main/res/values-nb/strings.xml +++ b/src/android/app/src/main/res/values-nb/strings.xml @@ -1,7 +1,7 @@ - Denne programvaren vil kjøre spill for Nintendo Switch-spillkonsollen. Ingen spilltitler eller nøkler er inkludert.<br /><br />Før du begynner, må du finne prod.keys ]]> filen din på enhetslagringen.<br /><br />Lær mer]]> + Denne programvaren vil kjøre spill for Nintendo Switch-spillkonsollen. Ingen spilltitler eller nøkler er inkludert.<br /><br />Før du begynner, må du finne prod.keys ]]> filen din på enhetslagringen.<br /><br />Lær mer]]> Merknader og feil Viser varsler når noe går galt. Varslingstillatelse ikke gitt! @@ -32,14 +32,14 @@ Gjør det mulig for suyu å fylle ut spillelisten. Hoppe over valg av spillmappe? Spill vises ikke i Spill-listen hvis en mappe ikke er valgt. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Søk i spill| Spillkatalogen er valgt Installer prod.keys Nødvendig for å dekryptere spill Hoppe over å legge til nøkler? Gyldige nøkler er påkrevd for å emulere spill. Bare hjemmebryggede apper vil fungere hvis du fortsetter. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Varsler Gi varslingstillatelse med knappen nedenfor. Gi tillatelse @@ -60,7 +60,7 @@ Kontroller at nøkkelfilen har filtypen .keys, og prøv igjen. Kontroller at nøkkelfilen har filtypen .bin, og prøv igjen. Ugyldige krypteringsnøkler - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Den valgte filen er feil eller ødelagt. Vennligst dump nøklene på nytt. Installer GPU-driver Installer alternative drivere for potensielt bedre ytelse eller nøyaktighet. @@ -94,8 +94,8 @@ Ingen loggfil funnet Installer spillinnhold Installer spilloppdateringer eller DLC - https://suyu-emu.org/help/quickstart/#dumping-installed-updates - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-decryption-keys Gaia er ikke ekte @@ -107,7 +107,7 @@ Prosjekter som gjør suyu for Android mulig Bygg https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -257,7 +257,7 @@ Integritetsverifisering mislyktes! ROM-en din er kryptert - prod.keys filen er installert slik at spillene kan dekrypteres.]]> + prod.keys filen er installert slik at spillene kan dekrypteres.]]> Det oppstod en feil ved initialisering av videokjernen Dette skyldes vanligvis en inkompatibel GPU-driver. Installering av en tilpasset GPU-driver kan løse problemet. Kunne ikke laste inn ROM diff --git a/src/android/app/src/main/res/values-pl/strings.xml b/src/android/app/src/main/res/values-pl/strings.xml index 02587fd8b1..fedb52c0da 100644 --- a/src/android/app/src/main/res/values-pl/strings.xml +++ b/src/android/app/src/main/res/values-pl/strings.xml @@ -1,7 +1,7 @@ - To oprogramowanie umożliwia uruchomienie gier z konsoli Nintendo Switch. Nie zawiera gier ani wymaganych kluczy.<br /><br />Zanim zaczniesz, wybierz plik kluczy prod.keys ]]> z katalogu w pamięci masowej.<br /><br />Dowiedz się więcej]]> + To oprogramowanie umożliwia uruchomienie gier z konsoli Nintendo Switch. Nie zawiera gier ani wymaganych kluczy.<br /><br />Zanim zaczniesz, wybierz plik kluczy prod.keys ]]> z katalogu w pamięci masowej.<br /><br />Dowiedz się więcej]]> Powiadomienia błędy Pokaż powiadomienie gdy coś pójdzie źle Nie zezwolono na powiadomienia! @@ -32,14 +32,14 @@ Pozwala suyu wygenerować listę gier Pominąć wybór folderu z grami? Aby pokazać listę gier wybierz katalog zawierający gry. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Szukaj gier Wybrano katalog gier Instaluj klucze prod.keys Wymagane aby poprawnie odczytać sklepowe gry Pominąć dodawanie kluczy? Poprawne klucze są wymagane aby emulować sklepowe gry. Jeśli przejdziesz dalej, jedynie homebrew będą działać. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Powiadomienia Nadaj uprawnienia dostępu do powiadomień. Nadaj uprawnienia @@ -60,7 +60,7 @@ Upewnij się że twoje klucze mają rozszerzenie .keys i spróbuj ponownie. Upewnij się że twoje klucze mają rozszerzenie .bin i spróbuj ponownie. Niepoprawne klucze - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Wybrany plik jest niepoprawny lub uszkodzony. Zrzuć ponownie swoje klucze. Zainstaluj sterownik GPU Użyj alternatywnych sterowników aby potencjalnie zwiększyć wydajność i naprawić błędy @@ -94,8 +94,8 @@ Nie znaleziono plików logów Zainstaluj zawartość gry Zainstaluj aktualizację gry lub dodatek DLC - https://suyu-emu.org/help/quickstart/#dumping-installed-updates - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-decryption-keys Gaia isn\'t real @@ -107,7 +107,7 @@ Projekty dzięki którym suyu mógł zostać stworzony Wersja https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -255,7 +255,7 @@ Dodatki Twój ROM jest zakodowany - prod.keys jest zainstalowany aby gry mogły zostać odczytane.]]> + prod.keys jest zainstalowany aby gry mogły zostać odczytane.]]> Błąd inicjacji podsystemu graficznego Zazwyczaj spowodowane niekompatybilnym sterownikiem GPU, instalacja niestandardowego sterownika może rozwiązać ten problem. Nie można wczytać pliku ROM diff --git a/src/android/app/src/main/res/values-pt-rBR/strings.xml b/src/android/app/src/main/res/values-pt-rBR/strings.xml index 3b3bf806b7..2abc99fb9f 100644 --- a/src/android/app/src/main/res/values-pt-rBR/strings.xml +++ b/src/android/app/src/main/res/values-pt-rBR/strings.xml @@ -1,7 +1,7 @@ - Este software executa jogos do console Nintendo Switch. Não estão inclusos nem jogos ou chaves.<br /><br />Antes de começar, por favor localize o arquivo prod.keys ]]> no armazenamento de seu dispositivo.<br /><br />Saiba mais]]> + Este software executa jogos do console Nintendo Switch. Não estão inclusos nem jogos ou chaves.<br /><br />Antes de começar, por favor localize o arquivo prod.keys ]]> no armazenamento de seu dispositivo.<br /><br />Saiba mais]]> Notificações e erros Mostra notificações quando algo dá errado. Acesso às notificações não concedido! @@ -35,7 +35,7 @@ Permite que o Suyu preencha a lista de jogos Ignorar a seleção da pasta de jogos? Os jogos não serão exibidos na lista de jogos se uma pasta não estiver selecionada. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Procurar jogos Procurar nas configurações Pasta de jogos selecionada @@ -43,7 +43,7 @@ Necessárias para desencriptar jogos comerciais Ignorar a adição de chaves? São necessárias chaves válidas para emular jogos comerciais. Somente aplicativos homebrew funcionarão se você continuar. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Notificações Conceda a permissão de notificação com o botão abaixo. Conceder permissão @@ -64,7 +64,7 @@ Verifique se seu arquivo de chaves possui a extensão .keys e tente novamente. Verifique se seu arquivo de chaves possui a extensão .bin e tente novamente. Chaves de encriptação inválidas - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys O arquivo selecionado está incorreto ou corrompido. Por favor extraia suas chaves novamente. Gerenciador de driver de GPU Instalar driver para GPU @@ -114,7 +114,7 @@ Conteúdo(s) de jogo instalado(s) com sucesso %1$d instalado com sucesso %1$d substituído com sucesso - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates Drivers personalizados não suportados Carregamento de drivers personalizados não suportado para este dispositivo no momento.\nVerifique essa opção novamente no futuro para ver se o suporte foi adicionado! Administrar dados do suyu @@ -141,14 +141,14 @@ Verifica todo o conteúdo instalado em busca de dados corrompidos Faltando chaves de encriptação O firmware e jogos comerciais não poderão ser decriptados - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Launcher de miniaplicativos Execute miniaplicativos do sistema usando o firmware instalado Firmware não instalado Miniaplicativo não disponível - prod.keys e o firmware estão instalados e tente novamente.]]> + prod.keys e o firmware estão instalados e tente novamente.]]> Álbum Visualize imagens armazenadas na pasta de capturas de telas do usuário com o visualizador de imagens do sistema Editor de Mii @@ -181,7 +181,7 @@ Exportação cancelada Verifique se as pastas de dados do usuário estão na raiz da pasta zip, se possuem um arquivo de configuração em config/config.ini e tente novamente. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -461,8 +461,8 @@ uma tentativa de mapeamento automático Sua ROM está encriptada - cartuchos de jogos ou títulos instalados.]]> - prod.keys está instalado para que os jogos possam ser decriptados.]]> + cartuchos de jogos ou títulos instalados.]]> + prod.keys está instalado para que os jogos possam ser decriptados.]]> Ocorreu um erro ao iniciar o núcleo de vídeo. Isto é normalmente causado por um driver de GPU incompatível. Instalar um driver de GPU personalizado pode resolver este problema. Impossível carregar a ROM diff --git a/src/android/app/src/main/res/values-pt-rPT/strings.xml b/src/android/app/src/main/res/values-pt-rPT/strings.xml index 75ca1330cc..e326cdd400 100644 --- a/src/android/app/src/main/res/values-pt-rPT/strings.xml +++ b/src/android/app/src/main/res/values-pt-rPT/strings.xml @@ -35,7 +35,7 @@ Permite que o Suyu preencha a lista de jogos Ignorar a seleção da pasta de jogos? Os jogos não serão exibidos na lista de jogos se uma pasta não estiver selecionada. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Procurar jogos Procurar nas definições Pasta de Jogos selecionada @@ -43,7 +43,7 @@ Necessário para desencriptar jogos comerciais Ignorar a adição de chaves? São necessárias chaves válidas para emular jogos comerciais. Somente aplicativos homebrew funcionarão se você continuar. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Notificações Conceda a permissão de notificação com o botão abaixo. Conceda permissão @@ -64,7 +64,7 @@ Verifique se seu arquivo keys possui a extensão .keys e tente novamente. Verifique se seu arquivo keys possui a extensão .bin e tente novamente. Chaves de encriptação inválidas - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys O ficheiro selecionado está corrompido. Por favor recarrega as tuas chaves. Gerenciador de driver de GPU Instala driver para GPU @@ -114,7 +114,7 @@ Conteúdo(s) de jogo instalados com sucesso %1$d instalado com sucesso %1$d substituída com êxito - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates Drivers personalizados não suportados Carrea«gamento de drivers personalizados não é suportado pr este dispositivo. \nCheck verifica esta opção de futuro para confirmar se o suporte foi adicionado! Administrar dados suyu @@ -141,7 +141,7 @@ Verifica todo o conteúdo instalado em busca de dados corrompidos Faltando chaves de encriptação O firmware e jogos comerciais não poderão ser decriptados - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Launcher de miniaplicativos @@ -181,7 +181,7 @@ Exportação cancelada Verifiqua se as pastas de dados do utilizados estão na raiz da pasta zip e contêm um arquivo de configuração em config/config.ini e tenta novamente. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -461,8 +461,8 @@ uma tentativa de mapeamento automático A tua ROM está encriptada - cartucho de jogo or títulos instalados.]]> - prod.keys está instalado para que os jogos possam ser desencriptados.]]> + cartucho de jogo or títulos instalados.]]> + prod.keys está instalado para que os jogos possam ser desencriptados.]]> Ocorreu um erro ao iniciar o núcleo de vídeo. Isto é normalmente causado por um driver de GPU incompatível. Instalar um driver GPU pode resolver este problema. Impossível carregar a tua ROM diff --git a/src/android/app/src/main/res/values-ru/strings.xml b/src/android/app/src/main/res/values-ru/strings.xml index 0190726def..c78667db11 100644 --- a/src/android/app/src/main/res/values-ru/strings.xml +++ b/src/android/app/src/main/res/values-ru/strings.xml @@ -1,7 +1,7 @@ - Это программное обеспечение позволяет запускать игры для игровой консоли Nintendo Switch. Мы не предоставляем сами игры или ключи.<br /><br />Перед началом работы найдите файл prod.keys ]]> в хранилище устройства..<br /><br />Узнать больше]]> + Это программное обеспечение позволяет запускать игры для игровой консоли Nintendo Switch. Мы не предоставляем сами игры или ключи.<br /><br />Перед началом работы найдите файл prod.keys ]]> в хранилище устройства..<br /><br />Узнать больше]]> Уведомления и ошибки Показывать уведомления, когда что-то пошло не так Вы не предоставили разрешение на уведомления! @@ -35,7 +35,7 @@ Позволяет suyu заполнить список игр Пропустить выбор папки с играми? Игры не будут отображаться в списке Игры, если папка не выбрана. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Найти игры Настройки поиска Выбрана папка с играми @@ -43,7 +43,7 @@ Требуется для расшифровки розничных игр Пропустить добавление ключей? Для эмуляции розничных игр требуются действительные ключи. Если вы продолжите, будут работать только homebrew приложения. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Уведомления Предоставьте разрешение уведомлений с помощью кнопки ниже. Предоставить разрешение @@ -64,7 +64,7 @@ Убедитесь, что файл ключей имеет расширение .keys, и повторите попытку. Убедитесь, что файл ключей имеет расширение .bin, и повторите попытку. Неверные ключи шифрования - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Выбранный файл неверен или поврежден. Пожалуйста, пере-дампите ваши ключи. Менеджер драйверов ГП Установить драйвер ГП @@ -114,7 +114,7 @@ Игровой контент успешно установлен %1$d Успешно установлено %1$d Успешно перезаписано - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates Пользовательские драйверы не поддерживаются Загрузка пользовательского драйвера в настоящее время не поддерживается для этого устройства.\nПроверьте этот параметр еще раз в будущем чтобы узнать была ли добавлена ​​поддержка!   @@ -144,14 +144,14 @@ Проверяет весь установленный контент на наличие повреждений Отсутствуют ключи шифрования Прошивка и розничные игры не могут быть расшифрованы - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Запуск апплета Запуск системных апплетов на установленной прошивке Прошивка не установлена Апплет недоступен - prod.keys и firmware установлены и попробуйте еще раз.]]> + prod.keys и firmware установлены и попробуйте еще раз.]]> Альбом Просмотрите изображения, сохраненные в папке скриншотов пользователя, с помощью системного просмотрщика фотографий. Mii редактор @@ -184,7 +184,7 @@ Экспорт отменен Убедитесь что папки пользовательских данных находятся в корне zip-папки и содержат файл конфигурации config/config.ini и повторите попытку. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -463,8 +463,8 @@ Ваш ROM зашифрованный - или установленные игры.]]> - prod.keys установлен, чтобы игры можно было расшифровать.]]> + или установленные игры.]]> + prod.keys установлен, чтобы игры можно было расшифровать.]]> Произошла ошибка при инициализации видеоядра. Обычно это вызвано несовместимым драйвером ГП. Установка пользовательского драйвера ГП может решить эту проблему. Не удалось запустить ROM diff --git a/src/android/app/src/main/res/values-uk/strings.xml b/src/android/app/src/main/res/values-uk/strings.xml index 4b212d8bc0..9b8c71ccfd 100644 --- a/src/android/app/src/main/res/values-uk/strings.xml +++ b/src/android/app/src/main/res/values-uk/strings.xml @@ -1,7 +1,7 @@ - Це програмне забезпечення дозволяє запускати ігри для ігрової консолі Nintendo Switch. Ми не надаємо самі ігри або ключі.<br /><br />Перед початком роботи знайдіть ваш файл prod.keys ]]> у сховищі пристрою.<br /><br />Дізнатися більше]]> + Це програмне забезпечення дозволяє запускати ігри для ігрової консолі Nintendo Switch. Ми не надаємо самі ігри або ключі.<br /><br />Перед початком роботи знайдіть ваш файл prod.keys ]]> у сховищі пристрою.<br /><br />Дізнатися більше]]> Сповіщення та помилки Показувати сповіщення, коли щось пішло не так Ви не надали дозвіл сповіщень! @@ -32,14 +32,14 @@ Дозволяє suyu заповнити список ігор Пропустити вибір папки з іграми? Ігри не відображатимуться у списку Ігри, якщо папку не вибрано. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Знайти ігри Вибрано папку з іграми Встановити prod.keys Потрібно для розшифровки роздрібних ігор Пропустити додавання ключів? Для емуляції роздрібних ігор потрібні дійсні ключі. Якщо ви продовжите, працюватимуть тільки homebrew додатки. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Сповіщення Надайте дозвіл сповіщень за допомогою кнопки нижче. Надати дозвіл @@ -59,7 +59,7 @@ Помилка під час зчитування ключів шифрування Переконайтеся, що файл ключів має розширення .keys, і повторіть спробу. Невірні ключі шифрування - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Обраний файл невірний або пошкоджений. Будь ласка, пере-дампіть ваші ключі. Встановити драйвер ГП Встановіть альтернативні драйвери для потенційно кращої продуктивності та/або точності @@ -81,7 +81,7 @@ Назва першої вкладеної папки має бути ідентифікатором гри. Імпорт Експорт - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Gaia не існує @@ -92,7 +92,7 @@ https://github.com/suyu-emu/suyu/graphs/contributors Збірка https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -214,7 +214,7 @@ Доповнення Ваш ROM зашифрований - prod.keys встановлено, щоб ігри можна було розшифрувати.]]> + prod.keys встановлено, щоб ігри можна було розшифрувати.]]> Сталася помилка під час ініціалізації відеоядра. Зазвичай це спричинено несумісним драйвером ГП. Встановлення користувацького драйвера ГП може вирішити цю проблему. Не вдалося запустити ROM diff --git a/src/android/app/src/main/res/values-vi/strings.xml b/src/android/app/src/main/res/values-vi/strings.xml index 6355582cb0..4c0446fc96 100644 --- a/src/android/app/src/main/res/values-vi/strings.xml +++ b/src/android/app/src/main/res/values-vi/strings.xml @@ -1,7 +1,7 @@ - Phần mềm này sẽ chạy trò chơi cho máy chơi game Nintendo Switch. Không có game titles hoặc keys được bao gồm.<br /><br />Trước khi bạn bắt đầu, hãy tìm file prod.keys ]]> trên bộ nhớ thiết bị của bạn.<br /><br />Tìm hiểu thêm]]> + Phần mềm này sẽ chạy trò chơi cho máy chơi game Nintendo Switch. Không có game titles hoặc keys được bao gồm.<br /><br />Trước khi bạn bắt đầu, hãy tìm file prod.keys ]]> trên bộ nhớ thiết bị của bạn.<br /><br />Tìm hiểu thêm]]> Thông báo và lỗi Hiển thị thông báo khi có sự cố xảy ra Ứng dụng không được cấp quyền thông báo! @@ -32,14 +32,14 @@ Cho phép suyu thêm các trò chơi vào danh sách Bỏ qua lựa chọn thư mục trò chơi? Trò chơi sẽ không hiển thị trong danh sách nếu một thư mục không được chọn - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Tìm kiếm games Thư mục trò chơi đã được chọn Cài prod.keys Yêu cầu để giải mã các game bán lẻ Bỏ qua thêm chìa khóa? Cần có chìa khóa hợp lệ để giả lập trò chơi. Chỉ có các ứng dụng homebrew có thể vận hành nếu bạn tiếp tục - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Thông báo Ấn vào nút bên dưới để cấp quyền ứng dụng gửi thông báo Cấp quyền @@ -60,7 +60,7 @@ Xác minh rằng tệp keys của bạn có đuôi .keys và thử lại. Xác minh rằng tệp keys của bạn có đuôi .bin và thử lại. Keys mã hoá không hợp lệ - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Chọn file sai hoặc bị hỏng. Hãy xuất chìa khóa khác Cài đặt driver GPU Cài đặt driver thay thế để có thể có hiệu suất tốt và chính xác hơn @@ -94,8 +94,8 @@ Không tìm thấy tệp log Cài đặt nội dung game Cài đặt cập nhật game hoặc DLC - https://suyu-emu.org/help/quickstart/#dumping-installed-updates - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-decryption-keys Gaia không có thật @@ -107,7 +107,7 @@ Các dự án làm cho suyu trên Android trở thành điều có thể Dựng https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -259,7 +259,7 @@ Kiểm tra tính toàn vẹn thất bại! ROM của bạn đã bị mã hoá - prod.keys đã được cài đặt để game có thể được giải mã.]]> + prod.keys đã được cài đặt để game có thể được giải mã.]]> Đã xảy ra lỗi khi khởi tạo lõi video Việc này thường do driver GPU không tương thích. Cài đặt một driver GPU tùy chỉnh có thể giải quyết vấn đề này. Không thể tải ROM diff --git a/src/android/app/src/main/res/values-zh-rCN/strings.xml b/src/android/app/src/main/res/values-zh-rCN/strings.xml index 3ad450e1c9..1cecb2bbf8 100644 --- a/src/android/app/src/main/res/values-zh-rCN/strings.xml +++ b/src/android/app/src/main/res/values-zh-rCN/strings.xml @@ -1,7 +1,7 @@ - 此软件可以运行 Nintendo Switch 游戏,但不包含任何游戏和密钥文件。<br /><br />在开始前,请找到放置于设备存储中的 prod.keys ]]> 文件。<br /><br />了解更多]]> + 此软件可以运行 Nintendo Switch 游戏,但不包含任何游戏和密钥文件。<br /><br />在开始前,请找到放置于设备存储中的 prod.keys ]]> 文件。<br /><br />了解更多]]> 通知及错误提醒 当发生错误时显示通知。 未授予通知权限! @@ -35,7 +35,7 @@ 允许 suyu 更新游戏列表 跳过选择游戏文件夹? 如果未选择游戏文件夹,游戏将不会显示在游戏列表中。 - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games 搜索游戏 搜索设置 已选择游戏文件夹 @@ -43,7 +43,7 @@ 需要密钥文件来解密游戏 跳过添加密钥文件? 对于商业游戏,需要有效的密钥文件才能运行。如果没有密钥文件,将只能运行自制软件。 - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction 通知 使用下方的按钮授予通知权限。 授予权限 @@ -64,7 +64,7 @@ 请确保您的密钥文件扩展名为 .keys 并重试。 请确保您的密钥文件扩展名为 .bin 并重试。 无效的加密密钥 - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys 选择的密钥文件不正确或已损坏。请重新转储密钥文件。 GPU 驱动管理器 安装 GPU 驱动 @@ -114,7 +114,7 @@ 游戏附加内容已成功安装 %1$d 个包安装成功 %1$d 个包覆盖安装成功 - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates 不支持自定义驱动 此设备不支持自定义驱动。\n请之后再访问此项,查看是否已为此设备添加支持。 管理 suyu 数据 @@ -137,14 +137,14 @@ 检查所有安装的内容是否有损坏 密钥缺失 无法解密固件和商业游戏 - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys 小程序启动器 使用已安装的固件启动系统小程序 未安装固件 小程序不可用 - prod.keys 文件和固件已安装,然后再试一次。]]> + prod.keys 文件和固件已安装,然后再试一次。]]> 相册 查看存储在用户屏幕截图文件夹中的图像 Mii edit @@ -177,7 +177,7 @@ 已取消导出数据 请确保用户数据文件夹位于 zip 压缩包的根目录,并在 config/config.ini 路径中包含配置文件,然后重试。 https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -456,8 +456,8 @@ 您的 ROM 已加密 - 游戏卡带或已安装的游戏。]]> - prod.keys 文件已安装,使得游戏可以被解密。]]> + 游戏卡带或已安装的游戏。]]> + prod.keys 文件已安装,使得游戏可以被解密。]]> 初始化视频核心时发生错误 这通常由不兼容的 GPU 驱动程序造成,安装自定义 GPU 驱动程序可能解决此问题。 无法载入 ROM diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml index 06e23d4c4e..4b2926a95f 100644 --- a/src/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml @@ -1,7 +1,7 @@ - 此軟體可以執行 Nintendo Switch 主機遊戲,但不包含任何遊戲和金鑰。<br /><br />在您開始前,請找到放置於您的裝置儲存空間的 prod.keys ]]> 檔案。<br /><br />深入瞭解]]> + 此軟體可以執行 Nintendo Switch 主機遊戲,但不包含任何遊戲和金鑰。<br /><br />在您開始前,請找到放置於您的裝置儲存空間的 prod.keys ]]> 檔案。<br /><br />深入瞭解]]> 通知和錯誤 發生錯誤時顯示通知。 未授予通知權限! @@ -35,7 +35,7 @@ 允許 suyu 填入遊戲清單 跳過選取遊戲資料夾? 如果資料夾未選取,遊戲將不會顯示在遊戲清單。 - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games 搜尋遊戲 搜尋設定 遊戲目錄已選取 @@ -43,7 +43,7 @@ 需要解密零售遊戲 跳過新增金鑰? 模擬零售遊戲需要有效的金鑰,若要繼續,將僅有自製遊戲應用程式可以運作。 - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction 通知 使用下方的按鈕授予通知權限。 授予權限 @@ -64,7 +64,7 @@ 驗證您的金鑰檔案是否具有 .keys 副檔名並再試一次。 驗證您的金鑰檔案是否具有 .bin 副檔名並再試一次。 無效的加密金鑰 - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys 選取的檔案不正確或已損毀,請重新傾印您的金鑰。 GPU 驅動程式管理員 安裝 GPU 驅動程式 @@ -114,7 +114,7 @@ 遊戲內容已成功安裝 %1$d 安裝成功 %1$d 覆寫成功 - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates 不支援自訂的驅動程式 此裝置不支援自訂的驅動程式。\n請以後再來查看是否已新增支援! 管理 suyu 資料 @@ -137,14 +137,14 @@ 检查所有安装的内容是否有损坏 密钥缺失 无法解密固件和商业游戏 - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys 小程式啟動器 使用已安裝的韌體啟動系統小程式 未安裝韌體 無法使用小程式 - prod.keys 檔案和韌體已安裝,然後再試一次。]]> + prod.keys 檔案和韌體已安裝,然後再試一次。]]> 相簿 使用系統相片檢視器查看儲存在使用者螢幕截圖資料夾中的影像 Mii 編輯 @@ -177,7 +177,7 @@ 匯出已取消 請確保使用者資料夾位於 zip 壓縮檔的根目錄,並在 config/config.ini 路徑中包含組態檔案,並再試一次。 https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -456,8 +456,8 @@ 您的 ROM 已加密 - 遊戲卡匣或已安裝的遊戲。]]> - prod.keys 檔案已安裝,讓遊戲可以解密。]]> + 遊戲卡匣或已安裝的遊戲。]]> + prod.keys 檔案已安裝,讓遊戲可以解密。]]> 初始化視訊核心時發生錯誤 這經常由不相容的 GPU 驅動程式造成,安裝自訂 GPU 驅動程式可能會解決此問題。 無法載入 ROM diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 5331f2b419..da9c9d2cf8 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -3,7 +3,7 @@ suyu - This software will run games for the Nintendo Switch game console. No game titles or keys are included.<br /><br />Before you begin, please locate your prod.keys ]]> file on your device storage.<br /><br />Learn more]]> + This software will run games for the Nintendo Switch game console. No game titles or keys are included.<br /><br />Before you begin, please locate your prod.keys ]]> file on your device storage.<br /><br />Learn more]]> Notices and errors noticesAndErrors Shows notifications when something goes wrong. @@ -38,7 +38,7 @@ Allows suyu to populate the games list Skip selecting games folder? Games won\'t be displayed in the Games list if a folder isn\'t selected. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Search games Search settings Games directory selected @@ -46,7 +46,7 @@ Required to decrypt retail games Skip adding keys? Valid keys are required to emulate retail games. Only homebrew apps will function if you continue. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Notifications Grant the notification permission with the button below. Grant permission @@ -67,7 +67,7 @@ Verify your keys file has a .keys extension and try again. Verify your keys file has a .bin extension and try again. Invalid encryption keys - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys The selected file is incorrect or corrupt. Please redump your keys. GPU driver manager Install GPU driver @@ -117,7 +117,7 @@ Game content(s) installed successfully %1$d installed successfully %1$d overwritten successfully - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates Custom drivers not supported Custom driver loading isn\'t currently supported for this device.\nCheck this option again in the future to see if support was added! Manage suyu data @@ -142,7 +142,7 @@ Checks all installed content for corruption Encryption keys are missing Firmware and retail games cannot be decrypted - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Qlaunch @@ -151,7 +151,7 @@ Launch system applets using installed firmware Firmware not installed Applet not available - prod.keys file and firmware are installed and try again.]]> + prod.keys file and firmware are installed and try again.]]> Album See images stored in the user screenshots folder with the system photo viewer Mii edit @@ -184,7 +184,7 @@ Export cancelled Make sure the user data folders are at the root of the zip folder and contain a config file at config/config.ini and try again. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -463,8 +463,8 @@ Your ROM is encrypted - game cartidges or installed titles.]]> - prod.keys file is installed so that games can be decrypted.]]> + game cartidges or installed titles.]]> + prod.keys file is installed so that games can be decrypted.]]> An error occurred initializing the video core This is usually caused by an incompatible GPU driver. Installing a custom GPU driver may resolve this problem. Unable to load ROM diff --git a/src/common/android/applets/software_keyboard.cpp b/src/common/android/applets/software_keyboard.cpp index 2f0c58227a..8a49ff0442 100644 --- a/src/common/android/applets/software_keyboard.cpp +++ b/src/common/android/applets/software_keyboard.cpp @@ -253,19 +253,19 @@ void AndroidKeyboard::SubmitNormalText(const ResultData& data) const { void InitJNI(JNIEnv* env) { s_software_keyboard_class = reinterpret_cast( - env->NewGlobalRef(env->FindClass("org/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard"))); + env->NewGlobalRef(env->FindClass("dev/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard"))); s_keyboard_config_class = reinterpret_cast(env->NewGlobalRef( - env->FindClass("org/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard$KeyboardConfig"))); + env->FindClass("dev/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard$KeyboardConfig"))); s_keyboard_data_class = reinterpret_cast(env->NewGlobalRef( - env->FindClass("org/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard$KeyboardData"))); + env->FindClass("dev/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard$KeyboardData"))); s_swkbd_execute_normal = env->GetStaticMethodID( s_software_keyboard_class, "executeNormal", - "(Lorg/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard$KeyboardConfig;)Lorg/suyu/suyu_emu/" + "(Ldev/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard$KeyboardConfig;)Ldev/suyu/suyu_emu/" "applets/keyboard/SoftwareKeyboard$KeyboardData;"); s_swkbd_execute_inline = env->GetStaticMethodID( s_software_keyboard_class, "executeInline", - "(Lorg/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard$KeyboardConfig;)V"); + "(Ldev/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard$KeyboardConfig;)V"); } void CleanupJNI(JNIEnv* env) { diff --git a/src/common/android/id_cache.cpp b/src/common/android/id_cache.cpp index 40faea9fa0..c4ef648ae5 100644 --- a/src/common/android/id_cache.cpp +++ b/src/common/android/id_cache.cpp @@ -400,14 +400,14 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) { return JNI_ERR; // Initialize Java classes - const jclass native_library_class = env->FindClass("org/suyu/suyu_emu/NativeLibrary"); + const jclass native_library_class = env->FindClass("dev/suyu/suyu_emu/NativeLibrary"); s_native_library_class = reinterpret_cast(env->NewGlobalRef(native_library_class)); s_disk_cache_progress_class = reinterpret_cast(env->NewGlobalRef( - env->FindClass("org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress"))); + env->FindClass("dev/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress"))); s_load_callback_stage_class = reinterpret_cast(env->NewGlobalRef(env->FindClass( - "org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress$LoadCallbackStage"))); + "dev/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress$LoadCallbackStage"))); - const jclass game_dir_class = env->FindClass("org/suyu/suyu_emu/model/GameDir"); + const jclass game_dir_class = env->FindClass("dev/suyu/suyu_emu/model/GameDir"); s_game_dir_class = reinterpret_cast(env->NewGlobalRef(game_dir_class)); s_game_dir_constructor = env->GetMethodID(game_dir_class, "", "(Ljava/lang/String;Z)V"); env->DeleteLocalRef(game_dir_class); @@ -424,7 +424,7 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) { s_on_program_changed = env->GetStaticMethodID(s_native_library_class, "onProgramChanged", "(I)V"); - const jclass game_class = env->FindClass("org/suyu/suyu_emu/model/Game"); + const jclass game_class = env->FindClass("dev/suyu/suyu_emu/model/Game"); s_game_class = reinterpret_cast(env->NewGlobalRef(game_class)); s_game_constructor = env->GetMethodID(game_class, "", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/" @@ -450,7 +450,7 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) { env->DeleteLocalRef(pair_class); const jclass overlay_control_data_class = - env->FindClass("org/suyu/suyu_emu/overlay/model/OverlayControlData"); + env->FindClass("dev/suyu/suyu_emu/overlay/model/OverlayControlData"); s_overlay_control_data_class = reinterpret_cast(env->NewGlobalRef(overlay_control_data_class)); s_overlay_control_data_constructor = @@ -468,7 +468,7 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) { env->GetFieldID(overlay_control_data_class, "foldablePosition", "Lkotlin/Pair;"); env->DeleteLocalRef(overlay_control_data_class); - const jclass patch_class = env->FindClass("org/suyu/suyu_emu/model/Patch"); + const jclass patch_class = env->FindClass("dev/suyu/suyu_emu/model/Patch"); s_patch_class = reinterpret_cast(env->NewGlobalRef(patch_class)); s_patch_constructor = env->GetMethodID( patch_class, "", @@ -500,7 +500,7 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) { env->DeleteLocalRef(boolean_class); const jclass player_input_class = - env->FindClass("org/suyu/suyu_emu/features/input/model/PlayerInput"); + env->FindClass("dev/suyu/suyu_emu/features/input/model/PlayerInput"); s_player_input_class = reinterpret_cast(env->NewGlobalRef(player_input_class)); s_player_input_constructor = env->GetMethodID( player_input_class, "", @@ -531,7 +531,7 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) { env->DeleteLocalRef(player_input_class); const jclass suyu_input_device_interface = - env->FindClass("org/suyu/suyu_emu/features/input/SuyuInputDevice"); + env->FindClass("dev/suyu/suyu_emu/features/input/SuyuInputDevice"); s_suyu_input_device_interface = reinterpret_cast(env->NewGlobalRef(suyu_input_device_interface)); s_suyu_input_device_get_name = diff --git a/src/suyu/about_dialog.cpp b/src/suyu/about_dialog.cpp index 40c99f91b7..d5f05b4a2a 100644 --- a/src/suyu/about_dialog.cpp +++ b/src/suyu/about_dialog.cpp @@ -20,7 +20,7 @@ AboutDialog::AboutDialog(QWidget* parent) ui->setupUi(this); // Try and request the icon from Qt theme (Linux?) - const QIcon suyu_logo = QIcon::fromTheme(QStringLiteral("org.suyu_emu.suyu")); + const QIcon suyu_logo = QIcon::fromTheme(QStringLiteral("dev.suyu_emu.suyu")); if (!suyu_logo.isNull()) { ui->labelLogo->setPixmap(suyu_logo.pixmap(200)); } diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index 9a3ee7f662..a7a61f5cb3 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -5080,7 +5080,7 @@ int main(int argc, char* argv[]) { // Fix the Wayland appId. This needs to match the name of the .desktop file without the .desktop // suffix. - QGuiApplication::setDesktopFileName(QStringLiteral("org.suyu_emu.suyu")); + QGuiApplication::setDesktopFileName(QStringLiteral("dev.suyu_emu.suyu")); #endif SetHighDPIAttributes(); From 70c52a1914efd409db0316270dca0f9c820ef76c Mon Sep 17 00:00:00 2001 From: lol Date: Tue, 9 Apr 2024 18:05:24 +0200 Subject: [PATCH 088/165] fix qlaunch on firmware 18 --- src/core/hle/kernel/k_page_table_base.cpp | 7 +++++++ src/core/hle/kernel/k_page_table_base.h | 4 ++++ src/core/hle/kernel/k_process_page_table.h | 3 +++ src/core/hle/kernel/svc/svc_info.cpp | 7 ++++++- src/core/hle/kernel/svc_types.h | 6 +++++- src/core/hle/service/acc/acc.cpp | 19 +++++++++++++++++-- 6 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/core/hle/kernel/k_page_table_base.cpp b/src/core/hle/kernel/k_page_table_base.cpp index 7714717f74..e67105dea4 100644 --- a/src/core/hle/kernel/k_page_table_base.cpp +++ b/src/core/hle/kernel/k_page_table_base.cpp @@ -172,6 +172,7 @@ Result KPageTableBase::InitializeForKernel(bool is_64_bit, KVirtualAddress start m_mapped_unsafe_physical_memory = 0; m_mapped_insecure_memory = 0; m_mapped_ipc_server_memory = 0; + m_alias_region_extra_size = 0; m_memory_block_slab_manager = m_kernel.GetSystemSystemResource().GetMemoryBlockSlabManagerPointer(); @@ -269,6 +270,12 @@ Result KPageTableBase::InitializeForProcess(Svc::CreateProcessFlag as_type, bool process_code_end = m_code_region_end; } + m_alias_region_extra_size = 0; + if (as_type == Svc::CreateProcessFlag::EnableReservedRegionExtraSize) { + m_alias_region_extra_size = GetAddressSpaceSize() / 8; + alias_region_size += m_alias_region_extra_size; + } + // Set other basic fields. m_enable_aslr = enable_aslr; m_enable_device_address_space_merge = enable_das_merge; diff --git a/src/core/hle/kernel/k_page_table_base.h b/src/core/hle/kernel/k_page_table_base.h index 37c745d14a..d944306b70 100644 --- a/src/core/hle/kernel/k_page_table_base.h +++ b/src/core/hle/kernel/k_page_table_base.h @@ -208,6 +208,7 @@ private: size_t m_mapped_unsafe_physical_memory{}; size_t m_mapped_insecure_memory{}; size_t m_mapped_ipc_server_memory{}; + size_t m_alias_region_extra_size{}; mutable KLightLock m_general_lock; mutable KLightLock m_map_physical_memory_lock; KLightLock m_device_map_lock; @@ -682,6 +683,9 @@ public: size_t GetAliasRegionSize() const { return m_alias_region_end - m_alias_region_start; } + size_t GetReservedRegionExtraSize() const { + return m_alias_region_extra_size; + } size_t GetStackRegionSize() const { return m_stack_region_end - m_stack_region_start; } diff --git a/src/core/hle/kernel/k_process_page_table.h b/src/core/hle/kernel/k_process_page_table.h index 346d7ca083..38c5fb8162 100644 --- a/src/core/hle/kernel/k_process_page_table.h +++ b/src/core/hle/kernel/k_process_page_table.h @@ -410,6 +410,9 @@ public: size_t GetAliasRegionSize() const { return m_page_table.GetAliasRegionSize(); } + size_t GetReservedRegionExtraSize() const { + return m_page_table.GetReservedRegionExtraSize(); + } size_t GetStackRegionSize() const { return m_page_table.GetStackRegionSize(); } diff --git a/src/core/hle/kernel/svc/svc_info.cpp b/src/core/hle/kernel/svc/svc_info.cpp index 231e4d0e1b..007bb9f705 100644 --- a/src/core/hle/kernel/svc/svc_info.cpp +++ b/src/core/hle/kernel/svc/svc_info.cpp @@ -37,7 +37,8 @@ Result GetInfo(Core::System& system, u64* result, InfoType info_id_type, Handle case InfoType::TotalNonSystemMemorySize: case InfoType::UsedNonSystemMemorySize: case InfoType::IsApplication: - case InfoType::FreeThreadCount: { + case InfoType::FreeThreadCount: + case InfoType::ReservedRegionExtraSize: { R_UNLESS(info_sub_id == 0, ResultInvalidEnumValue); const auto& handle_table = GetCurrentProcess(system.Kernel()).GetHandleTable(); @@ -134,6 +135,10 @@ Result GetInfo(Core::System& system, u64* result, InfoType info_id_type, Handle } R_SUCCEED(); + case InfoType::ReservedRegionExtraSize: + *result = process->GetPageTable().GetReservedRegionExtraSize(); + R_SUCCEED(); + default: break; } diff --git a/src/core/hle/kernel/svc_types.h b/src/core/hle/kernel/svc_types.h index ab432ea78b..df92fa0089 100644 --- a/src/core/hle/kernel/svc_types.h +++ b/src/core/hle/kernel/svc_types.h @@ -153,6 +153,7 @@ enum class InfoType : u32 { ThreadTickCount = 25, IsSvcPermitted = 26, IoRegionHint = 27, + ReservedRegionExtraSize = 28, MesosphereMeta = 65000, MesosphereCurrentProcess = 65001, @@ -642,9 +643,12 @@ enum class CreateProcessFlag : u32 { // 11.x+ DisableDeviceAddressSpaceMerge. DisableDeviceAddressSpaceMerge = (1 << 12), + EnableReservedRegionExtraSize = (1 << 13), + // Mask of all flags. All = Is64Bit | AddressSpaceMask | EnableDebug | EnableAslr | IsApplication | - PoolPartitionMask | OptimizeMemoryAllocation | DisableDeviceAddressSpaceMerge, + PoolPartitionMask | OptimizeMemoryAllocation | DisableDeviceAddressSpaceMerge | + EnableReservedRegionExtraSize, }; DECLARE_ENUM_FLAG_OPERATORS(CreateProcessFlag); diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp index d0771996b7..fd7104dfee 100644 --- a/src/core/hle/service/acc/acc.cpp +++ b/src/core/hle/service/acc/acc.cpp @@ -323,7 +323,7 @@ public: {11, &IProfileCommon::LoadImage, "LoadImage"}, {20, &IProfileCommon::GetImageSize, "GetLargeImageSize"}, // 18.0.0+ {21, &IProfileCommon::LoadImage, "LoadLargeImage"}, // 18.0.0+ - {30, nullptr, "GetImageId"}, // 18.0.0+ + {30, &IProfileCommon::Unknown, "GetImageId"}, // 18.0.0+ }; RegisterHandlers(functions); @@ -494,6 +494,13 @@ protected: rb.Push(ResultSuccess); } + void Unknown(HLERequestContext& ctx) { + LOG_WARNING(Service_ACC, "(STUBBED) called"); + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(0); + } + ProfileManager& profile_manager; Common::UUID user_id{}; ///< The user id this profile refers to. }; @@ -509,7 +516,15 @@ class IProfileEditor final : public IProfileCommon { public: explicit IProfileEditor(Core::System& system_, Common::UUID user_id_, ProfileManager& profile_manager_) - : IProfileCommon{system_, "IProfileEditor", true, user_id_, profile_manager_} {} + : IProfileCommon{system_, "IProfileEditor", true, user_id_, profile_manager_} { + // clang-format off + static const FunctionInfo functions[] = { + {30, &IProfileEditor::Unknown, "Unknown"}, + }; + // clang-format on + + RegisterHandlers(functions); + } }; class ISessionObject final : public ServiceFramework { From 96f822d13f08a225b3505e5e89555d59961b0be3 Mon Sep 17 00:00:00 2001 From: zqpvr01 Date: Thu, 11 Apr 2024 03:41:07 +0200 Subject: [PATCH 089/165] Remove discord --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 703b475e78..65d887ed06 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ It is written in C++ with portability in mind, and we're actively working on bui

- Discord | + Matrix | Status | Development | Downloads | @@ -77,7 +77,7 @@ We have official builds [here.](https://git.suyu.dev/suyu/suyu/releases) If any ## Support -If you have any questions, don't hesitate to ask us on [Discord](https://discord.gg/suyu). We don't bite! +If you have any questions, don't hesitate to ask us on [Matrix](https://chat.suyu.dev). We don't bite! ## License From 73e135bf4a56aea8552e31afb7f4a6f354196c97 Mon Sep 17 00:00:00 2001 From: zqpvr01 Date: Thu, 11 Apr 2024 03:42:30 +0200 Subject: [PATCH 090/165] Remove discord (2) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 65d887ed06..6abd4264d8 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ SPDX-License-Identifier: GPL-3.0-or-later **Note**: We do not support or condone piracy in any form. In order to use suyu, you'll need keys from your real Switch system, and games which you have legally obtained and paid for. We do not intend to make money or profit from this project. -We're in need of developers. Please join our Discord server below if you want to contribute! +We're in need of developers. Please join our Matrix below if you want to contribute! This repo is based on Yuzu EA 4176.


From 2b16baf506886ab7df9c4df0b48ae43e047aa593 Mon Sep 17 00:00:00 2001 From: zqpvr01 Date: Thu, 11 Apr 2024 03:44:08 +0200 Subject: [PATCH 091/165] Remove discord (3) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6abd4264d8..fc456c50f5 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ We currently have builds over at the [Releases](https://git.suyu.dev/suyu/suyu/r This project is completely free and open source, and anyone can contribute to help improve suyu. -Most of the development happens on GitLab. For development discussion, please join us on [Discord](https://discord.gg/suyu). +Most of the development happens on GitLab. For development discussion, please join us on [Matrix](https://chat.suyu.dev). If you want to contribute, please take a look at the [Contributor's Guide](https://git.suyu.dev/suyu/suyu/wiki/Contributing) and [Developer Information](https://git.suyu.dev/suyu/suyu/wiki/Developer-Information). You can also contact any of the developers on Discord to learn more about the current state of suyu. From fb7802aaf4862f52ec78fd03fac0a27e927c4b5e Mon Sep 17 00:00:00 2001 From: flodavid Date: Thu, 11 Apr 2024 10:19:20 -0700 Subject: [PATCH 092/165] WIP: fix macOS style when OS dark mode is active --- src/suyu/main.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index 13089859f2..300eb0819a 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -4851,6 +4851,7 @@ void GMainWindow::UpdateIcons(const QString& theme_path) { } bool GMainWindow::TryLoadStylesheet(const QString& theme_uri) { + LOG_DEBUG(Frontend, "TryLoadStylesheet()"); QString style_path; // Use themed stylesheet if it exists @@ -4900,6 +4901,7 @@ static void AdjustLinkColor() { } void GMainWindow::UpdateThemePalette() { + LOG_DEBUG(Frontend, "UpdateThemePalette()"); QPalette themePalette(qApp->palette()); #ifdef _WIN32 QColor dark(25, 25, 25); @@ -4955,6 +4957,33 @@ void GMainWindow::UpdateThemePalette() { } LOG_DEBUG(Frontend, "Using style: {}", style_name.toStdString()); qApp->setStyle(style_name); +#elif defined(__APPLE__) + // Force the usage of the light palette in light mode + if (CheckDarkMode()) { + // Reset dark palette + themePalette = this->style()->standardPalette(); + } else { + themePalette.setColor(QPalette::Window, QColor(236, 236, 236)); + themePalette.setColor(QPalette::WindowText, Qt::black); + themePalette.setColor(QPalette::Disabled, QPalette::WindowText, Qt::black); + themePalette.setColor(QPalette::Base, Qt::white); + themePalette.setColor(QPalette::AlternateBase, QColor(245, 245, 245)); + themePalette.setColor(QPalette::ToolTipBase, Qt::white); + themePalette.setColor(QPalette::ToolTipText, Qt::black); + themePalette.setColor(QPalette::Text, Qt::black); + themePalette.setColor(QPalette::Disabled, QPalette::Text, Qt::black); + themePalette.setColor(QPalette::Dark, QColor(191, 191, 191)); + themePalette.setColor(QPalette::Shadow, Qt::black); + themePalette.setColor(QPalette::Button, QColor(236, 236, 236)); + themePalette.setColor(QPalette::ButtonText, Qt::black); + themePalette.setColor(QPalette::Disabled, QPalette::ButtonText, QColor(147, 147, 147)); + themePalette.setColor(QPalette::BrightText, Qt::white); + themePalette.setColor(QPalette::Link, QColor(0, 140, 200)); + themePalette.setColor(QPalette::Highlight, QColor(179, 215, 255)); + themePalette.setColor(QPalette::Disabled, QPalette::Highlight, QColor(220, 220, 220)); + themePalette.setColor(QPalette::HighlightedText, Qt::black); + themePalette.setColor(QPalette::Disabled, QPalette::HighlightedText, Qt::black); + } #else if (CheckDarkMode()) { // Set Dark palette on non Windows platforms (that may not have a dark palette) From 526e1d7a76b572b694d2e451620ede4a70bff86c Mon Sep 17 00:00:00 2001 From: administrator Date: Fri, 12 Apr 2024 15:15:29 +0200 Subject: [PATCH 093/165] Change Matrix to chat --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index fc456c50f5..5baba68ea9 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ SPDX-License-Identifier: GPL-3.0-or-later **Note**: We do not support or condone piracy in any form. In order to use suyu, you'll need keys from your real Switch system, and games which you have legally obtained and paid for. We do not intend to make money or profit from this project. -We're in need of developers. Please join our Matrix below if you want to contribute! +We're in need of developers. Please join our chat below if you want to contribute! This repo is based on Yuzu EA 4176.
@@ -25,7 +25,7 @@ It is written in C++ with portability in mind, and we're actively working on bui

- Matrix | + Chat | Status | Development | Downloads | @@ -48,7 +48,7 @@ We currently have builds over at the [Releases](https://git.suyu.dev/suyu/suyu/r This project is completely free and open source, and anyone can contribute to help improve suyu. -Most of the development happens on GitLab. For development discussion, please join us on [Matrix](https://chat.suyu.dev). +Most of the development happens on GitLab. For development discussion, please join us in our [Chat](https://chat.suyu.dev). If you want to contribute, please take a look at the [Contributor's Guide](https://git.suyu.dev/suyu/suyu/wiki/Contributing) and [Developer Information](https://git.suyu.dev/suyu/suyu/wiki/Developer-Information). You can also contact any of the developers on Discord to learn more about the current state of suyu. @@ -77,7 +77,7 @@ We have official builds [here.](https://git.suyu.dev/suyu/suyu/releases) If any ## Support -If you have any questions, don't hesitate to ask us on [Matrix](https://chat.suyu.dev). We don't bite! +If you have any questions, don't hesitate to ask us in our [chat](https://chat.suyu.dev). We don't bite! ## License From 0db28c44c09a30e4815728a8e78dede480fa7612 Mon Sep 17 00:00:00 2001 From: administrator Date: Wed, 17 Apr 2024 02:13:24 +0200 Subject: [PATCH 094/165] Replace Discord with suyu chat in issue template Fixes https://git.suyu.dev/suyu/suyu/issues/139 --- .forgejo/ISSUE_TEMPLATE/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.forgejo/ISSUE_TEMPLATE/config.yml b/.forgejo/ISSUE_TEMPLATE/config.yml index 0be63fdb7a..1a365db1a9 100644 --- a/.forgejo/ISSUE_TEMPLATE/config.yml +++ b/.forgejo/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,5 @@ blank_issues_enabled: false contact_links: - - name: suyu Discord - url: https://discord.com/invite/suyu - about: If you are experiencing an issue with suyu, and you need tech support, or if you have a general question, try asking in the official suyu Discord linked here. Piracy is not allowed. + - name: suyu chat + url: https://chat.suyu.dev/ + about: If you are experiencing an issue with suyu, and you need tech support, or if you have a general question, try asking in the official suyu chat linked here. Piracy is not allowed. From f2bf01378178a21cbc69f31c49a0597d7c763402 Mon Sep 17 00:00:00 2001 From: administrator Date: Wed, 17 Apr 2024 02:14:41 +0200 Subject: [PATCH 095/165] Replace Discord with suyu chat in issue template --- .gitea/ISSUE_TEMPLATE/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitea/ISSUE_TEMPLATE/config.yml b/.gitea/ISSUE_TEMPLATE/config.yml index 0be63fdb7a..1a365db1a9 100644 --- a/.gitea/ISSUE_TEMPLATE/config.yml +++ b/.gitea/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,5 @@ blank_issues_enabled: false contact_links: - - name: suyu Discord - url: https://discord.com/invite/suyu - about: If you are experiencing an issue with suyu, and you need tech support, or if you have a general question, try asking in the official suyu Discord linked here. Piracy is not allowed. + - name: suyu chat + url: https://chat.suyu.dev/ + about: If you are experiencing an issue with suyu, and you need tech support, or if you have a general question, try asking in the official suyu chat linked here. Piracy is not allowed. From cb2c4446b70fefba5b64ec46f9d98e42ae74cc40 Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Wed, 17 Apr 2024 17:50:32 +0200 Subject: [PATCH 096/165] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 5baba68ea9..793e49bedc 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,8 @@ SPDX-License-Identifier: GPL-3.0-or-later We're in need of developers. Please join our chat below if you want to contribute! This repo is based on Yuzu EA 4176. +Support the original suyu developer team [here](https://discord.gg/ajz5hdrZ) +


From 3ad4fb760a9e6d0b3621b68ef8daec3d2e3db9c2 Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Wed, 17 Apr 2024 18:21:27 +0200 Subject: [PATCH 097/165] Added info --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 793e49bedc..f73d68719a 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ SPDX-License-Identifier: GPL-3.0-or-later **Note**: We do not support or condone piracy in any form. In order to use suyu, you'll need keys from your real Switch system, and games which you have legally obtained and paid for. We do not intend to make money or profit from this project. We're in need of developers. Please join our chat below if you want to contribute! -This repo is based on Yuzu EA 4176. +This repo was based on Yuzu EA 4176 but the code is being rewritten from the ground up for legal and performance reasons. Support the original suyu developer team [here](https://discord.gg/ajz5hdrZ) From d1d0fdd12b01b382fbf0e0b844a7944fe3b1d309 Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Wed, 17 Apr 2024 18:31:46 +0200 Subject: [PATCH 098/165] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f73d68719a..8b9c5880c9 100644 --- a/README.md +++ b/README.md @@ -21,9 +21,9 @@ Support the original suyu developer team [here](https://discord.gg/ajz5hdrZ)

-

suyu is the continuation of the world's most popular, open-source, Nintendo Switch emulator, yuzu. +

suyu was the continuation of the world's most popular, open-source, Nintendo Switch emulator, yuzu.
-It is written in C++ with portability in mind, and we're actively working on builds for Windows, Linux and Android. +It is written in C++ (C# possibly required soon) with portability in mind, and we're actively working on builds for Windows, Linux and Android along with a custom OS called [suyuos](https://git.suyu.dev/suyu/suyu-os).

From 6f57078cd9b59ec20ea7151f3dd238c356177705 Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Wed, 17 Apr 2024 23:20:04 +0200 Subject: [PATCH 099/165] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8b9c5880c9..0ca84ac492 100644 --- a/README.md +++ b/README.md @@ -21,9 +21,10 @@ Support the original suyu developer team [here](https://discord.gg/ajz5hdrZ)
-

suyu was the continuation of the world's most popular, open-source, Nintendo Switch emulator, yuzu. +

suyu was the continuation of the world's most popular, open-source, Nintendo Switch emulator, yuzu, but is now something greater.
-It is written in C++ (C# possibly required soon) with portability in mind, and we're actively working on builds for Windows, Linux and Android along with a custom OS called [suyuos](https://git.suyu.dev/suyu/suyu-os). +It is written in C++ (C# possibly required soon) with portability in mind, and we're actively working on builds for Windows, Linux and Android along with a custom OS called suyuos (https://git.suyu.dev/suyu/suyu-os) . +

From 15e49ee463247e7ace86da78a015e34347ad84b6 Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Wed, 17 Apr 2024 23:27:12 +0200 Subject: [PATCH 100/165] Added Ios release --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0ca84ac492..c50f5dc2eb 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,7 @@ You can also contact any of the developers on Discord to learn more about the cu * __Linux__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __macOS__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __Android__: [Releases](https://git.suyu.dev/suyu/suyu/releases) +*__IOS (Sudachi redirect)__: [Releases](https://github.com/emuPlace/Sudachi/releases) If you want daily builds then [Click here](https://git.suyu.dev/suyu/suyu/actions) If you don't know how to download the daily builds then [Click here](https://git.suyu.dev/suyu/suyu/raw/branch/dev/img/daily-builds.png) From 3f76206e9bba0fbb86f62c7a3494bd2f985e8524 Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Wed, 17 Apr 2024 23:28:26 +0200 Subject: [PATCH 101/165] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c50f5dc2eb..3a5c1dd674 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ You can also contact any of the developers on Discord to learn more about the cu * __Linux__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __macOS__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __Android__: [Releases](https://git.suyu.dev/suyu/suyu/releases) -*__IOS (Sudachi redirect)__: [Releases](https://github.com/emuPlace/Sudachi/releases) +* __IOS (Sudachi redirect)__: [Releases](https://github.com/emuPlace/Sudachi/releases) If you want daily builds then [Click here](https://git.suyu.dev/suyu/suyu/actions) If you don't know how to download the daily builds then [Click here](https://git.suyu.dev/suyu/suyu/raw/branch/dev/img/daily-builds.png) From 2083820fda59b1ed56e2941e4ec04215feecf261 Mon Sep 17 00:00:00 2001 From: Crimson Hawk Date: Thu, 18 Apr 2024 11:41:41 +0800 Subject: [PATCH 102/165] Undo some changes to readme --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3a5c1dd674..c976ef850a 100644 --- a/README.md +++ b/README.md @@ -21,9 +21,9 @@ Support the original suyu developer team [here](https://discord.gg/ajz5hdrZ)
-

suyu was the continuation of the world's most popular, open-source, Nintendo Switch emulator, yuzu, but is now something greater. +

suyu is the continuation of the world's most popular, open-source, Nintendo Switch emulator.
-It is written in C++ (C# possibly required soon) with portability in mind, and we're actively working on builds for Windows, Linux and Android along with a custom OS called suyuos (https://git.suyu.dev/suyu/suyu-os) . +It is written in C++ (C# possibly required soon) with portability in mind, we actively work on builds for Windows, Linux and Android, along with a WIP custom OS called suyuOS (https://git.suyu.dev/suyu/suyu-os) .

@@ -62,7 +62,6 @@ You can also contact any of the developers on Discord to learn more about the cu * __Linux__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __macOS__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __Android__: [Releases](https://git.suyu.dev/suyu/suyu/releases) -* __IOS (Sudachi redirect)__: [Releases](https://github.com/emuPlace/Sudachi/releases) If you want daily builds then [Click here](https://git.suyu.dev/suyu/suyu/actions) If you don't know how to download the daily builds then [Click here](https://git.suyu.dev/suyu/suyu/raw/branch/dev/img/daily-builds.png) From 97814d3e593b0827e0d79b9faa51431e55052dd2 Mon Sep 17 00:00:00 2001 From: flodavid Date: Thu, 18 Jan 2024 20:51:39 +0000 Subject: [PATCH 103/165] Load custom Qt themes from yuzu data directory - Directory is qt_themes, each theme must be in one folder - It should contain a file "style.qss" - It may contain an "icons" sub-directory, to override included icons (with files like mytheme/icons/colorful/48x48/star.png for example) - Directories ending by "_dark" are reserved for dark variant icons. They are not listed as themes in the UI. - If theme directory contains "dark" or "midnight", theme will be considered dark --- src/common/fs/fs_paths.h | 3 +- src/common/fs/path_util.cpp | 3 +- src/common/fs/path_util.h | 3 +- src/suyu/configuration/configure_ui.cpp | 27 +++++++++-- src/suyu/configuration/qt_config.cpp | 11 ++--- src/suyu/debugger/wait_tree.cpp | 5 +- src/suyu/main.cpp | 64 +++++++++++++++++-------- src/suyu/main.h | 6 +++ src/suyu/uisettings.cpp | 19 ++++---- src/suyu/uisettings.h | 23 ++++----- 10 files changed, 102 insertions(+), 62 deletions(-) diff --git a/src/common/fs/fs_paths.h b/src/common/fs/fs_paths.h index 3720976efe..de06571a6f 100644 --- a/src/common/fs/fs_paths.h +++ b/src/common/fs/fs_paths.h @@ -15,6 +15,7 @@ #define CONFIG_DIR "config" #define CRASH_DUMPS_DIR "crash_dumps" #define DUMP_DIR "dump" +#define ICONS_DIR "icons" #define KEYS_DIR "keys" #define LOAD_DIR "load" #define LOG_DIR "log" @@ -24,7 +25,7 @@ #define SDMC_DIR "sdmc" #define SHADER_DIR "shader" #define TAS_DIR "tas" -#define ICONS_DIR "icons" +#define THEMES_DIR "qt_themes" // suyu-specific files diff --git a/src/common/fs/path_util.cpp b/src/common/fs/path_util.cpp index e23f53fb9d..9362e18c39 100644 --- a/src/common/fs/path_util.cpp +++ b/src/common/fs/path_util.cpp @@ -121,6 +121,7 @@ public: GenerateSuyuPath(SuyuPath::ConfigDir, suyu_path_config); GenerateSuyuPath(SuyuPath::CrashDumpsDir, suyu_path / CRASH_DUMPS_DIR); GenerateSuyuPath(SuyuPath::DumpDir, suyu_path / DUMP_DIR); + GenerateSuyuPath(SuyuPath::IconsDir, suyu_path / ICONS_DIR); GenerateSuyuPath(SuyuPath::KeysDir, suyu_path / KEYS_DIR); GenerateSuyuPath(SuyuPath::LoadDir, suyu_path / LOAD_DIR); GenerateSuyuPath(SuyuPath::LogDir, suyu_path / LOG_DIR); @@ -130,7 +131,7 @@ public: GenerateSuyuPath(SuyuPath::SDMCDir, suyu_path / SDMC_DIR); GenerateSuyuPath(SuyuPath::ShaderDir, suyu_path / SHADER_DIR); GenerateSuyuPath(SuyuPath::TASDir, suyu_path / TAS_DIR); - GenerateSuyuPath(SuyuPath::IconsDir, suyu_path / ICONS_DIR); + GenerateSuyuPath(SuyuPath::ThemesDir, suyu_path / THEMES_DIR); } private: diff --git a/src/common/fs/path_util.h b/src/common/fs/path_util.h index 2076fbcd43..1ac4a26eea 100644 --- a/src/common/fs/path_util.h +++ b/src/common/fs/path_util.h @@ -17,6 +17,7 @@ enum class SuyuPath { ConfigDir, // Where config files are stored. CrashDumpsDir, // Where crash dumps are stored. DumpDir, // Where dumped data is stored. + IconsDir, // Where Icons for Windows shortcuts are stored. KeysDir, // Where key files are stored. LoadDir, // Where cheat/mod files are stored. LogDir, // Where log files are stored. @@ -26,7 +27,7 @@ enum class SuyuPath { SDMCDir, // Where the emulated SDMC is stored. ShaderDir, // Where shaders are stored. TASDir, // Where TAS scripts are stored. - IconsDir, // Where Icons for Windows shortcuts are stored. + ThemesDir, // Where users should put their custom themes }; /** diff --git a/src/suyu/configuration/configure_ui.cpp b/src/suyu/configuration/configure_ui.cpp index a3648c5b1c..046b34721e 100644 --- a/src/suyu/configuration/configure_ui.cpp +++ b/src/suyu/configuration/configure_ui.cpp @@ -106,11 +106,31 @@ ConfigureUi::ConfigureUi(Core::System& system_, QWidget* parent) InitializeLanguageComboBox(); - for (const auto& theme : UISettings::themes) { + for (const auto& theme : UISettings::included_themes) { ui->theme_combobox->addItem(QString::fromUtf8(theme.first), QString::fromUtf8(theme.second)); } + // Add custom styles stored in yuzu directory + const QDir themes_local_dir( + QString::fromStdString(Common::FS::GetSuyuPathString(Common::FS::SuyuPath::ThemesDir))); + for (const QString& theme_dir : + themes_local_dir.entryList(QDir::NoDot | QDir::NoDotDot | QDir::Dirs)) { + // folders ending with "_dark" are reserved for dark variant icons of other styles + if (theme_dir.endsWith(QStringLiteral("_dark"))) { + continue; + } + // Split at _ and capitalize words in name + QStringList cased_name; + for (QString word : theme_dir.split(QChar::fromLatin1('_'))) { + cased_name.append(word.at(0).toUpper() + word.mid(1)); + } + QString theme_name = cased_name.join(QChar::fromLatin1(' ')); + theme_name += QStringLiteral(" (%1)").arg(tr("Custom")); + + ui->theme_combobox->addItem(theme_name, themes_local_dir.filePath(theme_dir)); + } + InitializeIconSizeComboBox(); InitializeRowComboBoxes(); @@ -164,7 +184,7 @@ ConfigureUi::~ConfigureUi() = default; void ConfigureUi::ApplyConfiguration() { UISettings::values.theme = - ui->theme_combobox->itemData(ui->theme_combobox->currentIndex()).toString().toStdString(); + ui->theme_combobox->itemData(ui->theme_combobox->currentIndex()).toString(); UISettings::values.show_add_ons = ui->show_add_ons->isChecked(); UISettings::values.show_compat = ui->show_compat->isChecked(); UISettings::values.show_size = ui->show_size->isChecked(); @@ -191,8 +211,7 @@ void ConfigureUi::RequestGameListUpdate() { } void ConfigureUi::SetConfiguration() { - ui->theme_combobox->setCurrentIndex( - ui->theme_combobox->findData(QString::fromStdString(UISettings::values.theme))); + ui->theme_combobox->setCurrentIndex(ui->theme_combobox->findData(UISettings::values.theme)); ui->language_combobox->setCurrentIndex(ui->language_combobox->findData( QString::fromStdString(UISettings::values.language.GetValue()))); ui->show_add_ons->setChecked(UISettings::values.show_add_ons.GetValue()); diff --git a/src/suyu/configuration/qt_config.cpp b/src/suyu/configuration/qt_config.cpp index 37951b9c84..2868db4ebb 100644 --- a/src/suyu/configuration/qt_config.cpp +++ b/src/suyu/configuration/qt_config.cpp @@ -260,9 +260,8 @@ void QtConfig::ReadShortcutValues() { void QtConfig::ReadUIValues() { BeginGroup(Settings::TranslateCategory(Settings::Category::Ui)); - UISettings::values.theme = ReadStringSetting( - std::string("theme"), - std::string(UISettings::themes[static_cast(UISettings::default_theme)].second)); + UISettings::values.theme = QString::fromStdString( + ReadStringSetting(std::string("theme"), std::string(UISettings::default_theme))); ReadUIGamelistValues(); ReadUILayoutValues(); @@ -468,10 +467,8 @@ void QtConfig::SaveUIValues() { WriteCategory(Settings::Category::Ui); WriteCategory(Settings::Category::UiGeneral); - WriteStringSetting( - std::string("theme"), UISettings::values.theme, - std::make_optional(std::string( - UISettings::themes[static_cast(UISettings::default_theme)].second))); + WriteStringSetting(std::string("theme"), UISettings::values.theme.toStdString(), + std::make_optional(std::string(UISettings::default_theme))); SaveUIGamelistValues(); SaveUILayoutValues(); diff --git a/src/suyu/debugger/wait_tree.cpp b/src/suyu/debugger/wait_tree.cpp index b339862ba7..b5ee4bcfdf 100644 --- a/src/suyu/debugger/wait_tree.cpp +++ b/src/suyu/debugger/wait_tree.cpp @@ -35,9 +35,8 @@ constexpr std::array, 10> WaitTreeColors{{ }}; bool IsDarkTheme() { - const auto& theme = UISettings::values.theme; - return theme == std::string("qdarkstyle") || theme == std::string("qdarkstyle_midnight_blue") || - theme == std::string("colorful_dark") || theme == std::string("colorful_midnight_blue"); + return UISettings::values.theme.contains(QStringLiteral("dark")) || + UISettings::values.theme.contains(QStringLiteral("midnight")); } } // namespace diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index 9a3ee7f662..030e4ae511 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -3542,7 +3542,7 @@ void GMainWindow::ResetWindowSize1080() { } void GMainWindow::OnConfigure() { - const auto old_theme = UISettings::values.theme; + const QString old_theme = UISettings::values.theme; const bool old_discord_presence = UISettings::values.enable_discord_presence.GetValue(); const auto old_language_index = Settings::values.language_index.GetValue(); #ifdef __unix__ @@ -4812,9 +4812,8 @@ static void AdjustLinkColor() { } void GMainWindow::UpdateUITheme() { - const QString default_theme = QString::fromUtf8( - UISettings::themes[static_cast(UISettings::default_theme)].second); - QString current_theme = QString::fromStdString(UISettings::values.theme); + QString default_theme = QString::fromStdString(UISettings::default_theme.data()); + QString current_theme = UISettings::values.theme; if (current_theme.isEmpty()) { current_theme = default_theme; @@ -4825,6 +4824,7 @@ void GMainWindow::UpdateUITheme() { AdjustLinkColor(); #else if (current_theme == QStringLiteral("default") || current_theme == QStringLiteral("colorful")) { + LOG_INFO(Frontend, "Theme is default or colorful: {}", current_theme.toStdString()); QIcon::setThemeName(current_theme == QStringLiteral("colorful") ? current_theme : startup_icon_theme); QIcon::setThemeSearchPaths(QStringList(default_theme_paths)); @@ -4832,35 +4832,57 @@ void GMainWindow::UpdateUITheme() { current_theme = QStringLiteral("default_dark"); } } else { + LOG_INFO(Frontend, "Theme is NOT default or colorful: {}", current_theme.toStdString()); QIcon::setThemeName(current_theme); - QIcon::setThemeSearchPaths(QStringList(QStringLiteral(":/icons"))); + // Use icon resources from application binary and current theme subdirectory if it exists + QStringList theme_paths; + theme_paths << QString::fromStdString(":/icons") + << QStringLiteral("%1/%2/icons") + .arg(QString::fromStdString( + Common::FS::GetYuzuPathString(Common::FS::YuzuPath::ThemesDir)), + current_theme); + QIcon::setThemeSearchPaths(theme_paths); AdjustLinkColor(); } #endif if (current_theme != default_theme) { - QString theme_uri{QStringLiteral(":%1/style.qss").arg(current_theme)}; - QFile f(theme_uri); - if (!f.open(QFile::ReadOnly | QFile::Text)) { - LOG_ERROR(Frontend, "Unable to open style \"{}\", fallback to the default theme", - UISettings::values.theme); - current_theme = default_theme; + QString theme_uri{current_theme + QStringLiteral("style.qss")}; + if (tryLoadStylesheet(theme_uri)) { + return; } - } - QString theme_uri{QStringLiteral(":%1/style.qss").arg(current_theme)}; - QFile f(theme_uri); - if (f.open(QFile::ReadOnly | QFile::Text)) { - QTextStream ts(&f); - qApp->setStyleSheet(ts.readAll()); - setStyleSheet(ts.readAll()); - } else { + // Reading new theme failed, loading default stylesheet + LOG_ERROR(Frontend, "Unable to open style \"{}\", fallback to the default theme", + current_theme.toStdString()); + + current_theme = default_theme; + theme_uri = QStringLiteral(":%1/style.qss").arg(default_theme); + if (tryLoadStylesheet(theme_uri)) { + return; + } + + // Reading default failed, loading empty stylesheet LOG_ERROR(Frontend, "Unable to set style \"{}\", stylesheet file not found", - UISettings::values.theme); + current_theme.toStdString()); + qApp->setStyleSheet({}); setStyleSheet({}); } } +bool GMainWindow::tryLoadStylesheet(const QString& theme_path) { + QFile theme_file(theme_path); + if (theme_file.open(QFile::ReadOnly | QFile::Text)) { + LOG_INFO(Frontend, "Loading style in: {}", theme_path.toStdString()); + QTextStream ts(&theme_file); + qApp->setStyleSheet(ts.readAll()); + setStyleSheet(ts.readAll()); + return true; + } + // Opening the file failed + return false; +} + void GMainWindow::LoadTranslation() { bool loaded; @@ -4919,7 +4941,7 @@ void GMainWindow::changeEvent(QEvent* event) { // UpdateUITheme is a decent work around if (event->type() == QEvent::PaletteChange) { const QPalette test_palette(qApp->palette()); - const QString current_theme = QString::fromStdString(UISettings::values.theme); + const QString& current_theme = UISettings::values.theme; // Keeping eye on QPalette::Window to avoid looping. QPalette::Text might be useful too static QColor last_window_color; const QColor window_color = test_palette.color(QPalette::Active, QPalette::Window); diff --git a/src/suyu/main.h b/src/suyu/main.h index e20950e238..6bbcdd7c58 100644 --- a/src/suyu/main.h +++ b/src/suyu/main.h @@ -165,6 +165,12 @@ class GMainWindow : public QMainWindow { CREATE_SHORTCUT_MSGBOX_APPVOLATILE_WARNING, }; + /** + * Try to load a stylesheet from its path. If the path starts with ":/", its embedded in the app + * @returns true if the text file could be opened as read-only + */ + bool tryLoadStylesheet(const QString& theme_path); + public: void filterBarSetChecked(bool state); void UpdateUITheme(); diff --git a/src/suyu/uisettings.cpp b/src/suyu/uisettings.cpp index 60d4063c8c..e382afdf61 100644 --- a/src/suyu/uisettings.cpp +++ b/src/suyu/uisettings.cpp @@ -22,19 +22,18 @@ namespace FS = Common::FS; namespace UISettings { -const Themes themes{{ - {"Default", "default"}, - {"Default Colorful", "colorful"}, - {"Dark", "qdarkstyle"}, - {"Dark Colorful", "colorful_dark"}, - {"Midnight Blue", "qdarkstyle_midnight_blue"}, - {"Midnight Blue Colorful", "colorful_midnight_blue"}, +const Themes included_themes{{ + {"Default", ":/default/"}, + {"Default Colorful", ":/colorful/"}, + {"Dark", ":/qdarkstyle/"}, + {"Dark Colorful", ":/colorful_dark/"}, + {"Midnight Blue", ":/qdarkstyle_midnight_blue/"}, + {"Midnight Blue Colorful", ":/colorful_midnight_blue/"}, }}; bool IsDarkTheme() { - const auto& theme = UISettings::values.theme; - return theme == std::string("qdarkstyle") || theme == std::string("qdarkstyle_midnight_blue") || - theme == std::string("colorful_dark") || theme == std::string("colorful_midnight_blue"); + return UISettings::values.theme.contains(QStringLiteral("dark")) || + UISettings::values.theme.contains(QStringLiteral("midnight")); } Values values = {}; diff --git a/src/suyu/uisettings.h b/src/suyu/uisettings.h index cab889680f..7713c8c73a 100644 --- a/src/suyu/uisettings.h +++ b/src/suyu/uisettings.h @@ -35,6 +35,10 @@ extern template class Setting; namespace UISettings { +/** + * Check if the theme is dark + * @returns true if the current theme contains the string "dark" in its name + */ bool IsDarkTheme(); struct ContextualShortcut { @@ -50,25 +54,16 @@ struct Shortcut { ContextualShortcut shortcut; }; -enum class Theme { - Default, - DefaultColorful, - Dark, - DarkColorful, - MidnightBlue, - MidnightBlueColorful, -}; - -static constexpr Theme default_theme{ +static constexpr std::string_view default_theme{ #ifdef _WIN32 - Theme::DarkColorful + "colorful_dark" #else - Theme::DefaultColorful + "colorful" #endif }; using Themes = std::array, 6>; -extern const Themes themes; +extern const Themes included_themes; struct GameDir { std::string path; @@ -160,7 +155,7 @@ struct Values { QStringList recent_files; Setting language{linkage, {}, "language", Category::Paths}; - std::string theme; + QString theme; // Shortcut name std::vector shortcuts; From f01d7305c0c9b4baee31fd729db3ee48ea851bb2 Mon Sep 17 00:00:00 2001 From: flodavid Date: Sun, 4 Feb 2024 04:04:47 +0100 Subject: [PATCH 104/165] Automatic dark theme switching for Windows and Linux - Windows dark theme uses "fusion" style, which is better suited, but has minor differences - Improve OS theme detection - Linux: - Listen for OS color schemes changes on D-Bus - Read OS scheme for D-Bus. Fallback with gsettings, reading org.gnome.desktop.interface. First "color-scheme" key, then "gtk-theme". Finally, fallback to checking window palette - Windows (dark mode detection was not implemented before): - Force dark palette when OS uses dark mode by setting QT_QPA_PLATFORM to "windows:darkmode=2" - This enables to detect dark mode by checking the window palette - Improve theming capabilites: - Linux uses custom palette when dark mode is detected. By using palette(xxx) in .qss files, there is no need to create a dark stylesheet - Allow themes to have stylesheet variants, dark.qss and light.qss - If current mode is dark, use dark icons for controller and keyboard applets - Add "dark" property to RendererStatusBarButton and GPUStatusBarButton, set to true when dark mode is used. Allows to have distinct colors for GPU API and accuracy buttons depending on dark mode or not - Enable all themes to have dark icon alternatives, not just "default" and "colorful" - If dark mode, icons are loaded from the directory "THEME-NAME_dark/icons" - If current mode is dark, use dark icons for controller and keyboard applets - Only qdarkstyle, qdarkstyle_midnight_blue, colorful_dark and colorful_midnight_blue used elements specific to dark themes --- dist/qt_themes/default/style.qss | 88 +++-- src/suyu/applets/qt_controller.cpp | 16 +- src/suyu/applets/qt_software_keyboard.cpp | 4 +- src/suyu/main.cpp | 392 ++++++++++++++++------ src/suyu/main.h | 48 ++- src/suyu/startup_checks.cpp | 5 + src/suyu/uisettings.cpp | 5 - src/suyu/uisettings.h | 14 +- 8 files changed, 414 insertions(+), 158 deletions(-) diff --git a/dist/qt_themes/default/style.qss b/dist/qt_themes/default/style.qss index 921950c6c0..bd9c1964cf 100644 --- a/dist/qt_themes/default/style.qss +++ b/dist/qt_themes/default/style.qss @@ -1,3 +1,14 @@ +/* +* SPDX-FileCopyrightText: 2018 yuzu Emulator Project +* SPDX-FileCopyrightText: 2024 suyu Emulator Project +* SPDX-License-Identifier: GPL-2.0-or-later +*/ + +QWidget:item:hover { + background-color: #28668d; + color: #eff0f1; +} + QAbstractSpinBox { min-height: 19px; } @@ -94,21 +105,21 @@ QGroupBox#groupPlayer5Connected:checked, QGroupBox#groupPlayer6Connected:checked, QGroupBox#groupPlayer7Connected:checked, QGroupBox#groupPlayer8Connected:checked { - background-color: #f5f5f5; + background-color: palette(window); } QWidget#topControllerApplet { - border-bottom: 1px solid #828790 + border-bottom: 1px solid palette(dark) } QWidget#bottomPerGameInput, QWidget#bottomControllerApplet { - border-top: 1px solid #828790 + border-top: 1px solid palette(dark) } QWidget#topPerGameInput, QWidget#middleControllerApplet { - background-color: #fff; + background-color: palette(base) } QWidget#topPerGameInput QComboBox, @@ -345,7 +356,7 @@ QWidget#lineDialog { QStackedWidget#bottomOSK, QWidget#contentDialog, QWidget#contentRichDialog { - background: rgba(240, 240, 240, 1); + background: palette(base); } QWidget#contentDialog, @@ -402,6 +413,7 @@ QWidget#inputOSK QLineEdit { background: transparent; border: none; color: #ccc; + padding: 0px; } QWidget#inputBoxOSK { @@ -431,6 +443,27 @@ QWidget#boxOSK QLabel#label_characters_box { color: #ccc; } +QWidget#buttonsDialog, +QWidget#buttonsRichDialog, +QWidget#mainOSK, +QWidget#headerOSK, +QWidget#normalOSK, +QWidget#shiftOSK, +QWidget#numOSK, +QWidget#subOSK, +QWidget#inputOSK, +QWidget#inputBoxOSK, +QWidget#charactersOSK, +QWidget#charactersBoxOSK, +QWidget#legendOSK, +QWidget#legendOSK QWidget, +QWidget#legendOSKshift, +QWidget#legendOSKshift QWidget, +QWidget#legendOSKnum, +QWidget#legendOSKnum QWidget { + background: transparent; +} + QWidget#contentDialog QLabel#label_title, QWidget#contentRichDialog QLabel#label_title_rich { color: #888; @@ -471,8 +504,8 @@ QDialog#OverlayDialog QPushButton:pressed { } QDialog#QtSoftwareKeyboardDialog QPushButton { - background: rgba(232, 232, 232, 1); - border: 2px solid rgba(240, 240, 240, 1); + background: palette(window); + border: 2px solid palette(base); } QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift, @@ -481,27 +514,35 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift, QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift, QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { - background: rgba(218, 218, 218, 1); - border: 2px solid rgba(240, 240, 240, 1); + background: palette(alternate-base); + border: 2px solid palette(base); } QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { - color: rgba(240, 240, 240, 1); - background: rgba(44, 44, 44, 1); - border: 2px solid rgba(240, 240, 240, 1); + color: palette(base); + background: palette(mid); + border: 2px solid palette(base); } QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { - color: rgba(240, 240, 240, 1); - background: rgba(49, 79, 239, 1); - border: 2px solid rgba(240, 240, 240, 1); + color: palette(base); + background: palette(highlight); + border: 2px solid palette(base); } QDialog#QtSoftwareKeyboardDialog QPushButton:focus, +QDialog#QtSoftwareKeyboardDialog QPushButton:hover +{ + background: palette(base); + border: 5px solid rgba(148, 250, 202, 1); + border-radius: 6px; + outline: none; +} + QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:focus, QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:focus, QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:focus, @@ -514,8 +555,6 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:focus, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:focus, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:focus, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:focus, - -QDialog#QtSoftwareKeyboardDialog QPushButton:hover, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:hover, QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:hover, QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:hover, @@ -524,12 +563,11 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:hover, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:hover, QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift:hover, QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:hover, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:hover, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:hover { - color: rgba(0, 0, 0, 1); - background: rgba(255, 255, 255, 1); +QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:hover, +QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:hover +{ border: 5px solid rgba(148, 250, 202, 1); border-radius: 6px; outline: none; @@ -548,7 +586,7 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:pressed, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:pressed, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:pressed, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:pressed { - color: rgba(240, 240, 240, 1); + color: palette(base); background: rgba(150, 150, 150, 1); border: 5px solid rgba(148, 250, 202, 1); border-radius: 6px; @@ -653,8 +691,8 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { - color: rgba(164, 164, 164, 1); - background-color: rgba(218, 218, 218, 1); + color: palette(midlight); + background-color: palette(alternate-base); } QDialog#QtSoftwareKeyboardDialog QPushButton#button_at:disabled, @@ -671,7 +709,7 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_8:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_9:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_0:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled { - color: rgba(164, 164, 164, 1); + color: palette(midlight); } QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, diff --git a/src/suyu/applets/qt_controller.cpp b/src/suyu/applets/qt_controller.cpp index f27ab835e5..d41d23eceb 100644 --- a/src/suyu/applets/qt_controller.cpp +++ b/src/suyu/applets/qt_controller.cpp @@ -384,10 +384,12 @@ bool QtControllerSelectorDialog::CheckIfParametersMet() { void QtControllerSelectorDialog::SetSupportedControllers() { const QString theme = [] { - if (QIcon::themeName().contains(QStringLiteral("dark"))) { - return QStringLiteral("_dark"); - } else if (QIcon::themeName().contains(QStringLiteral("midnight"))) { + if (QIcon::themeName().contains(QStringLiteral("midnight"))) { return QStringLiteral("_midnight"); + } else if (GMainWindow::CheckDarkMode() || + QIcon::themeName().contains(QStringLiteral("dark"))) { + // Use dark icons if current OS mode is dark, or the theme contains "dark" in its name + return QStringLiteral("_dark"); } else { return QString{}; } @@ -572,10 +574,12 @@ void QtControllerSelectorDialog::UpdateControllerIcon(std::size_t player_index) } const QString theme = [] { - if (QIcon::themeName().contains(QStringLiteral("dark"))) { - return QStringLiteral("_dark"); - } else if (QIcon::themeName().contains(QStringLiteral("midnight"))) { + if (QIcon::themeName().contains(QStringLiteral("midnight"))) { return QStringLiteral("_midnight"); + } else if (GMainWindow::CheckDarkMode() || + QIcon::themeName().contains(QStringLiteral("dark"))) { + // Use dark icons if current OS mode is dark, or the theme contains "dark" in its name + return QStringLiteral("_dark"); } else { return QString{}; } diff --git a/src/suyu/applets/qt_software_keyboard.cpp b/src/suyu/applets/qt_software_keyboard.cpp index a1bcfa717e..ca7169e2a2 100644 --- a/src/suyu/applets/qt_software_keyboard.cpp +++ b/src/suyu/applets/qt_software_keyboard.cpp @@ -823,7 +823,9 @@ void QtSoftwareKeyboardDialog::SetControllerImage() { handheld->IsConnected() ? handheld->GetNpadStyleIndex() : player_1->GetNpadStyleIndex(); const QString theme = [] { - if (QIcon::themeName().contains(QStringLiteral("dark")) || + // Use dark icons if current OS mode is dark, or the theme contains "dark", or "midnight" in + // its name + if (GMainWindow::CheckDarkMode() || QIcon::themeName().contains(QStringLiteral("dark")) || QIcon::themeName().contains(QStringLiteral("midnight"))) { return QStringLiteral("_dark"); } else { diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index 030e4ae511..e6d14717cf 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -9,7 +9,9 @@ #include #include #include +#include #include + #include "core/hle/service/am/applet_manager.h" #include "core/loader/nca.h" #include "core/loader/nro.h" @@ -20,6 +22,9 @@ #endif #ifdef __unix__ #include +#include +#include +#include #include #include "common/linux/gamemode.h" #endif @@ -271,18 +276,6 @@ static void OverrideWindowsFont() { } #endif -bool GMainWindow::CheckDarkMode() { -#ifdef __unix__ - const QPalette test_palette(qApp->palette()); - const QColor text_color = test_palette.color(QPalette::Active, QPalette::Text); - const QColor window_color = test_palette.color(QPalette::Active, QPalette::Window); - return (text_color.value() > window_color.value()); -#else - // TODO: Windows - return false; -#endif // __unix__ -} - GMainWindow::GMainWindow(std::unique_ptr config_, bool has_broken_vulkan) : ui{std::make_unique()}, system{std::make_unique()}, input_subsystem{std::make_shared()}, config{std::move(config_)}, @@ -303,8 +296,6 @@ GMainWindow::GMainWindow(std::unique_ptr config_, bool has_broken_vulk ui->setupUi(this); statusBar()->hide(); - // Check dark mode before a theme is loaded - os_dark_mode = CheckDarkMode(); startup_icon_theme = QIcon::themeName(); // fallback can only be set once, colorful theme icons are okay on both light/dark QIcon::setFallbackThemeName(QStringLiteral("colorful")); @@ -329,6 +320,7 @@ GMainWindow::GMainWindow(std::unique_ptr config_, bool has_broken_vulk SetDefaultUIGeometry(); RestoreUIState(); + UpdateUITheme(); ConnectMenuEvents(); ConnectWidgetEvents(); @@ -449,7 +441,10 @@ GMainWindow::GMainWindow(std::unique_ptr config_, bool has_broken_vulk SDL_EnableScreenSaver(); #endif +#ifdef __unix__ SetupPrepareForSleep(); + ListenColorSchemeChange(); +#endif QStringList args = QApplication::arguments(); @@ -1647,8 +1642,8 @@ void GMainWindow::OnDisplayTitleBars(bool show) { } } -void GMainWindow::SetupPrepareForSleep() { #ifdef __unix__ +void GMainWindow::SetupPrepareForSleep() { auto bus = QDBusConnection::systemBus(); if (bus.isConnected()) { const bool success = bus.connect( @@ -1662,8 +1657,8 @@ void GMainWindow::SetupPrepareForSleep() { } else { LOG_WARNING(Frontend, "QDBusConnection system bus is not connected"); } -#endif // __unix__ } +#endif // __unix__ void GMainWindow::OnPrepareForSleep(bool prepare_sleep) { if (emu_thread == nullptr) { @@ -4799,9 +4794,106 @@ void GMainWindow::filterBarSetChecked(bool state) { emit(OnToggleFilterBar()); } +void GMainWindow::UpdateUITheme() { + LOG_DEBUG(Frontend, "Updating UI"); + QString default_theme = QString::fromStdString(UISettings::default_theme.data()); + QString current_theme = UISettings::values.theme; + if (current_theme.isEmpty()) { + current_theme = default_theme; + } + const bool current_dark_mode = CheckDarkMode(); + + UpdateIcons(current_theme); + + /* Find the stylesheet to load */ + if (TryLoadStylesheet(current_theme)) { + return; + } + + // Reading new theme failed, loading default stylesheet + LOG_ERROR(Frontend, "Unable to open style \"{}\", fallback to the default theme", + current_theme.toStdString()); + + if (TryLoadStylesheet(QStringLiteral(":/%1").arg(default_theme))) { + return; + } + + // Reading default failed, loading empty stylesheet + LOG_ERROR(Frontend, "Unable to set default style, stylesheet file not found"); + + qApp->setStyleSheet({}); + setStyleSheet({}); +} + +void GMainWindow::UpdateIcons(const QString& theme_path) { + // Get the theme directory from its path + std::size_t last_slash = theme_path.toStdString().find_last_of("/"); + QString theme_dir = QString::fromStdString(theme_path.toStdString().substr(last_slash + 1)); + + // Append _dark to the theme name to use dark variant icons + if (CheckDarkMode()) { + LOG_DEBUG(Frontend, "Using icons from: {}", theme_dir.toStdString() + "_dark"); + QIcon::setThemeName(theme_dir + QStringLiteral("_dark")); + } else { + LOG_DEBUG(Frontend, "Using icons from: {}", theme_dir.toStdString()); + QIcon::setThemeName(theme_dir); + } + + const QString theme_directory{ + QString::fromStdString(Common::FS::GetSuyuPathString(Common::FS::SuyuPath::ThemesDir))}; + + // Set path for default icons + // Use icon resources from application binary and current theme local subdirectory, if it exists + QStringList theme_paths; + theme_paths << QString::fromStdString(":/icons") << QStringLiteral("%1").arg(theme_directory); + QIcon::setThemeSearchPaths(theme_paths); + + // Change current directory, to allow user themes to add their own icons + QDir::setCurrent(QStringLiteral("%1/%2").arg(theme_directory, UISettings::values.theme)); + + emit UpdateThemedIcons(); +} + +bool GMainWindow::TryLoadStylesheet(const QString& theme_uri) { + QString style_path; + + // Use themed stylesheet if it exists + if (CheckDarkMode()) { + style_path = theme_uri + QStringLiteral("/dark.qss"); + } else { + style_path = theme_uri + QStringLiteral("/light.qss"); + } + if (!QFile::exists(style_path)) { + LOG_INFO(Frontend, "Themed (light/dark) stylesheet could not be found, using default one"); + // Use common stylesheet if themed one does not exist + style_path = theme_uri + QStringLiteral("/style.qss"); + } + + // Loading stylesheet + QFile style_file(style_path); + if (style_file.open(QFile::ReadOnly | QFile::Text)) { + // Update the color palette before applying the stylesheet + UpdateThemePalette(); + + LOG_INFO(Frontend, "Loading stylesheet in: {}", theme_uri.toStdString()); + QTextStream ts_theme(&style_file); + qApp->setStyleSheet(ts_theme.readAll()); + setStyleSheet(ts_theme.readAll()); + SetCustomStylesheet(); + + return true; + } + // Opening the file failed + return false; +} + +bool GMainWindow::TryLoadStylesheet(const std::filesystem::path& theme_path) { + return TryLoadStylesheet(QString::fromStdString(theme_path.string() + "/")); +} + static void AdjustLinkColor() { QPalette new_pal(qApp->palette()); - if (UISettings::IsDarkTheme()) { + if (GMainWindow::CheckDarkMode()) { new_pal.setColor(QPalette::Link, QColor(0, 190, 255, 255)); } else { new_pal.setColor(QPalette::Link, QColor(0, 140, 200, 255)); @@ -4811,77 +4903,201 @@ static void AdjustLinkColor() { } } -void GMainWindow::UpdateUITheme() { - QString default_theme = QString::fromStdString(UISettings::default_theme.data()); - QString current_theme = UISettings::values.theme; - - if (current_theme.isEmpty()) { - current_theme = default_theme; - } - +void GMainWindow::UpdateThemePalette() { + QPalette themePalette(qApp->palette()); #ifdef _WIN32 - QIcon::setThemeName(current_theme); - AdjustLinkColor(); -#else - if (current_theme == QStringLiteral("default") || current_theme == QStringLiteral("colorful")) { - LOG_INFO(Frontend, "Theme is default or colorful: {}", current_theme.toStdString()); - QIcon::setThemeName(current_theme == QStringLiteral("colorful") ? current_theme - : startup_icon_theme); - QIcon::setThemeSearchPaths(QStringList(default_theme_paths)); - if (CheckDarkMode()) { - current_theme = QStringLiteral("default_dark"); + QColor dark(25, 25, 25); + QColor darkGray(100, 100, 100); + QColor gray(150, 150, 150); + QColor light(230, 230, 230); + // By default, revert fusion style set for Windows dark theme + QString style; + if (CheckDarkMode()) { + // AlternateBase is kept at rgb(233, 231, 227) or rgb(245, 245, 245) on Windows dark + // palette, fix this. Sometimes, it even is rgb(0, 0, 0), but uses a very light gray for + // alternate rows, do not know why + if (themePalette.alternateBase().color() == QColor(233, 231, 227) || + themePalette.alternateBase().color() == QColor(245, 245, 245) || + themePalette.alternateBase().color() == QColor(0, 0, 0)) { + themePalette.setColor(QPalette::AlternateBase, dark); + alternate_base_modified = true; } + // Use fusion theme, since its close to windowsvista, but works well with a dark palette + style = QStringLiteral("fusion"); } else { - LOG_INFO(Frontend, "Theme is NOT default or colorful: {}", current_theme.toStdString()); - QIcon::setThemeName(current_theme); - // Use icon resources from application binary and current theme subdirectory if it exists - QStringList theme_paths; - theme_paths << QString::fromStdString(":/icons") - << QStringLiteral("%1/%2/icons") - .arg(QString::fromStdString( - Common::FS::GetYuzuPathString(Common::FS::YuzuPath::ThemesDir)), - current_theme); - QIcon::setThemeSearchPaths(theme_paths); - AdjustLinkColor(); + // Reset AlternateBase if it has been modified + if (alternate_base_modified) { + themePalette.setColor(QPalette::AlternateBase, QColor(245, 245, 245)); + alternate_base_modified = false; + } + // Reset Windows theme to the default + style = QStringLiteral("windowsvista"); + } + LOG_DEBUG(Frontend, "Using style: {}", style.toStdString()); + qApp->setStyle(style); +#else + if (CheckDarkMode()) { + // Set Dark palette on non Windows platforms (that may not have a dark palette) + LOG_INFO(Frontend, "Using custom dark palette"); + themePalette.setColor(QPalette::Window, QColor(53, 53, 53)); + themePalette.setColor(QPalette::WindowText, Qt::white); + themePalette.setColor(QPalette::Disabled, QPalette::WindowText, QColor(127, 127, 127)); + themePalette.setColor(QPalette::Base, QColor(42, 42, 42)); + themePalette.setColor(QPalette::AlternateBase, QColor(66, 66, 66)); + themePalette.setColor(QPalette::ToolTipBase, Qt::white); + themePalette.setColor(QPalette::ToolTipText, QColor(53, 53, 53)); + themePalette.setColor(QPalette::Text, Qt::white); + themePalette.setColor(QPalette::Disabled, QPalette::Text, QColor(127, 127, 127)); + themePalette.setColor(QPalette::Dark, QColor(35, 35, 35)); + themePalette.setColor(QPalette::Shadow, QColor(20, 20, 20)); + themePalette.setColor(QPalette::Button, QColor(53, 53, 53)); + themePalette.setColor(QPalette::ButtonText, Qt::white); + themePalette.setColor(QPalette::Disabled, QPalette::ButtonText, QColor(127, 127, 127)); + themePalette.setColor(QPalette::BrightText, Qt::red); + themePalette.setColor(QPalette::Link, QColor(42, 130, 218)); + themePalette.setColor(QPalette::Highlight, QColor(42, 130, 218)); + themePalette.setColor(QPalette::Disabled, QPalette::Highlight, QColor(80, 80, 80)); + themePalette.setColor(QPalette::HighlightedText, Qt::white); + themePalette.setColor(QPalette::Disabled, QPalette::HighlightedText, QColor(127, 127, 127)); + } else { + LOG_INFO(Frontend, "Using standard palette"); + // Reset light palette on non Windows platforms + themePalette = this->style()->standardPalette(); } #endif - if (current_theme != default_theme) { - QString theme_uri{current_theme + QStringLiteral("style.qss")}; - if (tryLoadStylesheet(theme_uri)) { - return; - } - - // Reading new theme failed, loading default stylesheet - LOG_ERROR(Frontend, "Unable to open style \"{}\", fallback to the default theme", - current_theme.toStdString()); - - current_theme = default_theme; - theme_uri = QStringLiteral(":%1/style.qss").arg(default_theme); - if (tryLoadStylesheet(theme_uri)) { - return; - } - - // Reading default failed, loading empty stylesheet - LOG_ERROR(Frontend, "Unable to set style \"{}\", stylesheet file not found", - current_theme.toStdString()); - - qApp->setStyleSheet({}); - setStyleSheet({}); - } + qApp->setPalette(themePalette); + AdjustLinkColor(); } -bool GMainWindow::tryLoadStylesheet(const QString& theme_path) { - QFile theme_file(theme_path); - if (theme_file.open(QFile::ReadOnly | QFile::Text)) { - LOG_INFO(Frontend, "Loading style in: {}", theme_path.toStdString()); - QTextStream ts(&theme_file); - qApp->setStyleSheet(ts.readAll()); - setStyleSheet(ts.readAll()); - return true; +void GMainWindow::SetCustomStylesheet() { + setStyleSheet(QStringLiteral("QStatusBar::item { border: none; }")); + + // Set "dark" qss property value, that may be used in stylesheets + bool is_dark_mode = CheckDarkMode(); + if (renderer_status_button) { + renderer_status_button->setProperty("dark", is_dark_mode); } - // Opening the file failed + if (gpu_accuracy_button) { + gpu_accuracy_button->setProperty("dark", is_dark_mode); + } +#ifdef _WIN32 + // Windows dark mode uses "fusion" style. Make it look like more "windowsvista" light style + if (is_dark_mode) { + /* the groove expands to the size of the slider by default. by giving it a height, it has a + fixed size */ + /* handle is placed by default on the contents rect of the groove. Negative margin expands + it outside the groove */ + setStyleSheet(QStringLiteral("QSlider:horizontal{ height:30px; }\ + QSlider::sub-page:horizontal { background-color: palette(highlight); }\ + QSlider::add-page:horizontal { background-color: palette(midlight);}\ + QSlider::groove:horizontal { border-width: 1px; margin: 1px 0; height: 2px;}\ + QSlider::handle:horizontal { border-width: 1px; border-style: solid; border-color: palette(dark);\ + width: 10px; margin: -10px 0px; }\ + QSlider::handle { background-color: palette(button); }\ + QSlider::handle:hover { background-color: palette(highlight); }")); + } +#endif +} + +#ifdef __unix__ +bool GMainWindow::ListenColorSchemeChange() { + auto bus = QDBusConnection::sessionBus(); + if (bus.isConnected()) { + const QString dbus_service = QStringLiteral("org.freedesktop.portal.Desktop"); + const QString dbus_path = QStringLiteral("/org/freedesktop/portal/desktop"); + const QString dbus_interface = QStringLiteral("org.freedesktop.portal.Settings"); + const QString dbus_method = QStringLiteral("SettingChanged"); + QStringList dbus_arguments; + dbus_arguments << QStringLiteral("org.freedesktop.appearance") + << QStringLiteral("color-scheme"); + const QString dbus_signature = QStringLiteral("ssv"); + + LOG_INFO(Frontend, "Connected to DBus, listening for OS theme changes"); + return bus.connect(dbus_service, dbus_path, dbus_interface, dbus_method, dbus_arguments, + dbus_signature, this, SLOT(UpdateUITheme())); + } + LOG_WARNING(Frontend, "Unable to connect to DBus to listen for OS theme changes"); return false; } +#endif + +bool GMainWindow::CheckDarkMode() { + const QPalette current_palette(qApp->palette()); +#ifdef __unix__ + QProcess process; + QStringList gdbus_arguments; + + // Using the freedesktop specifications for checking dark mode + LOG_INFO(Frontend, "Retrieving theme from freedesktop color-scheme..."); + gdbus_arguments << QStringLiteral("--dest=org.freedesktop.portal.Desktop") + << QStringLiteral("--object-path /org/freedesktop/portal/desktop") + << QStringLiteral("--method org.freedesktop.portal.Settings.Read " + "org.freedesktop.appearance color-scheme"); + process.start(QStringLiteral("gdbus call --session"), gdbus_arguments); + process.waitForFinished(1000); + QByteArray dbus_output = process.readAllStandardOutput(); + + if (!dbus_output.isEmpty()) { + const int systemColorSchema = QString::fromUtf8(dbus_output).trimmed().right(1).toInt(); + return systemColorSchema == 1; + } + + // Try alternative for Gnome if the previous one failed + QStringList gsettings_arguments; + gsettings_arguments << QStringLiteral("get") + << QStringLiteral("org.gnome.desktop.interface") + << QStringLiteral("color-scheme"); + + LOG_DEBUG(Frontend, "failed, retrieving theme from gsettings color-scheme..."); + process.start(QStringLiteral("gsettings"), gsettings_arguments); + process.waitForFinished(1000); + QByteArray gsettings_output = process.readAllStandardOutput(); + + // Try older gtk-theme method if the previous one failed + if (gsettings_output.isEmpty()) { + LOG_INFO(Frontend, "failed, retrieving theme from gtk-theme..."); + gsettings_arguments.takeLast(); + gsettings_arguments << QStringLiteral("gtk-theme"); + + process.start(QStringLiteral("gsettings"), gsettings_arguments); + process.waitForFinished(1000); + gsettings_output = process.readAllStandardOutput(); + } + + // Interpret gsettings value if it succeeded + if (!gsettings_output.isEmpty()) { + QString systeme_theme = QString::fromUtf8(gsettings_output); + LOG_DEBUG(Frontend, "Gsettings output: {}", systeme_theme.toStdString()); + return systeme_theme.contains(QStringLiteral("dark"), Qt::CaseInsensitive); + } + LOG_DEBUG(Frontend, "failed, retrieving theme from palette"); +#endif + // Use default method based on palette swap by OS. + // It is the only method on Windows with Qt 5. + // Windows needs QT_QPA_PLATFORM env variable set to windows:darkmode=2 to force palette change + return (current_palette.color(QPalette::WindowText).lightness() > + current_palette.color(QPalette::Window).lightness()); +} + +void GMainWindow::changeEvent(QEvent* event) { + // PaletteChange event appears to only reach so far into the GUI, explicitly asking to + // UpdateUITheme is a decent work around + if (event->type() == QEvent::PaletteChange || + event->type() == QEvent::ApplicationPaletteChange) { + LOG_INFO(Frontend, + "Window color palette changed by event: {} (QEvent::PaletteChange is: {})", + event->type(), QEvent::PaletteChange); + const QPalette test_palette(qApp->palette()); + // Keeping eye on QPalette::Window to avoid looping. QPalette::Text might be useful too + const QColor window_color = test_palette.color(QPalette::Active, QPalette::Window); + + if (last_window_color != window_color) { + last_window_color = window_color; + + UpdateUITheme(); + } + } else QWidget::changeEvent(event); +} void GMainWindow::LoadTranslation() { bool loaded; @@ -4935,26 +5151,6 @@ void GMainWindow::SetGamemodeEnabled(bool state) { } #endif -void GMainWindow::changeEvent(QEvent* event) { -#ifdef __unix__ - // PaletteChange event appears to only reach so far into the GUI, explicitly asking to - // UpdateUITheme is a decent work around - if (event->type() == QEvent::PaletteChange) { - const QPalette test_palette(qApp->palette()); - const QString& current_theme = UISettings::values.theme; - // Keeping eye on QPalette::Window to avoid looping. QPalette::Text might be useful too - static QColor last_window_color; - const QColor window_color = test_palette.color(QPalette::Active, QPalette::Window); - if (last_window_color != window_color && (current_theme == QStringLiteral("default") || - current_theme == QStringLiteral("colorful"))) { - UpdateUITheme(); - } - last_window_color = window_color; - } -#endif // __unix__ - QWidget::changeEvent(event); -} - Service::AM::FrontendAppletParameters GMainWindow::ApplicationAppletParameters() { return Service::AM::FrontendAppletParameters{ .applet_id = Service::AM::AppletId::Application, diff --git a/src/suyu/main.h b/src/suyu/main.h index 6bbcdd7c58..d0f1bd96e6 100644 --- a/src/suyu/main.h +++ b/src/suyu/main.h @@ -25,9 +25,8 @@ #include "suyu/util/controller_navigation.h" #ifdef __unix__ +#include #include -#include -#include #endif class QtConfig; @@ -165,14 +164,9 @@ class GMainWindow : public QMainWindow { CREATE_SHORTCUT_MSGBOX_APPVOLATILE_WARNING, }; - /** - * Try to load a stylesheet from its path. If the path starts with ":/", its embedded in the app - * @returns true if the text file could be opened as read-only - */ - bool tryLoadStylesheet(const QString& theme_path); - public: void filterBarSetChecked(bool state); + static bool CheckDarkMode(); void UpdateUITheme(); explicit GMainWindow(std::unique_ptr config_, bool has_broken_vulkan); ~GMainWindow() override; @@ -265,12 +259,44 @@ private: void SetDefaultUIGeometry(); void RestoreUIState(); + /** + * Load the icons used by the current theme. Use dark icons if the current mode is dark + */ + void UpdateIcons(const QString& theme_used); + /** + * Set the palette used by the stylsheet for the dark/light mode selected, according to the OS + */ + void UpdateThemePalette(); + /** + * Try to load a stylesheet from its URI. + * If the path starts with ":/", its embedded in the app, otherwise its in a local directory + * @returns true if the text file could be opened as read-only + */ + bool TryLoadStylesheet(const QString& theme_uri); + /** + * Try to load a stylesheet from filesystem path + * @returns true if the text file could be opened as read-only + */ + bool TryLoadStylesheet(const std::filesystem::path& theme_path); + /** + * Default customizations to the stylesheets + */ + void SetCustomStylesheet(); +#ifdef __unix__ + /** + * Create a signal to update the UI theme when the OS color scheme is changed + * @returns true if we could connect to dbus + */ + bool ListenColorSchemeChange(); +#endif void ConnectWidgetEvents(); void ConnectMenuEvents(); void UpdateMenuState(); +#ifdef __unix__ void SetupPrepareForSleep(); +#endif void PreventOSSleep(); void AllowOSSleep(); @@ -401,6 +427,7 @@ private slots: void ResetWindowSize720(); void ResetWindowSize900(); void ResetWindowSize1080(); + void UpdateUITheme(); void OnAlbum(); void OnCabinet(Service::NFP::CabinetMode mode); void OnMiiEdit(); @@ -447,7 +474,7 @@ private: void OpenURL(const QUrl& url); void LoadTranslation(); void OpenPerGameConfiguration(u64 title_id, const std::string& file_name); - bool CheckDarkMode(); + bool CheckSystemArchiveDecryption(); bool CheckFirmwarePresence(); void SetFirmwareVersion(); void ConfigureFilesystemProvider(const std::string& filepath); @@ -531,7 +558,8 @@ private: QTimer update_input_timer; QString startup_icon_theme; - bool os_dark_mode = false; + bool alternate_base_modified = false; + QColor last_window_color; // FS std::shared_ptr vfs; diff --git a/src/suyu/startup_checks.cpp b/src/suyu/startup_checks.cpp index 292fbcbbaa..32011f6d5c 100644 --- a/src/suyu/startup_checks.cpp +++ b/src/suyu/startup_checks.cpp @@ -5,6 +5,8 @@ #ifdef _WIN32 #include +#include +#include #include #include #elif defined(SUYU_UNIX) @@ -36,6 +38,9 @@ void CheckVulkan() { bool CheckEnvVars(bool* is_child) { #ifdef _WIN32 + // Force adapting theme to follow Windows dark mode + qputenv("QT_QPA_PLATFORM", QByteArray("windows:darkmode=2")); + // Check environment variable to see if we are the child char variable_contents[8]; const DWORD startup_check_var = diff --git a/src/suyu/uisettings.cpp b/src/suyu/uisettings.cpp index e382afdf61..8d65905104 100644 --- a/src/suyu/uisettings.cpp +++ b/src/suyu/uisettings.cpp @@ -31,11 +31,6 @@ const Themes included_themes{{ {"Midnight Blue Colorful", ":/colorful_midnight_blue/"}, }}; -bool IsDarkTheme() { - return UISettings::values.theme.contains(QStringLiteral("dark")) || - UISettings::values.theme.contains(QStringLiteral("midnight")); -} - Values values = {}; u32 CalculateWidth(u32 height, Settings::AspectRatio ratio) { diff --git a/src/suyu/uisettings.h b/src/suyu/uisettings.h index 7713c8c73a..6bb903efa7 100644 --- a/src/suyu/uisettings.h +++ b/src/suyu/uisettings.h @@ -35,12 +35,6 @@ extern template class Setting; namespace UISettings { -/** - * Check if the theme is dark - * @returns true if the current theme contains the string "dark" in its name - */ -bool IsDarkTheme(); - struct ContextualShortcut { std::string keyseq; std::string controller_keyseq; @@ -54,13 +48,7 @@ struct Shortcut { ContextualShortcut shortcut; }; -static constexpr std::string_view default_theme{ -#ifdef _WIN32 - "colorful_dark" -#else - "colorful" -#endif -}; +static constexpr std::string_view default_theme{"colorful"}; using Themes = std::array, 6>; extern const Themes included_themes; From 104e6c3ff755e7584fb86375c7b5b84711959e6d Mon Sep 17 00:00:00 2001 From: flodavid Date: Sun, 4 Feb 2024 04:05:50 +0100 Subject: [PATCH 105/165] Rework themes to easily use light/dark palette, using only different icons - Renamed themes: - "colorful" to "default" and "colorful_dark" to "default_dark" - "default" to "monochrome" and "default_dark" to "monochrome_dark" - "colorful_midnight_blue" to "qdarkstyle_midnight_blue" - "qdarkstyle_midnight_blue" to "qdarkstyle_midnight_blue_monochrome" - qdarkstyle is renamed from "Dark" to "Mine Shaft" in the UI - default and monochrome themes all use the same qss stylesheet - Remove the ability to select "default_dark" directly - Default has better support for light and dark - Controller and Keyboard applets icons and style adapt to dark mode - Add "qdarkstyle_monochrome" theme - Remove duplicated icon files --- .reuse/dep5 | 52 +- dist/icons/overlay/osk_button_backspace.png | Bin 1272 -> 2938 bytes dist/icons/overlay/overlay.qrc | 60 +- .../arrow_left.png} | Bin .../arrow_right.png} | Bin .../button_A.png} | Bin .../button_B.png} | Bin .../button_L.png} | Bin .../button_R.png} | Bin .../button_X.png} | Bin .../button_Y.png} | Bin .../button_minus.png} | Bin .../button_plus.png} | Bin .../button_press_stick.png} | Bin .../controller_dual_joycon.png} | Bin .../controller_handheld.png} | Bin .../controller_pro.png} | Bin .../controller_single_joycon_left.png} | Bin .../controller_single_joycon_left_a.png} | Bin .../controller_single_joycon_left_b.png} | Bin .../controller_single_joycon_left_x.png} | Bin .../controller_single_joycon_left_y.png} | Bin .../controller_single_joycon_right.png} | Bin .../osk_button_B.png} | Bin .../osk_button_B_disabled.png} | Bin .../osk_button_Y.png} | Bin .../osk_button_Y_disabled.png} | Bin .../osk_button_backspace.png} | Bin .../osk_button_plus.png} | Bin .../osk_button_plus_disabled.png} | Bin .../osk_button_shift.png} | Bin .../osk_button_shift_on.png} | Bin .../colorful/icons/16x16/connected.png | Bin 575 -> 0 bytes .../icons/16x16/connected_notification.png | Bin 760 -> 0 bytes .../colorful/icons/16x16/disconnected.png | Bin 648 -> 0 bytes dist/qt_themes/colorful/icons/16x16/lock.png | Bin 330 -> 0 bytes .../colorful/icons/256x256/plus_folder.png | Bin 4643 -> 0 bytes .../colorful/icons/48x48/bad_folder.png | Bin 528 -> 0 bytes dist/qt_themes/colorful/icons/48x48/chip.png | Bin 582 -> 0 bytes .../qt_themes/colorful/icons/48x48/folder.png | Bin 460 -> 0 bytes .../colorful/icons/48x48/list-add.png | Bin 204 -> 0 bytes .../colorful/icons/48x48/sd_card.png | Bin 228 -> 0 bytes dist/qt_themes/colorful/icons/48x48/star.png | Bin 1108 -> 0 bytes dist/qt_themes/colorful/style.qrc | 30 - .../qt_themes/colorful_dark/icons/index.theme | 8 - dist/qt_themes/colorful_dark/style.qrc | 57 -- .../colorful_midnight_blue/icons/index.theme | 8 - .../colorful_midnight_blue/style.qrc | 63 -- dist/qt_themes/default/default.qrc | 20 +- .../icons/16x16/checked.png | Bin .../icons/16x16/failed.png | Bin .../icons/16x16/info.png | Bin dist/qt_themes/default/icons/16x16/lock.png | Bin 318 -> 330 bytes .../icons/16x16/sync.png | Bin .../icons/16x16/view-refresh.png | Bin .../default/icons/256x256/plus_folder.png | Bin 1948 -> 4643 bytes .../default/icons/48x48/bad_folder.png | Bin 1007 -> 528 bytes dist/qt_themes/default/icons/48x48/chip.png | Bin 511 -> 582 bytes dist/qt_themes/default/icons/48x48/folder.png | Bin 535 -> 460 bytes .../default/icons/48x48/list-add.png | Bin 204 -> 204 bytes .../icons/48x48/no_avatar.png | Bin .../qt_themes/default/icons/48x48/sd_card.png | Bin 198 -> 228 bytes dist/qt_themes/default/icons/48x48/star.png | Bin 1029 -> 1108 bytes dist/qt_themes/default/icons/index.theme | 5 +- dist/qt_themes/default/style.qss | 116 +-- .../icons/16x16/lock.png | Bin .../icons/16x16/view-refresh.png | Bin dist/qt_themes/default_dark/icons/index.theme | 2 +- dist/qt_themes/default_dark/style.qrc | 25 - dist/qt_themes/default_dark/style.qss | 687 ------------------ dist/qt_themes/monochrome/icons.qrc | 32 + .../qt_themes/monochrome/icons/16x16/lock.png | Bin 0 -> 318 bytes .../monochrome/icons/256x256/plus_folder.png | Bin 0 -> 1948 bytes .../monochrome/icons/48x48/bad_folder.png | Bin 0 -> 1007 bytes .../qt_themes/monochrome/icons/48x48/chip.png | Bin 0 -> 511 bytes .../monochrome/icons/48x48/folder.png | Bin 0 -> 535 bytes .../monochrome/icons/48x48/list-add.png | Bin 0 -> 204 bytes .../monochrome/icons/48x48/sd_card.png | Bin 0 -> 198 bytes .../qt_themes/monochrome/icons/48x48/star.png | Bin 0 -> 1029 bytes .../icons/index.theme | 7 +- dist/qt_themes/monochrome/style.qrc | 5 + .../icons/16x16/lock.png | Bin .../icons/256x256/plus_folder.png | Bin .../icons/48x48/bad_folder.png | Bin .../icons/48x48/chip.png | Bin .../icons/48x48/folder.png | Bin .../icons/48x48/list-add.png | Bin .../icons/48x48/no_avatar.png | Bin .../icons/48x48/sd_card.png | Bin .../icons/48x48/star.png | Bin .../monochrome_dark/icons/index.theme | 14 + .../qdarkstyle/{style.qss => dark.qss} | 85 --- dist/qt_themes/qdarkstyle/icons.qrc | 51 ++ .../qdarkstyle/icons/16x16/connected.png | Bin 575 -> 0 bytes .../icons/16x16/connected_notification.png | Bin 760 -> 0 bytes .../qdarkstyle/icons/16x16/disconnected.png | Bin 648 -> 0 bytes .../qdarkstyle/icons/16x16/view-refresh.png | Bin 362 -> 0 bytes dist/qt_themes/qdarkstyle/icons/index.theme | 14 +- dist/qt_themes/qdarkstyle/style.qrc | 63 +- .../{style.qss => dark.qss} | 89 --- .../qdarkstyle_midnight_blue/icons.qrc | 224 ++++++ .../icons/index.theme | 14 +- .../qdarkstyle_midnight_blue/style.qrc | 229 +----- .../icons.qrc | 33 + .../icons/index.theme | 14 + .../style.qrc | 8 + .../qt_themes/qdarkstyle_monochrome/icons.qrc | 33 + .../qdarkstyle_monochrome/icons/index.theme | 14 + .../qt_themes/qdarkstyle_monochrome/style.qrc | 8 + src/suyu/applets/qt_software_keyboard.cpp | 160 ++-- src/suyu/applets/qt_software_keyboard.h | 9 + src/suyu/main.cpp | 17 +- src/suyu/main.h | 1 - src/suyu/uisettings.cpp | 12 +- src/suyu/uisettings.h | 2 +- 115 files changed, 685 insertions(+), 1586 deletions(-) rename dist/icons/{overlay/arrow_left_dark.png => overlay_dark/arrow_left.png} (100%) rename dist/icons/{overlay/arrow_right_dark.png => overlay_dark/arrow_right.png} (100%) rename dist/icons/{overlay/button_A_dark.png => overlay_dark/button_A.png} (100%) rename dist/icons/{overlay/button_B_dark.png => overlay_dark/button_B.png} (100%) rename dist/icons/{overlay/button_L_dark.png => overlay_dark/button_L.png} (100%) rename dist/icons/{overlay/button_R_dark.png => overlay_dark/button_R.png} (100%) rename dist/icons/{overlay/button_X_dark.png => overlay_dark/button_X.png} (100%) rename dist/icons/{overlay/button_Y_dark.png => overlay_dark/button_Y.png} (100%) rename dist/icons/{overlay/button_minus_dark.png => overlay_dark/button_minus.png} (100%) rename dist/icons/{overlay/button_plus_dark.png => overlay_dark/button_plus.png} (100%) rename dist/icons/{overlay/button_press_stick_dark.png => overlay_dark/button_press_stick.png} (100%) rename dist/icons/{overlay/controller_dual_joycon_dark.png => overlay_dark/controller_dual_joycon.png} (100%) rename dist/icons/{overlay/controller_handheld_dark.png => overlay_dark/controller_handheld.png} (100%) rename dist/icons/{overlay/controller_pro_dark.png => overlay_dark/controller_pro.png} (100%) rename dist/icons/{overlay/controller_single_joycon_left_dark.png => overlay_dark/controller_single_joycon_left.png} (100%) rename dist/icons/{overlay/controller_single_joycon_left_a_dark.png => overlay_dark/controller_single_joycon_left_a.png} (100%) rename dist/icons/{overlay/controller_single_joycon_left_b_dark.png => overlay_dark/controller_single_joycon_left_b.png} (100%) rename dist/icons/{overlay/controller_single_joycon_left_x_dark.png => overlay_dark/controller_single_joycon_left_x.png} (100%) rename dist/icons/{overlay/controller_single_joycon_left_y_dark.png => overlay_dark/controller_single_joycon_left_y.png} (100%) rename dist/icons/{overlay/controller_single_joycon_right_dark.png => overlay_dark/controller_single_joycon_right.png} (100%) rename dist/icons/{overlay/osk_button_B_dark.png => overlay_dark/osk_button_B.png} (100%) rename dist/icons/{overlay/osk_button_B_dark_disabled.png => overlay_dark/osk_button_B_disabled.png} (100%) rename dist/icons/{overlay/osk_button_Y_dark.png => overlay_dark/osk_button_Y.png} (100%) rename dist/icons/{overlay/osk_button_Y_dark_disabled.png => overlay_dark/osk_button_Y_disabled.png} (100%) rename dist/icons/{overlay/osk_button_backspace_dark.png => overlay_dark/osk_button_backspace.png} (100%) rename dist/icons/{overlay/osk_button_plus_dark.png => overlay_dark/osk_button_plus.png} (100%) rename dist/icons/{overlay/osk_button_plus_dark_disabled.png => overlay_dark/osk_button_plus_disabled.png} (100%) rename dist/icons/{overlay/osk_button_shift_dark.png => overlay_dark/osk_button_shift.png} (100%) rename dist/icons/{overlay/osk_button_shift_on_dark.png => overlay_dark/osk_button_shift_on.png} (100%) delete mode 100644 dist/qt_themes/colorful/icons/16x16/connected.png delete mode 100644 dist/qt_themes/colorful/icons/16x16/connected_notification.png delete mode 100644 dist/qt_themes/colorful/icons/16x16/disconnected.png delete mode 100644 dist/qt_themes/colorful/icons/16x16/lock.png delete mode 100644 dist/qt_themes/colorful/icons/256x256/plus_folder.png delete mode 100644 dist/qt_themes/colorful/icons/48x48/bad_folder.png delete mode 100644 dist/qt_themes/colorful/icons/48x48/chip.png delete mode 100644 dist/qt_themes/colorful/icons/48x48/folder.png delete mode 100644 dist/qt_themes/colorful/icons/48x48/list-add.png delete mode 100644 dist/qt_themes/colorful/icons/48x48/sd_card.png delete mode 100644 dist/qt_themes/colorful/icons/48x48/star.png delete mode 100644 dist/qt_themes/colorful/style.qrc delete mode 100644 dist/qt_themes/colorful_dark/icons/index.theme delete mode 100644 dist/qt_themes/colorful_dark/style.qrc delete mode 100644 dist/qt_themes/colorful_midnight_blue/icons/index.theme delete mode 100644 dist/qt_themes/colorful_midnight_blue/style.qrc rename dist/qt_themes/{colorful => default}/icons/16x16/checked.png (100%) rename dist/qt_themes/{colorful => default}/icons/16x16/failed.png (100%) rename dist/qt_themes/{colorful => default}/icons/16x16/info.png (100%) rename dist/qt_themes/{colorful => default}/icons/16x16/sync.png (100%) rename dist/qt_themes/{colorful => default}/icons/16x16/view-refresh.png (100%) rename dist/qt_themes/{colorful => default}/icons/48x48/no_avatar.png (100%) rename dist/qt_themes/{colorful_dark => default_dark}/icons/16x16/lock.png (100%) rename dist/qt_themes/{colorful_dark => default_dark}/icons/16x16/view-refresh.png (100%) delete mode 100644 dist/qt_themes/default_dark/style.qrc delete mode 100644 dist/qt_themes/default_dark/style.qss create mode 100644 dist/qt_themes/monochrome/icons.qrc create mode 100644 dist/qt_themes/monochrome/icons/16x16/lock.png create mode 100644 dist/qt_themes/monochrome/icons/256x256/plus_folder.png create mode 100644 dist/qt_themes/monochrome/icons/48x48/bad_folder.png create mode 100644 dist/qt_themes/monochrome/icons/48x48/chip.png create mode 100644 dist/qt_themes/monochrome/icons/48x48/folder.png create mode 100644 dist/qt_themes/monochrome/icons/48x48/list-add.png create mode 100644 dist/qt_themes/monochrome/icons/48x48/sd_card.png create mode 100644 dist/qt_themes/monochrome/icons/48x48/star.png rename dist/qt_themes/{colorful => monochrome}/icons/index.theme (60%) create mode 100644 dist/qt_themes/monochrome/style.qrc rename dist/qt_themes/{qdarkstyle => monochrome_dark}/icons/16x16/lock.png (100%) rename dist/qt_themes/{qdarkstyle => monochrome_dark}/icons/256x256/plus_folder.png (100%) rename dist/qt_themes/{qdarkstyle => monochrome_dark}/icons/48x48/bad_folder.png (100%) rename dist/qt_themes/{qdarkstyle => monochrome_dark}/icons/48x48/chip.png (100%) rename dist/qt_themes/{qdarkstyle => monochrome_dark}/icons/48x48/folder.png (100%) rename dist/qt_themes/{qdarkstyle => monochrome_dark}/icons/48x48/list-add.png (100%) rename dist/qt_themes/{qdarkstyle => monochrome_dark}/icons/48x48/no_avatar.png (100%) rename dist/qt_themes/{qdarkstyle => monochrome_dark}/icons/48x48/sd_card.png (100%) rename dist/qt_themes/{qdarkstyle => monochrome_dark}/icons/48x48/star.png (100%) create mode 100644 dist/qt_themes/monochrome_dark/icons/index.theme rename dist/qt_themes/qdarkstyle/{style.qss => dark.qss} (93%) create mode 100644 dist/qt_themes/qdarkstyle/icons.qrc delete mode 100644 dist/qt_themes/qdarkstyle/icons/16x16/connected.png delete mode 100644 dist/qt_themes/qdarkstyle/icons/16x16/connected_notification.png delete mode 100644 dist/qt_themes/qdarkstyle/icons/16x16/disconnected.png delete mode 100644 dist/qt_themes/qdarkstyle/icons/16x16/view-refresh.png rename dist/qt_themes/qdarkstyle_midnight_blue/{style.qss => dark.qss} (95%) create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue/icons.qrc create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue_monochrome/icons.qrc create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue_monochrome/icons/index.theme create mode 100644 dist/qt_themes/qdarkstyle_midnight_blue_monochrome/style.qrc create mode 100644 dist/qt_themes/qdarkstyle_monochrome/icons.qrc create mode 100644 dist/qt_themes/qdarkstyle_monochrome/icons/index.theme create mode 100644 dist/qt_themes/qdarkstyle_monochrome/style.qrc diff --git a/.reuse/dep5 b/.reuse/dep5 index baf1354bf6..9779726e3f 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -5,10 +5,13 @@ Comment: It is best to use this file to record copyright information about Files: dist/english_plurals/* dist/icons/controller/*.png dist/icons/overlay/*.png + dist/icons/overlay_dark/*.png dist/languages/* dist/qt_themes/*/icons/48x48/sd_card.png dist/qt_themes/*/icons/index.theme dist/qt_themes/default/style.qss + dist/qt_themes/*/icons.qrc + dist/qt_themes/*/style.qrc Copyright: yuzu Emulator Project suyu Emulator Project License: GPL-2.0-or-later @@ -22,8 +25,7 @@ Copyright: suyu Emulator Project License: GPL-2.0-or-later Files: dist/qt_themes/qdarkstyle*/LICENSE.* - dist/qt_themes/qdarkstyle*/style.qrc - dist/qt_themes/qdarkstyle*/style.qss + dist/qt_themes/qdarkstyle*/dark.qss Copyright: 2013 Colin Duquesnoy 2019 Daniel Cosmo Pizetta License: MIT @@ -33,28 +35,28 @@ Copyright: 2013 Colin Duquesnoy 2019 Daniel Cosmo Pizetta License: CC-BY-4.0 -Files: dist/qt_themes/default/icons/256x256/plus_folder.png - dist/qt_themes/default/icons/48x48/bad_folder.png - dist/qt_themes/default/icons/48x48/chip.png - dist/qt_themes/default/icons/48x48/folder.png - dist/qt_themes/default/icons/48x48/star.png - dist/qt_themes/qdarkstyle/icons/256x256/plus_folder.png - dist/qt_themes/qdarkstyle/icons/48x48/bad_folder.png - dist/qt_themes/qdarkstyle/icons/48x48/chip.png - dist/qt_themes/qdarkstyle/icons/48x48/folder.png - dist/qt_themes/qdarkstyle/icons/48x48/star.png +Files: dist/qt_themes/monochrome/icons/256x256/plus_folder.png + dist/qt_themes/monochrome/icons/48x48/bad_folder.png + dist/qt_themes/monochrome/icons/48x48/chip.png + dist/qt_themes/monochrome/icons/48x48/folder.png + dist/qt_themes/monochrome/icons/48x48/star.png + dist/qt_themes/monochrome_dark/icons/48x48/bad_folder.png + dist/qt_themes/monochrome_dark/icons/48x48/chip.png + dist/qt_themes/monochrome_dark/icons/48x48/folder.png + dist/qt_themes/monochrome_dark/icons/48x48/star.png + dist/qt_themes/monochrome_dark/icons/256x256/plus_folder.png Copyright: Refactoring UI Inc. License: MIT Comment: https://github.com/tailwindlabs/heroicons -Files: dist/qt_themes/colorful/icons/16x16/lock.png - dist/qt_themes/colorful/icons/256x256/plus_folder.png - dist/qt_themes/colorful/icons/48x48/bad_folder.png - dist/qt_themes/colorful/icons/48x48/chip.png - dist/qt_themes/colorful/icons/48x48/folder.png - dist/qt_themes/colorful_dark/icons/16x16/lock.png - dist/qt_themes/colorful/icons/16x16/info.png - dist/qt_themes/colorful/icons/16x16/sync.png +Files: dist/qt_themes/default/icons/16x16/lock.png + dist/qt_themes/default/icons/256x256/plus_folder.png + dist/qt_themes/default/icons/48x48/bad_folder.png + dist/qt_themes/default/icons/48x48/chip.png + dist/qt_themes/default/icons/48x48/folder.png + dist/qt_themes/default_dark/icons/16x16/lock.png + dist/qt_themes/default/icons/16x16/info.png + dist/qt_themes/default/icons/16x16/sync.png Copyright: Icons8 License: MIT Comment: https://github.com/icons8/flat-color-icons @@ -70,15 +72,15 @@ Files: dist/qt_themes/*/icons/48x48/no_avatar.png Copyright: Ionic (http://ionic.io/) License: MIT -Files: dist/qt_themes/colorful/icons/48x48/star.png - dist/qt_themes/colorful/icons/16x16/checked.png - dist/qt_themes/colorful/icons/16x16/failed.png +Files: dist/qt_themes/default/icons/48x48/star.png + dist/qt_themes/default/icons/16x16/checked.png + dist/qt_themes/default/icons/16x16/failed.png Copyright: SVG Repo License: CC0-1.0 Files: dist/qt_themes/*/icons/16x16/view-refresh.png - dist/qt_themes/default/icons/16x16/lock.png - dist/qt_themes/qdarkstyle/icons/16x16/lock.png + dist/qt_themes/monochrome/icons/16x16/lock.png + dist/qt_themes/monochrome_dark/icons/16x16/lock.png Copyright: Google, Inc. License: Apache-2.0 diff --git a/dist/icons/overlay/osk_button_backspace.png b/dist/icons/overlay/osk_button_backspace.png index b7dc33228250bc2af38d43d24d05c2c25cd73a2b..b212efbbc3301cb6cf45863ef2defefd7cfc69ae 100644 GIT binary patch literal 2938 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 delta 1263 zcmVCEmkaxCG}RWF%OnckANy6U%_W+heyPsJ_)Bnp(R%b9}bm&zm{ zQ6Re|=lFTdPv!AIqCj?A&h_)~YYqnz1>#MJnGdJ;1ri0)JbWYT z4kQWWO7<+pV}GA3cLI_GawT)V;^9-jbwFS$ox>JYT^j_(EYEUf zy@lp!$-DWie39YPipS9jqWD0rwY^vInCo4ONIXsu2_8Wd zALy6%d_wW?BG)Vyk025}f+#+a>B5&J&nZAG9zi5{1bjLV(mdfnu4K-Y#edKI-Vq}8K%{xXfn0N5C5s;vy9D(^ zqn0ATkO)n88U3ncm_{cp^1qWXQ?4M_86{=dkPgqMHo0Hpax@t?So zJbymg?lk}L2>e}3h!_Uy!`uxJl(IDZzy3OfNnvfDmDWg^RBM}A`fNOt28 zuuF?=@71vYknH#iV0I82K|h!wh!V3r zt9cGk{n9?K39|#lYx8-nPfkSPBY2ue1L^Q&LG&KG=0p@e#Ho40fn14~sHKo!+UG(P zJ_f9LG?0#KCci=-cdg?Qg$cmjZAv3Woc-RYXgBMLi;AbH{g0pGXfvwk9bwSOzc zBMLjrB6;Ei0p(77(@(^c5sdFK7jTdMEcZVkl9LcmJ z`HPomKDS632r!dr{F~Kw?WBQ#Y-!f~OCgozk_G~@b;YPKIW1`*z-}!@9)8QlBn<>` zFY%NAof(`o5MYlLM4#1qCk+J1*=X2zOqZmAT#1)^fr^{Fx#qmH08%%sc(?!(caOHu z7eM0Ln{O9D;y%Fqq5$%yGKk+5K;D$c^N#|^8@o8O0>~S#%$Ws{H)eg#Er2``r#~9m Z<4=bU9t_=IpXdMp002ovPDHLkV1g|JP>28k diff --git a/dist/icons/overlay/overlay.qrc b/dist/icons/overlay/overlay.qrc index 8d7833aca0..2319e6dd28 100644 --- a/dist/icons/overlay/overlay.qrc +++ b/dist/icons/overlay/overlay.qrc @@ -6,64 +6,66 @@ SPDX-License-Identifier: GPL-2.0-or-later arrow_left.png - arrow_left_dark.png arrow_right.png - arrow_right_dark.png button_minus.png - button_minus_dark.png button_plus.png - button_plus_dark.png button_A.png - button_A_dark.png button_B.png - button_B_dark.png button_X.png - button_X_dark.png button_Y.png - button_Y_dark.png button_L.png - button_L_dark.png button_R.png - button_R_dark.png button_press_stick.png - button_press_stick_dark.png osk_button_B.png osk_button_B_disabled.png - osk_button_B_dark.png - osk_button_B_dark_disabled.png osk_button_Y.png osk_button_Y_disabled.png - osk_button_Y_dark.png - osk_button_Y_dark_disabled.png osk_button_backspace.png - osk_button_backspace_dark.png osk_button_plus.png osk_button_plus_disabled.png - osk_button_plus_dark.png - osk_button_plus_dark_disabled.png osk_button_shift.png - osk_button_shift_dark.png osk_button_shift_on.png - osk_button_shift_on_dark.png osk_button_shift_lock_on.png osk_button_shift_lock_off.png controller_dual_joycon.png - controller_dual_joycon_dark.png controller_pro.png - controller_pro_dark.png controller_handheld.png - controller_handheld_dark.png controller_single_joycon_left.png - controller_single_joycon_left_dark.png controller_single_joycon_right.png - controller_single_joycon_right_dark.png controller_single_joycon_left_a.png - controller_single_joycon_left_a_dark.png controller_single_joycon_left_b.png - controller_single_joycon_left_b_dark.png controller_single_joycon_left_x.png - controller_single_joycon_left_x_dark.png controller_single_joycon_left_y.png - controller_single_joycon_left_y_dark.png + + + ../overlay_dark/arrow_left.png + ../overlay_dark/arrow_right.png + ../overlay_dark/button_minus.png + ../overlay_dark/button_plus.png + ../overlay_dark/button_A.png + ../overlay_dark/button_B.png + ../overlay_dark/button_X.png + ../overlay_dark/button_Y.png + ../overlay_dark/button_L.png + ../overlay_dark/button_R.png + ../overlay_dark/button_press_stick.png + ../overlay_dark/osk_button_B.png + ../overlay_dark/osk_button_B.png + ../overlay_dark/osk_button_Y.png + ../overlay_dark/osk_button_Y.png + ../overlay_dark/osk_button_backspace.png + ../overlay_dark/osk_button_plus.png + ../overlay_dark/osk_button_plus.png + ../overlay_dark/osk_button_shift.png + ../overlay_dark/osk_button_shift_on.png + ../overlay_dark/controller_dual_joycon.png + ../overlay_dark/controller_pro.png + ../overlay_dark/controller_handheld.png + ../overlay_dark/controller_single_joycon_left.png + ../overlay_dark/controller_single_joycon_right.png + ../overlay_dark/controller_single_joycon_left_a.png + ../overlay_dark/controller_single_joycon_left_b.png + ../overlay_dark/controller_single_joycon_left_x.png + ../overlay_dark/controller_single_joycon_left_y.png diff --git a/dist/icons/overlay/arrow_left_dark.png b/dist/icons/overlay_dark/arrow_left.png similarity index 100% rename from dist/icons/overlay/arrow_left_dark.png rename to dist/icons/overlay_dark/arrow_left.png diff --git a/dist/icons/overlay/arrow_right_dark.png b/dist/icons/overlay_dark/arrow_right.png similarity index 100% rename from dist/icons/overlay/arrow_right_dark.png rename to dist/icons/overlay_dark/arrow_right.png diff --git a/dist/icons/overlay/button_A_dark.png b/dist/icons/overlay_dark/button_A.png similarity index 100% rename from dist/icons/overlay/button_A_dark.png rename to dist/icons/overlay_dark/button_A.png diff --git a/dist/icons/overlay/button_B_dark.png b/dist/icons/overlay_dark/button_B.png similarity index 100% rename from dist/icons/overlay/button_B_dark.png rename to dist/icons/overlay_dark/button_B.png diff --git a/dist/icons/overlay/button_L_dark.png b/dist/icons/overlay_dark/button_L.png similarity index 100% rename from dist/icons/overlay/button_L_dark.png rename to dist/icons/overlay_dark/button_L.png diff --git a/dist/icons/overlay/button_R_dark.png b/dist/icons/overlay_dark/button_R.png similarity index 100% rename from dist/icons/overlay/button_R_dark.png rename to dist/icons/overlay_dark/button_R.png diff --git a/dist/icons/overlay/button_X_dark.png b/dist/icons/overlay_dark/button_X.png similarity index 100% rename from dist/icons/overlay/button_X_dark.png rename to dist/icons/overlay_dark/button_X.png diff --git a/dist/icons/overlay/button_Y_dark.png b/dist/icons/overlay_dark/button_Y.png similarity index 100% rename from dist/icons/overlay/button_Y_dark.png rename to dist/icons/overlay_dark/button_Y.png diff --git a/dist/icons/overlay/button_minus_dark.png b/dist/icons/overlay_dark/button_minus.png similarity index 100% rename from dist/icons/overlay/button_minus_dark.png rename to dist/icons/overlay_dark/button_minus.png diff --git a/dist/icons/overlay/button_plus_dark.png b/dist/icons/overlay_dark/button_plus.png similarity index 100% rename from dist/icons/overlay/button_plus_dark.png rename to dist/icons/overlay_dark/button_plus.png diff --git a/dist/icons/overlay/button_press_stick_dark.png b/dist/icons/overlay_dark/button_press_stick.png similarity index 100% rename from dist/icons/overlay/button_press_stick_dark.png rename to dist/icons/overlay_dark/button_press_stick.png diff --git a/dist/icons/overlay/controller_dual_joycon_dark.png b/dist/icons/overlay_dark/controller_dual_joycon.png similarity index 100% rename from dist/icons/overlay/controller_dual_joycon_dark.png rename to dist/icons/overlay_dark/controller_dual_joycon.png diff --git a/dist/icons/overlay/controller_handheld_dark.png b/dist/icons/overlay_dark/controller_handheld.png similarity index 100% rename from dist/icons/overlay/controller_handheld_dark.png rename to dist/icons/overlay_dark/controller_handheld.png diff --git a/dist/icons/overlay/controller_pro_dark.png b/dist/icons/overlay_dark/controller_pro.png similarity index 100% rename from dist/icons/overlay/controller_pro_dark.png rename to dist/icons/overlay_dark/controller_pro.png diff --git a/dist/icons/overlay/controller_single_joycon_left_dark.png b/dist/icons/overlay_dark/controller_single_joycon_left.png similarity index 100% rename from dist/icons/overlay/controller_single_joycon_left_dark.png rename to dist/icons/overlay_dark/controller_single_joycon_left.png diff --git a/dist/icons/overlay/controller_single_joycon_left_a_dark.png b/dist/icons/overlay_dark/controller_single_joycon_left_a.png similarity index 100% rename from dist/icons/overlay/controller_single_joycon_left_a_dark.png rename to dist/icons/overlay_dark/controller_single_joycon_left_a.png diff --git a/dist/icons/overlay/controller_single_joycon_left_b_dark.png b/dist/icons/overlay_dark/controller_single_joycon_left_b.png similarity index 100% rename from dist/icons/overlay/controller_single_joycon_left_b_dark.png rename to dist/icons/overlay_dark/controller_single_joycon_left_b.png diff --git a/dist/icons/overlay/controller_single_joycon_left_x_dark.png b/dist/icons/overlay_dark/controller_single_joycon_left_x.png similarity index 100% rename from dist/icons/overlay/controller_single_joycon_left_x_dark.png rename to dist/icons/overlay_dark/controller_single_joycon_left_x.png diff --git a/dist/icons/overlay/controller_single_joycon_left_y_dark.png b/dist/icons/overlay_dark/controller_single_joycon_left_y.png similarity index 100% rename from dist/icons/overlay/controller_single_joycon_left_y_dark.png rename to dist/icons/overlay_dark/controller_single_joycon_left_y.png diff --git a/dist/icons/overlay/controller_single_joycon_right_dark.png b/dist/icons/overlay_dark/controller_single_joycon_right.png similarity index 100% rename from dist/icons/overlay/controller_single_joycon_right_dark.png rename to dist/icons/overlay_dark/controller_single_joycon_right.png diff --git a/dist/icons/overlay/osk_button_B_dark.png b/dist/icons/overlay_dark/osk_button_B.png similarity index 100% rename from dist/icons/overlay/osk_button_B_dark.png rename to dist/icons/overlay_dark/osk_button_B.png diff --git a/dist/icons/overlay/osk_button_B_dark_disabled.png b/dist/icons/overlay_dark/osk_button_B_disabled.png similarity index 100% rename from dist/icons/overlay/osk_button_B_dark_disabled.png rename to dist/icons/overlay_dark/osk_button_B_disabled.png diff --git a/dist/icons/overlay/osk_button_Y_dark.png b/dist/icons/overlay_dark/osk_button_Y.png similarity index 100% rename from dist/icons/overlay/osk_button_Y_dark.png rename to dist/icons/overlay_dark/osk_button_Y.png diff --git a/dist/icons/overlay/osk_button_Y_dark_disabled.png b/dist/icons/overlay_dark/osk_button_Y_disabled.png similarity index 100% rename from dist/icons/overlay/osk_button_Y_dark_disabled.png rename to dist/icons/overlay_dark/osk_button_Y_disabled.png diff --git a/dist/icons/overlay/osk_button_backspace_dark.png b/dist/icons/overlay_dark/osk_button_backspace.png similarity index 100% rename from dist/icons/overlay/osk_button_backspace_dark.png rename to dist/icons/overlay_dark/osk_button_backspace.png diff --git a/dist/icons/overlay/osk_button_plus_dark.png b/dist/icons/overlay_dark/osk_button_plus.png similarity index 100% rename from dist/icons/overlay/osk_button_plus_dark.png rename to dist/icons/overlay_dark/osk_button_plus.png diff --git a/dist/icons/overlay/osk_button_plus_dark_disabled.png b/dist/icons/overlay_dark/osk_button_plus_disabled.png similarity index 100% rename from dist/icons/overlay/osk_button_plus_dark_disabled.png rename to dist/icons/overlay_dark/osk_button_plus_disabled.png diff --git a/dist/icons/overlay/osk_button_shift_dark.png b/dist/icons/overlay_dark/osk_button_shift.png similarity index 100% rename from dist/icons/overlay/osk_button_shift_dark.png rename to dist/icons/overlay_dark/osk_button_shift.png diff --git a/dist/icons/overlay/osk_button_shift_on_dark.png b/dist/icons/overlay_dark/osk_button_shift_on.png similarity index 100% rename from dist/icons/overlay/osk_button_shift_on_dark.png rename to dist/icons/overlay_dark/osk_button_shift_on.png diff --git a/dist/qt_themes/colorful/icons/16x16/connected.png b/dist/qt_themes/colorful/icons/16x16/connected.png deleted file mode 100644 index 0afc18cb7a19028fd567a7ca7ced62cd164657de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 575 zcmV-F0>J%=P)0k{|sIn0V`B1xGGFnerg>I4!7^B>UM&p)aM9vQI<{ZJ4 z8HZ4p+_%{7AT1;1-`r}Q8XRRVYW9}G=D3HXRO!FFg z<>v6FfXkm66-$M=OnPPtTpl}lK!#o^J26y#00VLkV5Ig4hAIxCZ~AU@6mMaG2|$+zA&;BarDZyi@16B z4lE8kTwX8y!4LxB2>hW4yn!GbZg+WiA%P|k^Ip;o774}ts6fO6U&y7=hp3TO@-WL? z{^Mh)gLW3&bGqIiV!1gSPQ{V|zW{P&fJjHVbAtc? N002ovPDHLkV1hH82Xp`c diff --git a/dist/qt_themes/colorful/icons/16x16/connected_notification.png b/dist/qt_themes/colorful/icons/16x16/connected_notification.png deleted file mode 100644 index 72466e098e471ae5a97c49a56536dd4bf62b3a08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 760 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0*y&TK~y+Tl~Y|v z6j2oZ?(CguoZVz~OB-RWz#nLd9z^@Yo&q%@j2=qtp^PLV$cmEeAL_xE^2wfrs242~ zp$Ef$h%#S%kW`EcLR4x6ZEJVk8F%j7>CU(tNkRF+;a<+Y=R4my_gvyQ4zjp<{ql`; zI^D*(O+BwTbI<>_2MD8-wl5<%-+In!I@(0@^Fzo{bD*j!D3xKFhG&Lp!dzV1$6_(` z^gLuV6YIgUEb0c8*Ie*2x#lAhY;J={1gb21z6E0ugAZC@F^euEux;jDmV`UFz7l>- zK|xT%#N<56!g^D3Wwr@)QUY z@d)MRLDK?Qog0L{ZY_3>K0_%MP_m~6ird7|QOF|6#=1I$H9tA_=53H>6>z~YHTJ@7 zb_Nd4PV}Lux(a+|27GF2$(u@fs~(9UHZ*jca>r)zc$_}(It@ippva0SLlzB`5RY_2 zDJ%pZ9`=H=;M3EPtE-_V5`;>`*WTHAw^h71&5pJA_QIN1DX?Z|p%fSYQs6=ghhYg- zVhSf|d1>iW;`5ymOPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0v$<2K~y+Tl~PS> zQ$Z9x^WL<1ZG=jLsqtf@CIu;o=wGnd1VlHD;-XFKLZw(mq)@*>1VJ>!or+OVq^`wu znJxuC&?1zmaamnO1NME*%5JoAzwQ9hHiSzzQVT5*fC(vPaz_Kh*+6Kq5b=Zyr$6d-BjRvNsUN9r<)$o0v zs;137DRgyhL@Z{(G)=_g8<0qB!nUp3v1>;LeY^L_vp9U_(^UgFXW)W|)!HD0fHMwq z`Rc|0_8q`L@sq zk>1%G63fVBGANuFmY*(fDuPllKmS8eCS`Em`r?L1hp>O&UTLdSRsk4e>gLt9;4C;0 zLcq{BFQXMa*Fk%G45d;@#y$LM{=|d(5AnGC1hkF9bzQ?)OM&Zp`Y#clJ$)W#YAJ!{ z4H0nGY&P-w?HjzG{fJLxahf`;55)a!M*cR#Fvf$Tw4UQO#< z+13h9kDdH|_{gEo)RvScR^ra>BKrFe$hQ&GwNfR74B5P3+o;Y|898=5|6Tg*(O>)p iN=@~G{{?26=FLU_5=aXOVS_yY0000ROSwGo6XvJPv zzlZ+oGn97-o-r-r&$VfgJ0KmA>2yufc!z{~qGQbm$8Tq=^*@-iIzITdZ+^wR?aTAG zy=^&a8Kl52V{ys6@63-oYYcdPN9cVtn5|nNv)ozk?u}LA z|1=jF*xy&`&-?QyY@&mH_rsJ||S^eTg=tDnm{r-UW|<05{U diff --git a/dist/qt_themes/colorful/icons/256x256/plus_folder.png b/dist/qt_themes/colorful/icons/256x256/plus_folder.png deleted file mode 100644 index 760fe6245e72cd0144b4dd198465db6c902ad400..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4643 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 N&`{A*F1u|N`hPMhH%|Zn diff --git a/dist/qt_themes/colorful/icons/48x48/bad_folder.png b/dist/qt_themes/colorful/icons/48x48/bad_folder.png deleted file mode 100644 index 34069c6b230de579d436fa9f0c21ae37af905b2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 528 zcmV+r0`L8aP)D=(%e@MHK8fkB=Bj zAo71N_TM-+BcNWZW5yA1JUFhvNgbx+#t;a7*^hmf6*R3n7W%qhe}R$vr)HtS?Z$}H zG4o!X(_6sz@(}sdBcmf285ttS{PG$t1;D%q2XCGsu;Kn*4EJ`EV}rNOsB1G50Q+ud zk;W!zsIv`2?JeY3^jMW_j?@CSU7w3IHc5j`^%!idCC8%2D%f^^N-bd7vjgnAMv6H$ zRRc8@7^o_rcZ`lz$ux@g9a}{@0rQS^^6Ppp>nQlxOkH&kI3Aw3BuX6#@;?!z_y14T zWD@^HDbsuT!ZivN`yU9kwIux}`Y&I&S~39%P%Vo&wyKl@Ww{HS`zJUY4#@7Hv$NlKH@gFOfWh#;p`a7> zHS|=Xi|Jg_aj&Q#lU501AZa|+UAa*$TBPeBeF7jKv8Dk59qm|`?ej*L3uX^12YbBVuC(8l1+gV$k**_t@c>ZJWBZB=;`hL$Y!X2M?Al&7anv=x5Djc` zF{wX=?AZ&m9kLRimbq{p`;P&?xFf(F2AivLfXd3&7a92KYV;p~>3ie@1>}zj8+*Yu zi1xtn5y8a+fD4SCBnjp`f!P{6Z7!DRe2Uhd-S73pU@#lExS?7!1ks16+4{ U)=xYDaR2}S07*qoM6N<$f@LZ5LI3~& diff --git a/dist/qt_themes/colorful/icons/48x48/folder.png b/dist/qt_themes/colorful/icons/48x48/folder.png deleted file mode 100644 index 498de4c62940559bcfa3c609f7e7474ee8d86ae3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!hD1*n$B+!?x05z{F*}O5F27(eFndMoj+0rh z&40xH>tws))HAoNDb{TF1AmTbg1vvM{SK{ta!*3~yJ+!)lAVWV&RycPFhE13E=fG| z{;|wSu|F(+sy(|uFZrH++0<`EXXd#6OY88yk-96naQ3a=s-IZ*Mcjyg^Hped$L!qi z%Nu{^ytsFDZ`S68H$NYoZToJXVxeu_-lz9MzHG4Dnwk1|k- z)~iH;!ZoYKb0iMl`PS*vyLEB3S>J-KUs+~KW%p^nb}KG(nEz~9`TJGQDeI0eyQ*M+ z{q3idHxmD6Mc3=>-?Mj)jN*D=sBp1PxMbenmA6-}RqQ-41{geD{an^LB{Ts5V+X_j diff --git a/dist/qt_themes/colorful/icons/48x48/list-add.png b/dist/qt_themes/colorful/icons/48x48/list-add.png deleted file mode 100644 index 74e4882aaedc98b57cce65ae5c0a2683bab31279..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCils0(?ST_0ALmnd!^rR{<%ek|4j}{|ryJ8+ZYEoCO|{#S9F5he4R}c>anM zprE6ti(`m~_uJEkTnq|4&KIBkn;y0>KuJVP%j$`*d51w2Hv=64#i!@TrNPv7(8A5T-G@yGywoSu{iDk diff --git a/dist/qt_themes/colorful/icons/48x48/sd_card.png b/dist/qt_themes/colorful/icons/48x48/sd_card.png deleted file mode 100644 index 652d61bc325bb1aad05f0cf316a540539007db27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC&H|6fVg?31We{epSZZGe6rASi z;uw-~@9nLFybTIGtq-ro-Z`MmY&og?*g;+yH}?gKEOH;;pFMK;H`B`8MbXZ(*FWEC z*meGH_WK=KKQs&offQDYsv`dLmWMB|uJoCySmSNRH zXNIRALK~_ob_p;r)JrZ;FIPU6$&C&jo{= O&EVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGff&c&uf&sqz;-vrp1L;XbK~!i%?U~PS zOi>ia&v{dXiliH?Ea>m5YV=J@_#cF(BsMmFOT@16TZoX5NLUE55E8}4qVW$P%nb1( zn$EO{AYwr)%!F#a<9pxSl&Kl>?zm68m``)xJLk-u`|dgC{+d@RQ>ILKNUVOj#2Qy= zH543u4+o~h}$Yl66AKfZVTN z1_u%lf3?qEJG%pMtyv?S3^;TM*WBQU6Utn$o&iZTwvu=cA^zF6h|BG%2U@d&{S0_= z5ZC;HacHlWtYI|+602FVnIO`WGQ!~RNa5ZVg^L5`$5`c)UviOSjm9gt7)J}8Ennd_IIhAYjbzV_$ z-R3U(L9hBZLcElHUSGJ0}_t za#K6u#u;t;A6y91c|}nN6uuK}$z90DX>AG*=5ypGw*=|DB9H?LhAYw#E3y`AjA6H(U1-B9gn0&roO)bscV1CJA0u^I4ve`2%!{>TpAy09=b-!WT>Oda@r{HvE!H;BCkj^gxa@IHsz20kcfvGmtMh4a|N#xYyvOee95 zjyfs!k|(V=Id - - - - icons/index.theme - icons/16x16/checked.png - icons/16x16/connected.png - icons/16x16/connected_notification.png - icons/16x16/disconnected.png - icons/16x16/failed.png - icons/16x16/info.png - icons/16x16/lock.png - icons/16x16/sync.png - icons/16x16/view-refresh.png - icons/48x48/bad_folder.png - icons/48x48/chip.png - icons/48x48/folder.png - icons/48x48/list-add.png - icons/48x48/no_avatar.png - icons/48x48/sd_card.png - icons/48x48/star.png - icons/256x256/plus_folder.png - - - ../default/style.qss - - diff --git a/dist/qt_themes/colorful_dark/icons/index.theme b/dist/qt_themes/colorful_dark/icons/index.theme deleted file mode 100644 index b37a06df78..0000000000 --- a/dist/qt_themes/colorful_dark/icons/index.theme +++ /dev/null @@ -1,8 +0,0 @@ -[Icon Theme] -Name=colorful_dark -Comment=Colorful theme (Dark style) -Inherits=colorful -Directories=16x16 - -[16x16] -Size=16 diff --git a/dist/qt_themes/colorful_dark/style.qrc b/dist/qt_themes/colorful_dark/style.qrc deleted file mode 100644 index 72451ef023..0000000000 --- a/dist/qt_themes/colorful_dark/style.qrc +++ /dev/null @@ -1,57 +0,0 @@ - - - - - icons/index.theme - icons/16x16/lock.png - icons/16x16/view-refresh.png - - - - ../qdarkstyle/rc/up_arrow_disabled.png - ../qdarkstyle/rc/Hmovetoolbar.png - ../qdarkstyle/rc/stylesheet-branch-end.png - ../qdarkstyle/rc/branch_closed-on.png - ../qdarkstyle/rc/stylesheet-vline.png - ../qdarkstyle/rc/branch_closed.png - ../qdarkstyle/rc/branch_open-on.png - ../qdarkstyle/rc/transparent.png - ../qdarkstyle/rc/right_arrow_disabled.png - ../qdarkstyle/rc/sizegrip.png - ../qdarkstyle/rc/close.png - ../qdarkstyle/rc/close-hover.png - ../qdarkstyle/rc/close-pressed.png - ../qdarkstyle/rc/down_arrow.png - ../qdarkstyle/rc/Vmovetoolbar.png - ../qdarkstyle/rc/left_arrow.png - ../qdarkstyle/rc/stylesheet-branch-more.png - ../qdarkstyle/rc/up_arrow.png - ../qdarkstyle/rc/right_arrow.png - ../qdarkstyle/rc/left_arrow_disabled.png - ../qdarkstyle/rc/Hsepartoolbar.png - ../qdarkstyle/rc/branch_open.png - ../qdarkstyle/rc/Vsepartoolbar.png - ../qdarkstyle/rc/down_arrow_disabled.png - ../qdarkstyle/rc/undock.png - ../qdarkstyle/rc/checkbox_checked_disabled.png - ../qdarkstyle/rc/checkbox_checked_focus.png - ../qdarkstyle/rc/checkbox_checked.png - ../qdarkstyle/rc/checkbox_indeterminate.png - ../qdarkstyle/rc/checkbox_indeterminate_focus.png - ../qdarkstyle/rc/checkbox_unchecked_disabled.png - ../qdarkstyle/rc/checkbox_unchecked_focus.png - ../qdarkstyle/rc/checkbox_unchecked.png - ../qdarkstyle/rc/radio_checked_disabled.png - ../qdarkstyle/rc/radio_checked_focus.png - ../qdarkstyle/rc/radio_checked.png - ../qdarkstyle/rc/radio_unchecked_disabled.png - ../qdarkstyle/rc/radio_unchecked_focus.png - ../qdarkstyle/rc/radio_unchecked.png - - - ../qdarkstyle/style.qss - - diff --git a/dist/qt_themes/colorful_midnight_blue/icons/index.theme b/dist/qt_themes/colorful_midnight_blue/icons/index.theme deleted file mode 100644 index dcb2c50d68..0000000000 --- a/dist/qt_themes/colorful_midnight_blue/icons/index.theme +++ /dev/null @@ -1,8 +0,0 @@ -[Icon Theme] -Name=colorful_midnight_blue -Comment=Colorful theme (Midnight Blue style) -Inherits=colorful -Directories=16x16 - -[16x16] -Size=16 diff --git a/dist/qt_themes/colorful_midnight_blue/style.qrc b/dist/qt_themes/colorful_midnight_blue/style.qrc deleted file mode 100644 index b9821c6722..0000000000 --- a/dist/qt_themes/colorful_midnight_blue/style.qrc +++ /dev/null @@ -1,63 +0,0 @@ - - - - - icons/index.theme - ../colorful_dark/icons/16x16/lock.png - ../qdarkstyle/icons/16x16/view-refresh.png - ../colorful/icons/48x48/bad_folder.png - ../colorful/icons/48x48/chip.png - ../colorful/icons/48x48/folder.png - ../colorful/icons/48x48/list-add.png - ../colorful/icons/48x48/sd_card.png - ../colorful/icons/256x256/plus_folder.png - - - - ../qdarkstyle_midnight_blue/rc/up_arrow_disabled.png - ../qdarkstyle_midnight_blue/rc/Hmovetoolbar.png - ../qdarkstyle_midnight_blue/rc/stylesheet-branch-end.png - ../qdarkstyle_midnight_blue/rc/branch_closed-on.png - ../qdarkstyle_midnight_blue/rc/stylesheet-vline.png - ../qdarkstyle_midnight_blue/rc/branch_closed.png - ../qdarkstyle_midnight_blue/rc/branch_open-on.png - ../qdarkstyle_midnight_blue/rc/transparent.png - ../qdarkstyle_midnight_blue/rc/right_arrow_disabled.png - ../qdarkstyle_midnight_blue/rc/sizegrip.png - ../qdarkstyle_midnight_blue/rc/close.png - ../qdarkstyle_midnight_blue/rc/close-hover.png - ../qdarkstyle_midnight_blue/rc/close-pressed.png - ../qdarkstyle_midnight_blue/rc/down_arrow.png - ../qdarkstyle_midnight_blue/rc/Vmovetoolbar.png - ../qdarkstyle_midnight_blue/rc/left_arrow.png - ../qdarkstyle_midnight_blue/rc/stylesheet-branch-more.png - ../qdarkstyle_midnight_blue/rc/up_arrow.png - ../qdarkstyle_midnight_blue/rc/right_arrow.png - ../qdarkstyle_midnight_blue/rc/left_arrow_disabled.png - ../qdarkstyle_midnight_blue/rc/Hsepartoolbar.png - ../qdarkstyle_midnight_blue/rc/branch_open.png - ../qdarkstyle_midnight_blue/rc/Vsepartoolbar.png - ../qdarkstyle_midnight_blue/rc/down_arrow_disabled.png - ../qdarkstyle_midnight_blue/rc/undock.png - ../qdarkstyle_midnight_blue/rc/checkbox_checked_disabled.png - ../qdarkstyle_midnight_blue/rc/checkbox_checked_focus.png - ../qdarkstyle_midnight_blue/rc/checkbox_checked.png - ../qdarkstyle_midnight_blue/rc/checkbox_indeterminate.png - ../qdarkstyle_midnight_blue/rc/checkbox_indeterminate_focus.png - ../qdarkstyle_midnight_blue/rc/checkbox_unchecked_disabled.png - ../qdarkstyle_midnight_blue/rc/checkbox_unchecked_focus.png - ../qdarkstyle_midnight_blue/rc/checkbox_unchecked.png - ../qdarkstyle_midnight_blue/rc/radio_checked_disabled.png - ../qdarkstyle_midnight_blue/rc/radio_checked_focus.png - ../qdarkstyle_midnight_blue/rc/radio_checked.png - ../qdarkstyle_midnight_blue/rc/radio_unchecked_disabled.png - ../qdarkstyle_midnight_blue/rc/radio_unchecked_focus.png - ../qdarkstyle_midnight_blue/rc/radio_unchecked.png - - - ../qdarkstyle_midnight_blue/style.qss - - diff --git a/dist/qt_themes/default/default.qrc b/dist/qt_themes/default/default.qrc index 4522865b4c..125bc3f342 100644 --- a/dist/qt_themes/default/default.qrc +++ b/dist/qt_themes/default/default.qrc @@ -4,23 +4,37 @@ SPDX-License-Identifier: GPL-2.0-or-later --> + + + style.qss + + + - icons/index.theme icons/16x16/connected.png icons/16x16/connected_notification.png icons/16x16/disconnected.png + icons/16x16/failed.png + icons/16x16/info.png icons/16x16/lock.png + icons/16x16/sync.png + icons/16x16/view-refresh.png icons/48x48/bad_folder.png icons/48x48/chip.png icons/48x48/folder.png icons/48x48/list-add.png + icons/48x48/no_avatar.png icons/48x48/sd_card.png icons/48x48/star.png icons/256x256/plus_folder.png icons/256x256/suyu.png - - style.qss + + + + ../default_dark/icons/index.theme + ../default_dark/icons/16x16/lock.png + ../default_dark/icons/16x16/view-refresh.png diff --git a/dist/qt_themes/colorful/icons/16x16/checked.png b/dist/qt_themes/default/icons/16x16/checked.png similarity index 100% rename from dist/qt_themes/colorful/icons/16x16/checked.png rename to dist/qt_themes/default/icons/16x16/checked.png diff --git a/dist/qt_themes/colorful/icons/16x16/failed.png b/dist/qt_themes/default/icons/16x16/failed.png similarity index 100% rename from dist/qt_themes/colorful/icons/16x16/failed.png rename to dist/qt_themes/default/icons/16x16/failed.png diff --git a/dist/qt_themes/colorful/icons/16x16/info.png b/dist/qt_themes/default/icons/16x16/info.png similarity index 100% rename from dist/qt_themes/colorful/icons/16x16/info.png rename to dist/qt_themes/default/icons/16x16/info.png diff --git a/dist/qt_themes/default/icons/16x16/lock.png b/dist/qt_themes/default/icons/16x16/lock.png index 69d399050804cfa45e00850d4330a5b7cfaa3a43..fd27069d807e26186c8a610bdbcc0ce172562af6 100644 GIT binary patch delta 252 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 N&`{A*F1u|N`hPMhH%|Zn literal 1948 zcma)-eKZsLAIHD5nN5aU-9;WUY$P#{Ym?Uzu!5(^E>B#&inOwpZ8zye?IvXKW~)!Ms)xH zinPlk0077;LI47`YG2aBX8=%(Bzd?~Q{*$RpiC?YcqtZz=o>c=z5GXg`t?63-4fe! zbFgeWf%WwJvdQ=(-W<2)YQ8C{o& zg%KN&u{8KkWTW87Pi~m!JOZ~0vCs!|#E3H1>6G~+t=_=;aI0LIErC@esf7Lra1lT< zUL{8U2vAuo{Vtqwgu!s|aBrP{@QutN5^`F0_o6&8;gQ@@I?pWGjd-lrrD{pw+McyA z<{Ydy^Jk#r2UV2syE+EOj$OiLBbl@NQp?+UMdpXKjail`u+IF!iDa{DftUI1h+kZE z0GS_^&O^mf2*W1qiNGM7b_(}mY%2?y`xRqy99f!HVTYN)XAGU`*d|ya^VQ;K8|kM- z3jerlBsC(&R(~b-X`bGWviEq7Ot&ga$msHIAeU8&^~lmUa?B{)?D9VH$U6Glq-j0I zVG~O986~Y8NtT8=+mA}G-v6l5Xy=%v5EiO@dM;7SYKk|(E>9S;k=Kh^VA*K0504J-a*hl;+5T^(q55GJg8L zGrVw>)<4d=*HGgH&Kl3&7W3+0{OI$?Hl(;#17=+B&dzr*eq8Ocx&Cu7$Vloc3+V!b zP5W29IX^(D)6G2y-le$U*necf?0F{^?!L6QC%M~=`WTkR0F&k&tS2iKEB;v@=;>aU z-V+rDpKb4vQb{)wg-;N~kLg`4QvOemgBk}HJ|)X2qj0LNQ2wtP0Y>E&w! zprWFIzR*eh{r&s!Yj?tGiji5!4`ydL~0$sKS0scSF>V;8?|7YEM!LB`Z zmR?&w2CJplJim6mDjn2JvbJo64=~OI&6E3Cl|#V!5_WX9Vhaa7s!LFjwY@$Fl+UoH z!XufdDz`gmVpLBCenlBaSoUaK2;YacVe4EgDcFNDl4e|pph5F&ey*#OgNQ;e3okpi z4wTdlpm|Ewy7@s6ac7qW&7Q5pDlTwYt+!~HszTdNn=fl7+iVt9T5A~fapw5%(-^z@ z`jK-=F<0UZ9SfCUs4p-fZ=17S4zl3uEJTv&55+ds3MzUm`s!cN=rO8R;iUfWc$X<9 zsHeJb(GnUqf6lYkc$cu%veQrhJ|p)lL@?r(Hy^ASWmYcejvVWma3e}yRmhqczNHRO z{Qt4szjrOkIM=WYFDgk~|MV3Im{s>|PXL=!^J)zp*`=;MF@^q%nbPwfpN7S=&TLA! z8pY?XtLtm?407y*TQt>JhtO6}*dj29k5*mfg&F@?*%z~H2o=l8TDBV4$XGz}1A^vH zzEO3f|0uK+_ChkgZRnUc5Z^Bf11ISl0O5G96Z=%#_uHYp5KA)D=r+*I%`|aKfKlB{ zJVPF|PtDbeloVc9See_AZ0NV*!?2-@vmgV5Y)oyzM`0m??Zw;f;=2m$5-iYGG0_Ua4T1^8k)8-V#duMR9 zXIl;?XR=ymU5;TUze(1MNnXErYbC>*;oPc336Ad{ZFR^bC;vJVxp7IVgjGB}tzbzn z|4S0x3?Yj*F|neAqv$MK)#FI3Q>ci5<$JoYif+Gx6oLfX?61r1Xu?Ra9W4v{9TJU1 z7g$?YVl`fyh@!qiB4@4tI$$Khwz>EEyCjhGB-mC*$NZF^>vz)^DdIR-#gN}6ekRh2 zXW-4fceM7Yf2c})q?U2LpH}v@xm!)PT~#?UM8l2rg3XhB#r7I^Sa2I^bnl6af#l9= zSa97AF_~Graq9C%$({)7W-ABh(CV_(f)Stg4S(jqR|HN@)z*jx=9Dzo(vvF)-y8In zN;B_{gg0;}oOt89<$}b7@)%a%IE|*ryp<|@O!;-otCVvUqLYVTaL0Al{MS!3CGi%} Yh89WFHBF|yt6vw8JpDWxh~e3P1CC-@r2qf` diff --git a/dist/qt_themes/default/icons/48x48/bad_folder.png b/dist/qt_themes/default/icons/48x48/bad_folder.png index 364ec646f6f1c6b5b632fb68efd2602aa2c87f25..34069c6b230de579d436fa9f0c21ae37af905b2e 100644 GIT binary patch delta 503 zcmVMLN`2`L5i1E*bZ0xZA+EWiRRzyd75 z0+!u4eEZa7(PBUW_oJiOcj^3O-H(qLOCa)pFZSO!HzS~4t7FCya6CA!z)2mZY~eTSYnn^Nw}$ z>v}KiDEQb+U3CvQ9-g=)N*xLEKM|z&|4-Fq68}Xh(|h^CH3}8`9|*OzB>g7(FJHJ? tG64xtEsHs}s+0m{xeJ{8Cpa7q$popE`M?eo;{B1n&osBYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vG$ zaR2}!aRGnSI!pin1B6LLK~!i%?U_qx6G0fqceY8JQfje^v^`Z?C}^vKU~SWss8#7B zq7>^BQS_o%D&FixC}>dx@paXk2fb`ZDZ`N1#yeVg56zU<8GBU+9eIp#J@EUkFq1{j3pFdw?%DLe;9&1{xf4~HRFVJbWs4gO*0WZOnAGQDDfvngJ|B@|Er_CrMLvI&}KUPF63tDU+} zHu4pokB2E_rhtzd8%iVXf$ngJ|1ia3wJcx6(n_)N0)IwY>*smAo+q4f{9^0^#k5Ym ztsLbAOnAJ#=$_Rg1-yDZ&wETH%28TCcyq84L#s!mNifwNjkY#ciBu_Sk3cNek5?c3 zsWD#541F15Iv?a4d3h(WRF1L&A|d~3Ea>`)7%IQ{_+{Dc2QLu6iLc^a(T>K3c&rX3 z1zsWj3B_=;jZ8e^3rO;8hQYp#oK3eX^~iLVl1+rr`)T^lJu zs({Fr#zpu9r#Zfe>&A1#;Lj+IubP5$t@m?VuzyUXQpg>F3B3<}qC{lrP&}zm9v86` zt_ui<{7W%#_ltBIm~H4%;-W|$;0Ne4MB*CvM}X_6@#={usi5)06$6iY$_E~HqlmX+ zwH@rsPKnqx5?zS5ieMU;b{2<2fxY35rhVAXKES8oTAPSmy9)Xt1OR#6SL$==RR>Ov#XPMuh06U)WY3f(Jf3*aAUt?W0XXD{?frwy}FYEx@1Okp>)ccpBU+GsvjbfN_gL8l$FL3%p3 z7AA3;zv7H zv$NlKH@gFOfWh#;p`a7>HS|=Xi|Jg_aj&Q#lU501AZa|+UAa*$TBPeBeF7jKv8Dk5 ze;w^um+kXLmkVYMlpEEerQBx#g;3;qrw4ny->$UZmIbjTWRb2Te(?ZM&|~|G3*z^{ zq-+vF0qojdHgVK7zYq;~zqlj79R{1La)8Rp))yK0 z>T2{Kfa!bW0|n%d2^)LCHHh}W@Dahqe*=IEjGiP3<~)Jf8ar(+mgszn)}G`TEFb57 zrOHkr+06?jN9vE!)Eh{BA4vTZFb0xF)Cb}q+CH!X7z0To>I0Mk^tVg^WtNXe+6UHl z0>7F3WqnsRU-W+9EdCE@3Mha(U=39Kwt-~tF_(V@tbhe@rpPOZE8smK ze>p4rtoJlw(sS~Sy_Ung-iEwoLv)`?aNS?OM9DdRze{bt7Y*)v=M)A$(H#DiS)^wYk?h>bk0U9E8N#dFJ zk7Z7Z{bBJ_?b-c#$@lcjrhY3rGspE`T8H<(#ta z__C`C_SfHjI(Z}Ue^zw8&i*}n=g26o2Zjq5>x4_@{atx`@A(p6txs?A`x& zH+P$zDR?}dd{Y-5qcq?&j$$V^VkMm620jJ78Zm`e_>qz)*nf;QVHMxeR!9z)a0X9MeSdR~J!&X``4#E0ETKP|3pDHOwoRWba)+CxW{lhf5VzqmN=u#sSn&Z| z;{&+H2XKuK;2IymH9mlAd;r(@0IpF0t+klgR;^uQtEs2}_oa4>zVMhO2Et<$-76Q` z@eQMQ`;Vx#7cGgnMl~#>_8Fozs^&HfIKb$Wd2k=g^itz9+6HD()!K_OR?wVESyVL! z%ZfH8@e*w(W;ppv)}K?`k`@X>S1?**}8GQ4U;xaoziYw&aP9>#K6FCLDMcJ zMv;L*jPcAXhggPH51kpFeh6)-s@NsKz)&x_JiT1`SSCY{P>+xfP&EvkxzRcGd*aWf ccAs{iWzSA@?$SRO+zyiTboFyt=akR{02`=D;Q#;t delta 149 zcmaFDc#Ls^WqpOGi(^Q}y|>pL`5Fv3SR6k5uRo@K6Ysy;;tX-dvfr70TTlQgYD^lA8tm5GmKYK9DMB>XWemnD#Xmdutj3| x>TEw(y-SO~EY62-=%@ed%(4DlnH&a{XiVnHj+glfIxdw<{Dl&Kl>?zm68m``)x zJLk-u`|dgC{+d@RQ>ILKNUVOj#2Qy=H543u4+o~h}$Yl66AKfZVTN1_u%lf3?qEJG%pMtyv?S3^;TM*WBQU6Utn$ zo&iZTwvu=cA%FhawusB^sRvrKg8dA5auC=2fpKWBmaJhl0}`ukA$A@?EYz-GLc83N zR2i~@-3+j^UtP0GUKoGfTDF3<3`o4O3FGG}#9~1~7Gx=Rq*UF1#$pCUt@}aRW7M*? zFIdTd+^cDzNaPvBpaJoSxrN<+^__ph*a3+*&Bya=F@F$haL%bA;cA#&lm&i;;Jijj z;F$58JZBI+8HE1>9PN9b{WutT9gy42RWxmMAsSzZM)jRA#;F-)j;a$PBPcJBp*{ra zCAz4~kC)iVanB{k0g2ZigJmnCTcu4?3#MW8?Hosw<8vr?%vOyZMuj_Cn|cVvX)Jw2 zYd$#+aDUD75vq)IV#wUorm2I-Ey{db%`4u1)fS)pbKt?UY2;AG*=5ypGw*=|DB9H?LhAYw#E3y`AjA6H(U1-B9gn0&r zoPT;;ZFgQ#K_4S^S`Li41I&xHWS;Hp;0--D^p*T0lzP1k(b_t$Elx!bCsZtp)qj<*O-oPg=d**0_9}GA%|M|Xej&tVxXD-ZPc9DpYdjqf?NCHoQ zS21cCMHX-wW!zdW0rO_jS7;o=X+Bks&Z4hSNC5qKPoST8mu+NJV>djmi?yxVq@d|F zxlh#Z0}n*oUVp=yM)4l|)2;^^MB9g1a~FX1*o{sA`M^Tpr|4T}O4Q^MlFR22Fot>u z9tXt!6L^FDDIc=*9Tt6WXWU%?)?ha{2^3lS7XiOT%xV+Drk0Rg65YU%r9O;GC;Y}_ zglv!Y1wak3EF{lCQNQgHa|_sEsW$@OLh=s)&rlmfAb++2pYi^h29-ZRi3@Lu?#q<- z6RNkNi5e1&2_I@uEpq4@ujnh^_`3|fS^c&gka;sZN^$|~JHSj|z0HJWjM@5Z#Y5tIWjT|}m^rw8d` z7tUQKskO>|#$|+Dpv^^4=KATN8|MRQBj#;e9)A%(M&Ob;SLj_Pg-p`v98v$80Y?g7 z0=NT_$prR`dXyzJ<3~-?2XwECfY?wk1p9nqi-DcG6#K;W3C?;WPCd{i#9CcqvQR0n z_1iH9oYH*~t%9@5xND91I1fAWns6y9{r1Y`UjWO+n2jQ449JUP0(*qeC+rusb-;HY z^M9!_jD5RIpi&cSOkErk=oBLDx;+o*@Gv{5i(6j@(@(lx^mUpxpM$z4v5M3HYk?jQ zgAY;X*HZnrTTGAUs1fZ$WbjS!gWT>0ffk%wY7%vUbsYQhO6WFuxs}u$Eja&E#_msH z`nN7?ChGP?dx1(Ho=P3#Hdb=hnw&r}@Mz0JI909@?jw}1WBs@$2zTI53+Ft7r4Ob>lo6-L4Y};3R4rOrlcXJ3v_k&NARG(<%BeaDteBN6Q9Q0EGrQ3sIBtx~rYT d9Om%9;xE_n=@mA1l}`Ww002ovPDHLkV1gj%$m9S3 diff --git a/dist/qt_themes/default/icons/index.theme b/dist/qt_themes/default/icons/index.theme index 21b35e3e3c..6c455463ee 100644 --- a/dist/qt_themes/default/icons/index.theme +++ b/dist/qt_themes/default/icons/index.theme @@ -1,7 +1,6 @@ [Icon Theme] Name=default -Comment=default theme -Inherits=colorful +Comment=Colorful theme Directories=16x16,48x48,256x256 [16x16] @@ -9,6 +8,6 @@ Size=16 [48x48] Size=48 - + [256x256] Size=256 diff --git a/dist/qt_themes/default/style.qss b/dist/qt_themes/default/style.qss index bd9c1964cf..16b779b1b8 100644 --- a/dist/qt_themes/default/style.qss +++ b/dist/qt_themes/default/style.qss @@ -22,7 +22,7 @@ QPushButton#TogglableStatusBarButton { } QPushButton#TogglableStatusBarButton:checked { - color: #000000; + color: palette(text); } QPushButton#TogglableStatusBarButton:hover { @@ -49,6 +49,10 @@ QPushButton#RendererStatusBarButton:!checked { color: #0066ff; } +QPushButton#RendererStatusBarButton:!checked[dark=true] { + color: #00ccdd; +} + QPushButton#GPUStatusBarButton { color: #656565; border: 1px solid transparent; @@ -65,13 +69,21 @@ QPushButton#GPUStatusBarButton:checked { color: #b06020; } +QPushButton#GPUStatusBarButton:checked[dark=true] { + color: #ff8040; +} + QPushButton#GPUStatusBarButton:!checked { color: #109010; } +QPushButton#GPUStatusBarButton:!checked[dark=true] { + color: #40dd40; +} + QPushButton#DockingStatusBarButton { min-width: 0px; - color: #000000; + color: palette(text); border: 1px solid transparent; background-color: transparent; padding: 0px 3px 0px 3px; @@ -131,10 +143,6 @@ QWidget#connectedControllers { background: transparent; } -QWidget#closeButtons { - background: transparent; -} - QWidget#playersSupported, QWidget#controllersSupported, QWidget#controllerSupported1, @@ -383,7 +391,7 @@ QStackedWidget#stackedDialog QTextBrowser QScrollBar::vertical { border-radius: 4px; } -QStackedWidget#stackedDialog QTextBrowser QScrollBar::horizoncal { +QStackedWidget#stackedDialog QTextBrowser QScrollBar::horizontal { background: #cdcdcd; height: 15px; margin: 3px 15px 3px 15px; @@ -592,42 +600,6 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:pressed { border-radius: 6px; } -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { - image: url(:/overlay/osk_button_B.png); - image-position: right; - qproperty-icon: url(:/overlay/osk_button_backspace.png); - qproperty-iconSize: 36px; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { - image: url(:/overlay/osk_button_Y.png); - image-position: right; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { - image: url(:/overlay/osk_button_plus.png); - image-position: right; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift { - image: url(:/overlay/osk_button_shift_lock_off.png); - image-position: left; - qproperty-icon: url(:/overlay/osk_button_shift.png); - qproperty-iconSize: 36px; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift { - image: url(:/overlay/osk_button_shift_lock_off.png); - image-position: left; - qproperty-icon: url(:/overlay/osk_button_shift_on.png); - qproperty-iconSize: 36px; -} - QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_bracket, QDialog#QtSoftwareKeyboardDialog QPushButton#button_right_bracket, QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_parenthesis, @@ -640,47 +612,6 @@ QDialog#QtSoftwareKeyboardDialog QWidget#titleOSK QLabel { color: #ccc; } -QDialog#QtSoftwareKeyboardDialog QWidget#button_L, -QDialog#QtSoftwareKeyboardDialog QWidget#button_L_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_L_num { - image: url(:/overlay/button_L.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_num { - image: url(:/overlay/arrow_left.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_R, -QDialog#QtSoftwareKeyboardDialog QWidget#button_R_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_R_num { - image: url(:/overlay/button_R.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_num { - image: url(:/overlay/arrow_right.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick, -QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick_shift { - image: url(:/overlay/button_press_stick.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_X, -QDialog#QtSoftwareKeyboardDialog QWidget#button_X_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_X_num { - image: url(:/overlay/button_X.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_A, -QDialog#QtSoftwareKeyboardDialog QWidget#button_A_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_A_num { - image: url(:/overlay/button_A.png); -} - QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled, @@ -711,20 +642,3 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_0:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled { color: palette(midlight); } - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled { - image: url(:/overlay/osk_button_plus_disabled.png); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { - image: url(:/overlay/osk_button_B_disabled.png); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled { - image: url(:/overlay/osk_button_Y_disabled.png); -} diff --git a/dist/qt_themes/colorful_dark/icons/16x16/lock.png b/dist/qt_themes/default_dark/icons/16x16/lock.png similarity index 100% rename from dist/qt_themes/colorful_dark/icons/16x16/lock.png rename to dist/qt_themes/default_dark/icons/16x16/lock.png diff --git a/dist/qt_themes/colorful_dark/icons/16x16/view-refresh.png b/dist/qt_themes/default_dark/icons/16x16/view-refresh.png similarity index 100% rename from dist/qt_themes/colorful_dark/icons/16x16/view-refresh.png rename to dist/qt_themes/default_dark/icons/16x16/view-refresh.png diff --git a/dist/qt_themes/default_dark/icons/index.theme b/dist/qt_themes/default_dark/icons/index.theme index 60a072d1d6..32d84fa9bd 100644 --- a/dist/qt_themes/default_dark/icons/index.theme +++ b/dist/qt_themes/default_dark/icons/index.theme @@ -1,7 +1,7 @@ [Icon Theme] Name=default_dark Comment=Colorful theme (Dark style) -Inherits=colorful +Inherits=default Directories=16x16 [16x16] diff --git a/dist/qt_themes/default_dark/style.qrc b/dist/qt_themes/default_dark/style.qrc deleted file mode 100644 index 7de4737c2c..0000000000 --- a/dist/qt_themes/default_dark/style.qrc +++ /dev/null @@ -1,25 +0,0 @@ - - - - ../colorful/icons/16x16/connected.png - ../colorful/icons/16x16/connected_notification.png - ../colorful/icons/16x16/disconnected.png - icons/index.theme - ../colorful_dark/icons/16x16/lock.png - ../colorful_dark/icons/16x16/view-refresh.png - ../colorful/icons/48x48/bad_folder.png - ../colorful/icons/48x48/chip.png - ../colorful/icons/48x48/folder.png - ../qdarkstyle/icons/48x48/no_avatar.png - ../colorful/icons/48x48/list-add.png - ../colorful/icons/48x48/sd_card.png - ../colorful/icons/256x256/plus_folder.png - - - - style.qss - - diff --git a/dist/qt_themes/default_dark/style.qss b/dist/qt_themes/default_dark/style.qss deleted file mode 100644 index ca6daa2d52..0000000000 --- a/dist/qt_themes/default_dark/style.qss +++ /dev/null @@ -1,687 +0,0 @@ -/* -* SPDX-FileCopyrightText: 2018 yuzu Emulator Project -* SPDX-License-Identifier: GPL-2.0-or-later -*/ -QAbstractSpinBox { - min-height: 19px; -} - -QPushButton#TogglableStatusBarButton { - color: #959595; - border: 1px solid transparent; - background-color: transparent; - padding: 0px 3px 0px 3px; - text-align: center; -} - -QPushButton#TogglableStatusBarButton:checked { - color: palette(text); -} - -QPushButton#TogglableStatusBarButton:hover { - border: 1px solid #76797C; -} - -QPushButton#RendererStatusBarButton { - color: #656565; - border: 1px solid transparent; - background-color: transparent; - padding: 0px 3px 0px 3px; - text-align: center; -} - -QPushButton#RendererStatusBarButton:hover { - border: 1px solid #76797C; -} - -QPushButton#RendererStatusBarButton:checked { - color: #e85c00; -} - -QPushButton#RendererStatusBarButton:!checked { - color: #00ccdd; -} - -QPushButton#GPUStatusBarButton { - color: #656565; - border: 1px solid transparent; - background-color: transparent; - padding: 0px 3px 0px 3px; - text-align: center; -} - -QPushButton#GPUStatusBarButton:hover { - border: 1px solid #76797C; -} - -QPushButton#GPUStatusBarButton:checked { - color: #ff8040; -} - -QPushButton#GPUStatusBarButton:!checked { - color: #40dd40; -} - -QPushButton#DockingStatusBarButton { - min-width: 0px; - color: palette(text); - border: 1px solid transparent; - background-color: transparent; - padding: 0px 3px 0px 3px; - text-align: center; -} - -QPushButton#DockingStatusBarButton:hover { - border: 1px solid #76797C; -} - -QPushButton#buttonRefreshDevices { - min-width: 21px; - min-height: 21px; - max-width: 21px; - max-height: 21px; -} - -QWidget#bottomPerGameInput, -QWidget#topControllerApplet, -QWidget#bottomControllerApplet, -QGroupBox#groupPlayer1Connected:checked, -QGroupBox#groupPlayer2Connected:checked, -QGroupBox#groupPlayer3Connected:checked, -QGroupBox#groupPlayer4Connected:checked, -QGroupBox#groupPlayer5Connected:checked, -QGroupBox#groupPlayer6Connected:checked, -QGroupBox#groupPlayer7Connected:checked, -QGroupBox#groupPlayer8Connected:checked { - background-color: #f5f5f5; -} - -QWidget#topControllerApplet { - border-bottom: 1px solid #828790 -} - -QWidget#bottomPerGameInput, -QWidget#bottomControllerApplet { - border-top: 1px solid #828790 -} - -QWidget#topPerGameInput, -QWidget#middleControllerApplet { - background-color: #fff; -} - -QWidget#topPerGameInput QComboBox, -QWidget#middleControllerApplet QComboBox { - width: 120px; -} - -QWidget#connectedControllers { - background: transparent; -} - -QWidget#playersSupported, -QWidget#controllersSupported, -QWidget#controllerSupported1, -QWidget#controllerSupported2, -QWidget#controllerSupported3, -QWidget#controllerSupported4, -QWidget#controllerSupported5, -QWidget#controllerSupported6 { - border: none; - background: transparent; -} - -QGroupBox#groupPlayer1Connected, -QGroupBox#groupPlayer2Connected, -QGroupBox#groupPlayer3Connected, -QGroupBox#groupPlayer4Connected, -QGroupBox#groupPlayer5Connected, -QGroupBox#groupPlayer6Connected, -QGroupBox#groupPlayer7Connected, -QGroupBox#groupPlayer8Connected { - border: 1px solid #828790; - border-radius: 3px; - padding: 0px; - min-height: 98px; - max-height: 98px; -} - -QGroupBox#groupPlayer1Connected:unchecked, -QGroupBox#groupPlayer2Connected:unchecked, -QGroupBox#groupPlayer3Connected:unchecked, -QGroupBox#groupPlayer4Connected:unchecked, -QGroupBox#groupPlayer5Connected:unchecked, -QGroupBox#groupPlayer6Connected:unchecked, -QGroupBox#groupPlayer7Connected:unchecked, -QGroupBox#groupPlayer8Connected:unchecked { - border: 1px solid #d9d9d9; -} - -QGroupBox#groupPlayer1Connected::title, -QGroupBox#groupPlayer2Connected::title, -QGroupBox#groupPlayer3Connected::title, -QGroupBox#groupPlayer4Connected::title, -QGroupBox#groupPlayer5Connected::title, -QGroupBox#groupPlayer6Connected::title, -QGroupBox#groupPlayer7Connected::title, -QGroupBox#groupPlayer8Connected::title { - subcontrol-origin: margin; - subcontrol-position: top left; - padding-left: 0px; - padding-right: 0px; - padding-top: 1px; - margin-left: 0px; - margin-right: -4px; - margin-bottom: 4px; -} - -QCheckBox#checkboxPlayer1Connected, -QCheckBox#checkboxPlayer2Connected, -QCheckBox#checkboxPlayer3Connected, -QCheckBox#checkboxPlayer4Connected, -QCheckBox#checkboxPlayer5Connected, -QCheckBox#checkboxPlayer6Connected, -QCheckBox#checkboxPlayer7Connected, -QCheckBox#checkboxPlayer8Connected { - spacing: 0px; -} - -QWidget#Player1LEDs QCheckBox, -QWidget#Player2LEDs QCheckBox, -QWidget#Player3LEDs QCheckBox, -QWidget#Player4LEDs QCheckBox, -QWidget#Player5LEDs QCheckBox, -QWidget#Player6LEDs QCheckBox, -QWidget#Player7LEDs QCheckBox, -QWidget#Player8LEDs QCheckBox { - spacing: 0px; -} - -QWidget#Player1LEDs QCheckBox::indicator, -QWidget#Player2LEDs QCheckBox::indicator, -QWidget#Player3LEDs QCheckBox::indicator, -QWidget#Player4LEDs QCheckBox::indicator, -QWidget#Player5LEDs QCheckBox::indicator, -QWidget#Player6LEDs QCheckBox::indicator, -QWidget#Player7LEDs QCheckBox::indicator, -QWidget#Player8LEDs QCheckBox::indicator { - width: 6px; - height: 6px; - margin-left: 0px; -} - -QWidget#bottomPerGameInput QCheckBox#checkboxPlayer1Connected::indicator, -QWidget#bottomPerGameInput QCheckBox#checkboxPlayer2Connected::indicator, -QWidget#bottomPerGameInput QCheckBox#checkboxPlayer3Connected::indicator, -QWidget#bottomPerGameInput QCheckBox#checkboxPlayer4Connected::indicator, -QWidget#bottomPerGameInput QCheckBox#checkboxPlayer5Connected::indicator, -QWidget#bottomPerGameInput QCheckBox#checkboxPlayer6Connected::indicator, -QWidget#bottomPerGameInput QCheckBox#checkboxPlayer7Connected::indicator, -QWidget#bottomPerGameInput QCheckBox#checkboxPlayer8Connected::indicator { - width: 12px; - height: 12px; -} - -QCheckBox#checkboxPlayer1Connected::indicator, -QCheckBox#checkboxPlayer2Connected::indicator, -QCheckBox#checkboxPlayer3Connected::indicator, -QCheckBox#checkboxPlayer4Connected::indicator, -QCheckBox#checkboxPlayer5Connected::indicator, -QCheckBox#checkboxPlayer6Connected::indicator, -QCheckBox#checkboxPlayer7Connected::indicator, -QCheckBox#checkboxPlayer8Connected::indicator { - width: 14px; - height: 14px; -} - -QGroupBox#groupPlayer1Connected::indicator, -QGroupBox#groupPlayer2Connected::indicator, -QGroupBox#groupPlayer3Connected::indicator, -QGroupBox#groupPlayer4Connected::indicator, -QGroupBox#groupPlayer5Connected::indicator, -QGroupBox#groupPlayer6Connected::indicator, -QGroupBox#groupPlayer7Connected::indicator, -QGroupBox#groupPlayer8Connected::indicator { - width: 16px; - height: 16px; -} - -QWidget#Player1LEDs QCheckBox::indicator:checked, -QWidget#Player2LEDs QCheckBox::indicator:checked, -QWidget#Player3LEDs QCheckBox::indicator:checked, -QWidget#Player4LEDs QCheckBox::indicator:checked, -QWidget#Player5LEDs QCheckBox::indicator:checked, -QWidget#Player6LEDs QCheckBox::indicator:checked, -QWidget#Player7LEDs QCheckBox::indicator:checked, -QWidget#Player8LEDs QCheckBox::indicator:checked, -QGroupBox#groupPlayer1Connected::indicator:checked, -QGroupBox#groupPlayer2Connected::indicator:checked, -QGroupBox#groupPlayer3Connected::indicator:checked, -QGroupBox#groupPlayer4Connected::indicator:checked, -QGroupBox#groupPlayer5Connected::indicator:checked, -QGroupBox#groupPlayer6Connected::indicator:checked, -QGroupBox#groupPlayer7Connected::indicator:checked, -QGroupBox#groupPlayer8Connected::indicator:checked, -QCheckBox#checkboxPlayer1Connected::indicator:checked, -QCheckBox#checkboxPlayer2Connected::indicator:checked, -QCheckBox#checkboxPlayer3Connected::indicator:checked, -QCheckBox#checkboxPlayer4Connected::indicator:checked, -QCheckBox#checkboxPlayer5Connected::indicator:checked, -QCheckBox#checkboxPlayer6Connected::indicator:checked, -QCheckBox#checkboxPlayer7Connected::indicator:checked, -QCheckBox#checkboxPlayer8Connected::indicator:checked, -QGroupBox#groupConnectedController::indicator:checked { - border-radius: 2px; - border: 1px solid #929192; - background: #39ff14; - image: none; -} - -QWidget#Player1LEDs QCheckBox::indicator:unchecked, -QWidget#Player2LEDs QCheckBox::indicator:unchecked, -QWidget#Player3LEDs QCheckBox::indicator:unchecked, -QWidget#Player4LEDs QCheckBox::indicator:unchecked, -QWidget#Player5LEDs QCheckBox::indicator:unchecked, -QWidget#Player6LEDs QCheckBox::indicator:unchecked, -QWidget#Player7LEDs QCheckBox::indicator:unchecked, -QWidget#Player8LEDs QCheckBox::indicator:unchecked, -QGroupBox#groupPlayer1Connected::indicator:unchecked, -QGroupBox#groupPlayer2Connected::indicator:unchecked, -QGroupBox#groupPlayer3Connected::indicator:unchecked, -QGroupBox#groupPlayer4Connected::indicator:unchecked, -QGroupBox#groupPlayer5Connected::indicator:unchecked, -QGroupBox#groupPlayer6Connected::indicator:unchecked, -QGroupBox#groupPlayer7Connected::indicator:unchecked, -QGroupBox#groupPlayer8Connected::indicator:unchecked, -QCheckBox#checkboxPlayer1Connected::indicator:unchecked, -QCheckBox#checkboxPlayer2Connected::indicator:unchecked, -QCheckBox#checkboxPlayer3Connected::indicator:unchecked, -QCheckBox#checkboxPlayer4Connected::indicator:unchecked, -QCheckBox#checkboxPlayer5Connected::indicator:unchecked, -QCheckBox#checkboxPlayer6Connected::indicator:unchecked, -QCheckBox#checkboxPlayer7Connected::indicator:unchecked, -QCheckBox#checkboxPlayer8Connected::indicator:unchecked, -QGroupBox#groupConnectedController::indicator:unchecked { - border-radius: 2px; - border: 1px solid #929192; - background: transparent; - image: none; -} - -QWidget#controllerPlayer1, -QWidget#controllerPlayer2, -QWidget#controllerPlayer3, -QWidget#controllerPlayer4, -QWidget#controllerPlayer5, -QWidget#controllerPlayer6, -QWidget#controllerPlayer7, -QWidget#controllerPlayer8 { - background: transparent; -} - -QDialog#QtSoftwareKeyboardDialog, -QStackedWidget#topOSK { - background: rgba(51, 51, 51, .9); -} - - -QDialog#OverlayDialog, -QStackedWidget#stackedDialog { - background: rgba(51, 51, 51, .7); -} - -QWidget#boxOSK, -QWidget#lineOSK, -QWidget#richDialog, -QWidget#lineDialog { - background: transparent; -} - -QStackedWidget#bottomOSK, -QWidget#contentDialog, -QWidget#contentRichDialog { - background: rgba(240, 240, 240, 1); -} - -QWidget#contentDialog, -QWidget#contentRichDialog { - margin: 5px; - border-radius: 6px; -} - -QWidget#buttonsDialog, -QWidget#buttonsRichDialog { - margin: 5px; - border-top: 2px solid rgba(44, 44, 44, 1); -} - -QWidget#legendOSKnum { - border-top: 1px solid rgba(44, 44, 44, 1); -} - -QStackedWidget#stackedDialog QTextBrowser QScrollBar::vertical { - background: #cdcdcd; - width: 15px; - margin: 15px 3px 15px 3px; - border: 1px transparent; - border-radius: 4px; -} - -QStackedWidget#stackedDialog QTextBrowser QScrollBar::horizoncal { - background: #cdcdcd; - height: 15px; - margin: 3px 15px 3px 15px; - border: 1px transparent; - border-radius: 4px; -} - -QStackedWidget#stackedDialog QTextBrowser QScrollBar::handle { - background: #fff; - border-radius: 4px; - min-height: 5px; - min-width: 5px; -} - -QStackedWidget#stackedDialog QTextBrowser QScrollBar::add-line, -QStackedWidget#stackedDialog QTextBrowser QScrollBar::sub-line, -QStackedWidget#stackedDialog QTextBrowser QScrollBar::add-page, -QStackedWidget#stackedDialog QTextBrowser QScrollBar::sub-page { - background: none; -} - -QWidget#inputOSK { - border-bottom: 3px solid rgba(255, 255, 255, .9); -} - -QWidget#inputOSK QLineEdit { - background: transparent; - border: none; - color: #ccc; -} - -QWidget#inputBoxOSK { - border: 2px solid rgba(255, 255, 255, .9); -} - -QWidget#inputBoxOSK QTextEdit { - background: transparent; - border: none; - color: #ccc; -} - -QWidget#richDialog QTextBrowser { - background: transparent; - border: none; - padding: 35px 65px; -} - - -QWidget#lineOSK QLabel#label_header { - color: #f0f0f0; -} - -QWidget#lineOSK QLabel#label_sub, -QWidget#lineOSK QLabel#label_characters, -QWidget#boxOSK QLabel#label_characters_box { - color: #ccc; -} - -QWidget#contentDialog QLabel#label_title, -QWidget#contentRichDialog QLabel#label_title_rich { - color: #888; -} - -QWidget#contentDialog QLabel#label_dialog { - padding: 20px 65px; -} - -QWidget#contentDialog QLabel#label_title, -QWidget#contentRichDialog QLabel#label_title_rich { - padding: 0px 65px; -} - -QDialog#OverlayDialog QPushButton { - color: rgba(49, 79, 239, 1); - background: transparent; - border: none; - padding: 0px; - min-width: 0px; -} - -QDialog#OverlayDialog QPushButton:focus, -QDialog#OverlayDialog QPushButton:hover { - color: rgba(49, 79, 239, 1); - background: rgba(255, 255, 255, 1); - border: 5px solid rgba(148, 250, 202, 1); - border-radius: 6px; - outline: none; -} - -QDialog#OverlayDialog QPushButton:pressed { - color: rgba(240, 240, 240, 1); - background: rgba(150, 150, 150, 1); - border: 5px solid rgba(148, 250, 202, 1); - border-radius: 6px; - outline: none; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton { - background: rgba(232, 232, 232, 1); - border: 2px solid rgba(240, 240, 240, 1); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { - background: rgba(218, 218, 218, 1); - border: 2px solid rgba(240, 240, 240, 1); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { - color: rgba(240, 240, 240, 1); - background: rgba(44, 44, 44, 1); - border: 2px solid rgba(240, 240, 240, 1); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { - color: rgba(240, 240, 240, 1); - background: rgba(49, 79, 239, 1); - border: 2px solid rgba(240, 240, 240, 1); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:focus, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:focus, - -QDialog#QtSoftwareKeyboardDialog QPushButton:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:hover, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:hover { - color: rgba(0, 0, 0, 1); - background: rgba(255, 255, 255, 1); - border: 5px solid rgba(148, 250, 202, 1); - border-radius: 6px; - outline: none; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:pressed, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:pressed { - color: rgba(240, 240, 240, 1); - background: rgba(150, 150, 150, 1); - border: 5px solid rgba(148, 250, 202, 1); - border-radius: 6px; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { - image: url(:/overlay/osk_button_B.png); - image-position: right; - qproperty-icon: url(:/overlay/osk_button_backspace.png); - qproperty-iconSize: 36px; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { - image: url(:/overlay/osk_button_Y.png); - image-position: right; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { - image: url(:/overlay/osk_button_plus.png); - image-position: right; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift { - image: url(:/overlay/osk_button_shift_lock_off.png); - image-position: left; - qproperty-icon: url(:/overlay/osk_button_shift.png); - qproperty-iconSize: 36px; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift { - image: url(:/overlay/osk_button_shift_lock_off.png); - image-position: left; - qproperty-icon: url(:/overlay/osk_button_shift_on.png); - qproperty-iconSize: 36px; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_bracket, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_right_bracket, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_parenthesis, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_right_parenthesis { - padding-bottom: 7px; -} - -QDialog#QtSoftwareKeyboardDialog QWidget#titleOSK QLabel { - background: transparent; - color: #ccc; -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_L, -QDialog#QtSoftwareKeyboardDialog QWidget#button_L_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_L_num { - image: url(:/overlay/button_L.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_num { - image: url(:/overlay/arrow_left.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_R, -QDialog#QtSoftwareKeyboardDialog QWidget#button_R_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_R_num { - image: url(:/overlay/button_R.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_num { - image: url(:/overlay/arrow_right.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick, -QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick_shift { - image: url(:/overlay/button_press_stick.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_X, -QDialog#QtSoftwareKeyboardDialog QWidget#button_X_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_X_num { - image: url(:/overlay/button_X.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_A, -QDialog#QtSoftwareKeyboardDialog QWidget#button_A_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_A_num { - image: url(:/overlay/button_A.png); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { - color: rgba(164, 164, 164, 1); - background-color: rgba(218, 218, 218, 1); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_at:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_slash:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_percent:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_1:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_2:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_3:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_4:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_5:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_6:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_7:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_8:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_9:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_0:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled { - color: rgba(164, 164, 164, 1); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled { - image: url(:/overlay/osk_button_plus_disabled.png); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { - image: url(:/overlay/osk_button_B_disabled.png); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled { - image: url(:/overlay/osk_button_Y_disabled.png); -} diff --git a/dist/qt_themes/monochrome/icons.qrc b/dist/qt_themes/monochrome/icons.qrc new file mode 100644 index 0000000000..4eb16294fe --- /dev/null +++ b/dist/qt_themes/monochrome/icons.qrc @@ -0,0 +1,32 @@ + + + + + icons/index.theme + icons/16x16/lock.png + icons/48x48/bad_folder.png + icons/48x48/chip.png + icons/48x48/folder.png + icons/48x48/list-add.png + icons/48x48/sd_card.png + icons/48x48/star.png + icons/256x256/plus_folder.png + + + + + ../monochrome_dark/icons/index.theme + ../monochrome_dark/icons/16x16/lock.png + ../monochrome_dark/icons/48x48/bad_folder.png + ../monochrome_dark/icons/48x48/chip.png + ../monochrome_dark/icons/48x48/folder.png + ../monochrome_dark/icons/48x48/list-add.png + ../monochrome_dark/icons/48x48/no_avatar.png + ../monochrome_dark/icons/48x48/sd_card.png + ../monochrome_dark/icons/48x48/star.png + ../monochrome_dark/icons/256x256/plus_folder.png + + diff --git a/dist/qt_themes/monochrome/icons/16x16/lock.png b/dist/qt_themes/monochrome/icons/16x16/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..69d399050804cfa45e00850d4330a5b7cfaa3a43 GIT binary patch literal 318 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 Yh89WFHBF|yt6vw8JpDWxh~e3P1CC-@r2qf` literal 0 HcmV?d00001 diff --git a/dist/qt_themes/monochrome/icons/48x48/bad_folder.png b/dist/qt_themes/monochrome/icons/48x48/bad_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..364ec646f6f1c6b5b632fb68efd2602aa2c87f25 GIT binary patch literal 1007 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vG$aR2}!aRGnSI!pin1B6LLK~!i%?U_qx z6G0fqceY8JQfje^v^`Z?C}^vKU~SWss8#7Bq7>^BQS_o%D&FixC}>dx@paXk2fb!jWysaGN1x$Fnz386RA_cs9JkNVfB+5}*KzMVo z5<{y;q)9N<9gVg&R*6(8YL7rH){j>o{HZZs%M5)PVmcq>8+myruvCt+0wN**YAopb zi5M!s`S@ko?FTOqzlpEnUD1xlhIp(FB?VwYW}3myAWYoh(Hxy15i^77XU%ODqNIRm zsA)TAnqQsWj3B_=;jZ8e^3r zO;8hQYp#oK3eX^~iLVl1+rr`)T^lJus({Fr#zpu9r#Zfe>&A1#;Lj+IubP5$t@m?V zuuP;<$Q^+Ry$^k&L}ckuJgH9}7qJws3kZk&OEGZwi*y>8ZRk?sqDUR!2k0|I;u`ly zfa|C6>WL?*pz*^M1CM&j2Of5#h__<39qh|aiP$v~U5K}eU>cZq7KcNDz2T0geb~-E zz^C9^n}}TFz5u5E5Rnrej8uAxaM_G!0EK=Rp=(?hfG77T^ho4iLv7dvX}nq6NNrBuZx2B0n{&Y%FbQ3BjX|dkvr%emElgoI zw0EU!l-g)MR&=5T4ne0Kvq5?~w-zRGn!oAM^*Tr!RzSCZ@~MLUANU0C!aI=u%gB)< d$Nzz*{RLYl6+9v2Tqpnl002ovPDHLkV1lP2!l3{F literal 0 HcmV?d00001 diff --git a/dist/qt_themes/monochrome/icons/48x48/chip.png b/dist/qt_themes/monochrome/icons/48x48/chip.png new file mode 100644 index 0000000000000000000000000000000000000000..1b573d51af66864f03a7e20179d3ea4d5f36a012 GIT binary patch literal 511 zcmV9EdCE@3Mha(U=39Kwt-~tF_(V@tbhe@rpPOZE8smKIV=0D_cUSBbMlS7Ve^b~ zpCI|hZY>H}i=fZIrA1)D1@I{LT3H0%iJ()9pbkp0*SBv$NROG$ZR`C;c@8vM#WlBm z{-GACg|z-hS|#Kl^7*&fDJ`V(w`ieRqP0$ZEg|VT>qFz6Y$1y&q@7Zx@kTj?21PC) zHMxM)jIsc&7LsTWuF!bVv`}9saWpNoO|;gDRts6n>E5-FHCYQuD)BkSjYNaI%<}%J z58;F3UVI|X%|r>jh`p8;fgjL6pjLKcQNTIyl_2?73nvPx#1ZP1_K>z@;j|==^1poj532;bRa{vG$asU7#askq98zBGy0jx!G;=NG{;w3(V&)^%7sC5cDp(K0(Eum7VP&2?Hew~5;RZehy&5rvSNM^VC)kWN zVHMxeR!9z)a0X9MeRGaIYAAsD73r}op+A}nH0$iPO`j}shnuBljNAke zx8X5LOP&H)@c~@p1GvTqaE%Y(8Xv$lK7ea{0N3~cu2BH3wV2petzBcQsi*+=rFM+I z@R%hA!ebQOD;L`F4WoDakEpd5Es3~BH7uj{8KO0+<~9sC!03~Ca39O`<1^X@W>MAJ zi!oNvoJv_#H3rLyHYV{BZ6{_ytlBSEK+1 z9X(wfLp;3So;KuSP~dUC`0U^Gu!R9iB3fEjPkbdm@pg-Z*l@4;Y#AsZGNCu2rl{_h ojlvg2t|q1;trMCncE~dD#zk`|?lR_b0UE~O>FVdQ&MBb@0NraiKmY&$ literal 0 HcmV?d00001 diff --git a/dist/qt_themes/monochrome/icons/48x48/sd_card.png b/dist/qt_themes/monochrome/icons/48x48/sd_card.png new file mode 100644 index 0000000000000000000000000000000000000000..6bcb7f6b1d93ab9bf8731849832aa88df68b0fd3 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC&H|6fVg?31We{epSZZGe6s+)c zaSX}0_x8FYUxNV$i^GTi^~cn&+=x(=%u};{v&H06PkCtJvZCsP{SW0+&pdlL-EzG| z-1TF9PY%8>U;^s5J>Boa&B$C$hNGxBS?WfCd ieyFWGC%N1H)%2fvs!qH~tv4HLK~kQselF{r5}E)AjzNq7 literal 0 HcmV?d00001 diff --git a/dist/qt_themes/monochrome/icons/48x48/star.png b/dist/qt_themes/monochrome/icons/48x48/star.png new file mode 100644 index 0000000000000000000000000000000000000000..c2b78f0c3e543913b18d4f95956109c7d2646ba8 GIT binary patch literal 1029 zcmV+g1p51lP)X)lQZo@-L=cu)ZHg3&%A{3AU{olP z1-a8`)uIOkK?H#db72rfkkLY-$D*Q0B3jg{0v8dMp}mlZe3E70Z83B4od0>=d**0_ z9}GA%|M|Xej&tVxXD-ZPc9DpYdjqf?NCHoQS21cCMHX-wW!zdW0rO_jS7;o=X+Bks z&Z4hSNC5qKPoST8mu+NJV>djmi?yxVq@d|Fxlh#Z0}n*oUc;J3@gDort_K=K+lN_m z7l8HHjZOghz(U}s=v!w>)Z`M9%jXd=hI$7c2gLppc!T{ZAF}iv7JYAL++6_HU^h4k z6j}Ng0l!7eY7@eymXKT$-N2BgK8#8y{KjO2Y>)N@Kn<`gB+o%nzwHup3)o?)Hv->6 z@(%#dP#Z%awgI2<{+b4rKR}5KZ;9^9l=l;`HOTxDU^IeA61d{Se>Eca2vF)bfin>W zo}%`CFBG7bLKKbDRzmp>tP=HJZ7K*qfakzHE#ieypcdE-YyuXC;I0MAeLUK50sCyH zfQvwG2qDwR)!I|S(|Nx^<+#6SuYrmf%}P{gP3dD2SQ#|h?r?fl42qN*&`iR&v&woIo+~%R@L- zt`Y7dl&@p`xF!g9;7<$ZJj6y&w`}R6QIB=wJR9Av6A9oXY8y>Un14sh237!t2005+lkvK%ox>dF@W0|O*YW8UHg=Uy00000NkvXXu0mjfk8a2c literal 0 HcmV?d00001 diff --git a/dist/qt_themes/colorful/icons/index.theme b/dist/qt_themes/monochrome/icons/index.theme similarity index 60% rename from dist/qt_themes/colorful/icons/index.theme rename to dist/qt_themes/monochrome/icons/index.theme index 6eb3c69495..c2764622e0 100644 --- a/dist/qt_themes/colorful/icons/index.theme +++ b/dist/qt_themes/monochrome/icons/index.theme @@ -1,8 +1,9 @@ [Icon Theme] -Name=colorful -Comment=Colorful theme +Name=monochrome +Comment=Monochrome light icons +Inherits=default Directories=16x16,48x48,256x256 - + [16x16] Size=16 diff --git a/dist/qt_themes/monochrome/style.qrc b/dist/qt_themes/monochrome/style.qrc new file mode 100644 index 0000000000..54778e2f54 --- /dev/null +++ b/dist/qt_themes/monochrome/style.qrc @@ -0,0 +1,5 @@ + + + ../default/style.qss + + diff --git a/dist/qt_themes/qdarkstyle/icons/16x16/lock.png b/dist/qt_themes/monochrome_dark/icons/16x16/lock.png similarity index 100% rename from dist/qt_themes/qdarkstyle/icons/16x16/lock.png rename to dist/qt_themes/monochrome_dark/icons/16x16/lock.png diff --git a/dist/qt_themes/qdarkstyle/icons/256x256/plus_folder.png b/dist/qt_themes/monochrome_dark/icons/256x256/plus_folder.png similarity index 100% rename from dist/qt_themes/qdarkstyle/icons/256x256/plus_folder.png rename to dist/qt_themes/monochrome_dark/icons/256x256/plus_folder.png diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/bad_folder.png b/dist/qt_themes/monochrome_dark/icons/48x48/bad_folder.png similarity index 100% rename from dist/qt_themes/qdarkstyle/icons/48x48/bad_folder.png rename to dist/qt_themes/monochrome_dark/icons/48x48/bad_folder.png diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/chip.png b/dist/qt_themes/monochrome_dark/icons/48x48/chip.png similarity index 100% rename from dist/qt_themes/qdarkstyle/icons/48x48/chip.png rename to dist/qt_themes/monochrome_dark/icons/48x48/chip.png diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/folder.png b/dist/qt_themes/monochrome_dark/icons/48x48/folder.png similarity index 100% rename from dist/qt_themes/qdarkstyle/icons/48x48/folder.png rename to dist/qt_themes/monochrome_dark/icons/48x48/folder.png diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/list-add.png b/dist/qt_themes/monochrome_dark/icons/48x48/list-add.png similarity index 100% rename from dist/qt_themes/qdarkstyle/icons/48x48/list-add.png rename to dist/qt_themes/monochrome_dark/icons/48x48/list-add.png diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/no_avatar.png b/dist/qt_themes/monochrome_dark/icons/48x48/no_avatar.png similarity index 100% rename from dist/qt_themes/qdarkstyle/icons/48x48/no_avatar.png rename to dist/qt_themes/monochrome_dark/icons/48x48/no_avatar.png diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/sd_card.png b/dist/qt_themes/monochrome_dark/icons/48x48/sd_card.png similarity index 100% rename from dist/qt_themes/qdarkstyle/icons/48x48/sd_card.png rename to dist/qt_themes/monochrome_dark/icons/48x48/sd_card.png diff --git a/dist/qt_themes/qdarkstyle/icons/48x48/star.png b/dist/qt_themes/monochrome_dark/icons/48x48/star.png similarity index 100% rename from dist/qt_themes/qdarkstyle/icons/48x48/star.png rename to dist/qt_themes/monochrome_dark/icons/48x48/star.png diff --git a/dist/qt_themes/monochrome_dark/icons/index.theme b/dist/qt_themes/monochrome_dark/icons/index.theme new file mode 100644 index 0000000000..9ca318d09e --- /dev/null +++ b/dist/qt_themes/monochrome_dark/icons/index.theme @@ -0,0 +1,14 @@ +[Icon Theme] +Name=monochrome_dark +Comment=Monochrome dark icons +Inherits=default_dark +Directories=16x16,48x48,256x256 + +[16x16] +Size=16 + +[48x48] +Size=48 + +[256x256] +Size=256 diff --git a/dist/qt_themes/qdarkstyle/style.qss b/dist/qt_themes/qdarkstyle/dark.qss similarity index 93% rename from dist/qt_themes/qdarkstyle/style.qss rename to dist/qt_themes/qdarkstyle/dark.qss index 328ac942fc..09397f89f5 100644 --- a/dist/qt_themes/qdarkstyle/style.qss +++ b/dist/qt_themes/qdarkstyle/dark.qss @@ -1380,10 +1380,6 @@ QWidget#connectedControllers { background: transparent; } -QWidget#closeButtons { - background: transparent; -} - QWidget#playersSupported, QWidget#controllersSupported, QWidget#controllerSupported1, @@ -1843,40 +1839,17 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:pressed { QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { - image: url(:/overlay/osk_button_B_dark.png); image-position: right; - qproperty-icon: url(:/overlay/osk_button_backspace_dark.png); qproperty-iconSize: 36px; } -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { - image: url(:/overlay/osk_button_Y_dark.png); - image-position: right; -} - QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { color: rgba(44, 44, 44, 1); - image: url(:/overlay/osk_button_plus_dark.png); image-position: right; } -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift { - image: url(:/overlay/osk_button_shift_lock_off.png); - image-position: left; - qproperty-icon: url(:/overlay/osk_button_shift_dark.png); - qproperty-iconSize: 36px; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift { - image: url(:/overlay/osk_button_shift_lock_off.png); - image-position: left; - qproperty-icon: url(:/overlay/osk_button_shift_on_dark.png); - qproperty-iconSize: 36px; -} - QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_bracket, QDialog#QtSoftwareKeyboardDialog QPushButton#button_right_bracket, QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_parenthesis, @@ -1889,47 +1862,6 @@ QDialog#QtSoftwareKeyboardDialog QWidget#titleOSK QLabel { color: #ccc; } -QDialog#QtSoftwareKeyboardDialog QWidget#button_L, -QDialog#QtSoftwareKeyboardDialog QWidget#button_L_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_L_num { - image: url(:/overlay/button_L_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_num { - image: url(:/overlay/arrow_left_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_R, -QDialog#QtSoftwareKeyboardDialog QWidget#button_R_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_R_num { - image: url(:/overlay/button_R_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_num { - image: url(:/overlay/arrow_right_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick, -QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick_shift { - image: url(:/overlay/button_press_stick_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_X, -QDialog#QtSoftwareKeyboardDialog QWidget#button_X_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_X_num { - image: url(:/overlay/button_X_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_A, -QDialog#QtSoftwareKeyboardDialog QWidget#button_A_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_A_num { - image: url(:/overlay/button_A_dark.png); -} - QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled, @@ -1961,23 +1893,6 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled { color: rgba(144, 144, 144, 1); } -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled { - image: url(:/overlay/osk_button_plus_dark_disabled.png); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { - image: url(:/overlay/osk_button_B_dark_disabled.png); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled { - image: url(:/overlay/osk_button_Y_dark_disabled.png); -} - QDialog#QtSoftwareKeyboardDialog QFrame, QDialog#QtSoftwareKeyboardDialog QFrame[frameShape="0"], QDialog#OverlayDialog QFrame, diff --git a/dist/qt_themes/qdarkstyle/icons.qrc b/dist/qt_themes/qdarkstyle/icons.qrc new file mode 100644 index 0000000000..d7ec900649 --- /dev/null +++ b/dist/qt_themes/qdarkstyle/icons.qrc @@ -0,0 +1,51 @@ + + + icons/index.theme + ../default_dark/icons/16x16/lock.png + + + icons/index.theme + ../default_dark/icons/16x16/lock.png + + + rc/branch_closed-on.png + rc/branch_closed.png + rc/branch_open-on.png + rc/branch_open.png + rc/checkbox_checked.png + rc/checkbox_checked_disabled.png + rc/checkbox_checked_focus.png + rc/checkbox_indeterminate.png + rc/checkbox_indeterminate_focus.png + rc/checkbox_unchecked.png + rc/checkbox_unchecked_disabled.png + rc/checkbox_unchecked_focus.png + rc/close-hover.png + rc/close-pressed.png + rc/close.png + rc/down_arrow.png + rc/down_arrow_disabled.png + rc/Hmovetoolbar.png + rc/Hsepartoolbar.png + rc/left_arrow.png + rc/left_arrow_disabled.png + rc/radio_checked.png + rc/radio_checked_disabled.png + rc/radio_checked_focus.png + rc/radio_unchecked.png + rc/radio_unchecked_disabled.png + rc/radio_unchecked_focus.png + rc/right_arrow.png + rc/right_arrow_disabled.png + rc/sizegrip.png + rc/stylesheet-branch-end.png + rc/stylesheet-branch-more.png + rc/stylesheet-vline.png + rc/transparent.png + rc/undock.png + rc/up_arrow.png + rc/up_arrow_disabled.png + rc/Vmovetoolbar.png + rc/Vsepartoolbar.png + + diff --git a/dist/qt_themes/qdarkstyle/icons/16x16/connected.png b/dist/qt_themes/qdarkstyle/icons/16x16/connected.png deleted file mode 100644 index 0afc18cb7a19028fd567a7ca7ced62cd164657de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 575 zcmV-F0>J%=P)0k{|sIn0V`B1xGGFnerg>I4!7^B>UM&p)aM9vQI<{ZJ4 z8HZ4p+_%{7AT1;1-`r}Q8XRRVYW9}G=D3HXRO!FFg z<>v6FfXkm66-$M=OnPPtTpl}lK!#o^J26y#00VLkV5Ig4hAIxCZ~AU@6mMaG2|$+zA&;BarDZyi@16B z4lE8kTwX8y!4LxB2>hW4yn!GbZg+WiA%P|k^Ip;o774}ts6fO6U&y7=hp3TO@-WL? z{^Mh)gLW3&bGqIiV!1gSPQ{V|zW{P&fJjHVbAtc? N002ovPDHLkV1hH82Xp`c diff --git a/dist/qt_themes/qdarkstyle/icons/16x16/connected_notification.png b/dist/qt_themes/qdarkstyle/icons/16x16/connected_notification.png deleted file mode 100644 index 72466e098e471ae5a97c49a56536dd4bf62b3a08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 760 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0*y&TK~y+Tl~Y|v z6j2oZ?(CguoZVz~OB-RWz#nLd9z^@Yo&q%@j2=qtp^PLV$cmEeAL_xE^2wfrs242~ zp$Ef$h%#S%kW`EcLR4x6ZEJVk8F%j7>CU(tNkRF+;a<+Y=R4my_gvyQ4zjp<{ql`; zI^D*(O+BwTbI<>_2MD8-wl5<%-+In!I@(0@^Fzo{bD*j!D3xKFhG&Lp!dzV1$6_(` z^gLuV6YIgUEb0c8*Ie*2x#lAhY;J={1gb21z6E0ugAZC@F^euEux;jDmV`UFz7l>- zK|xT%#N<56!g^D3Wwr@)QUY z@d)MRLDK?Qog0L{ZY_3>K0_%MP_m~6ird7|QOF|6#=1I$H9tA_=53H>6>z~YHTJ@7 zb_Nd4PV}Lux(a+|27GF2$(u@fs~(9UHZ*jca>r)zc$_}(It@ippva0SLlzB`5RY_2 zDJ%pZ9`=H=;M3EPtE-_V5`;>`*WTHAw^h71&5pJA_QIN1DX?Z|p%fSYQs6=ghhYg- zVhSf|d1>iW;`5ymOPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0v$<2K~y+Tl~PS> zQ$Z9x^WL<1ZG=jLsqtf@CIu;o=wGnd1VlHD;-XFKLZw(mq)@*>1VJ>!or+OVq^`wu znJxuC&?1zmaamnO1NME*%5JoAzwQ9hHiSzzQVT5*fC(vPaz_Kh*+6Kq5b=Zyr$6d-BjRvNsUN9r<)$o0v zs;137DRgyhL@Z{(G)=_g8<0qB!nUp3v1>;LeY^L_vp9U_(^UgFXW)W|)!HD0fHMwq z`Rc|0_8q`L@sq zk>1%G63fVBGANuFmY*(fDuPllKmS8eCS`Em`r?L1hp>O&UTLdSRsk4e>gLt9;4C;0 zLcq{BFQXMa*Fk%G45d;@#y$LM{=|d(5AnGC1hkF9bzQ?)OM&Zp`Y#clJ$)W#YAJ!{ z4H0nGY&P-w?HjzG{fJLxahf`;55)a!M*cR#Fvf$Tw4UQO#< z+13h9kDdH|_{gEo)RvScR^ra>BKrFe$hQ&GwNfR74B5P3+o;Y|898=5|6Tg*(O>)p iN=@~G{{?26=FLU_5=aXOVS_yY00002?p zD}XSgpwrRCKtah8*NBqf{Irtt#G+J&^73-M%)IR4TP^t%4d#k2I8Aju - - icons/index.theme - icons/16x16/connected.png - icons/16x16/disconnected.png - icons/16x16/connected_notification.png - icons/16x16/lock.png - icons/16x16/view-refresh.png - icons/48x48/bad_folder.png - icons/48x48/chip.png - icons/48x48/folder.png - icons/48x48/no_avatar.png - icons/48x48/list-add.png - icons/48x48/sd_card.png - icons/48x48/star.png - icons/256x256/plus_folder.png - - - rc/up_arrow_disabled.png - rc/Hmovetoolbar.png - rc/stylesheet-branch-end.png - rc/branch_closed-on.png - rc/stylesheet-vline.png - rc/branch_closed.png - rc/branch_open-on.png - rc/transparent.png - rc/right_arrow_disabled.png - rc/sizegrip.png - rc/close.png - rc/close-hover.png - rc/close-pressed.png - rc/down_arrow.png - rc/Vmovetoolbar.png - rc/left_arrow.png - rc/stylesheet-branch-more.png - rc/up_arrow.png - rc/right_arrow.png - rc/left_arrow_disabled.png - rc/Hsepartoolbar.png - rc/branch_open.png - rc/Vsepartoolbar.png - rc/down_arrow_disabled.png - rc/undock.png - rc/checkbox_checked_disabled.png - rc/checkbox_checked_focus.png - rc/checkbox_checked.png - rc/checkbox_indeterminate.png - rc/checkbox_indeterminate_focus.png - rc/checkbox_unchecked_disabled.png - rc/checkbox_unchecked_focus.png - rc/checkbox_unchecked.png - rc/radio_checked_disabled.png - rc/radio_checked_focus.png - rc/radio_checked.png - rc/radio_unchecked_disabled.png - rc/radio_unchecked_focus.png - rc/radio_unchecked.png - - - style.qss - + + dark.qss + diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/style.qss b/dist/qt_themes/qdarkstyle_midnight_blue/dark.qss similarity index 95% rename from dist/qt_themes/qdarkstyle_midnight_blue/style.qss rename to dist/qt_themes/qdarkstyle_midnight_blue/dark.qss index eb0889b139..a90ac5d5e0 100644 --- a/dist/qt_themes/qdarkstyle_midnight_blue/style.qss +++ b/dist/qt_themes/qdarkstyle_midnight_blue/dark.qss @@ -2779,41 +2779,10 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:pressed { border-radius: 6px; } -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { - image: url(:/overlay/osk_button_B_dark.png); - image-position: right; - qproperty-icon: url(:/overlay/osk_button_backspace_dark.png); - qproperty-iconSize: 36px; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { - image: url(:/overlay/osk_button_Y_dark.png); - image-position: right; -} - QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { color: rgba(44, 44, 44, 1); - image: url(:/overlay/osk_button_plus_dark.png); - image-position: right; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift { - image: url(:/overlay/osk_button_shift_lock_off.png); - image-position: left; - qproperty-icon: url(:/overlay/osk_button_shift_dark.png); - qproperty-iconSize: 36px; -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift { - image: url(:/overlay/osk_button_shift_lock_off.png); - image-position: left; - qproperty-icon: url(:/overlay/osk_button_shift_on_dark.png); - qproperty-iconSize: 36px; } QDialog#QtSoftwareKeyboardDialog QPushButton#button_left_bracket, @@ -2828,47 +2797,6 @@ QDialog#QtSoftwareKeyboardDialog QWidget#titleOSK QLabel { color: #ccc; } -QDialog#QtSoftwareKeyboardDialog QWidget#button_L, -QDialog#QtSoftwareKeyboardDialog QWidget#button_L_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_L_num { - image: url(:/overlay/button_L_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_left_num { - image: url(:/overlay/arrow_left_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_R, -QDialog#QtSoftwareKeyboardDialog QWidget#button_R_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_R_num { - image: url(:/overlay/button_R_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#arrow_right_num { - image: url(:/overlay/arrow_right_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick, -QDialog#QtSoftwareKeyboardDialog QWidget#button_press_stick_shift { - image: url(:/overlay/button_press_stick_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_X, -QDialog#QtSoftwareKeyboardDialog QWidget#button_X_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_X_num { - image: url(:/overlay/button_X_dark.png); -} - -QDialog#QtSoftwareKeyboardDialog QWidget#button_A, -QDialog#QtSoftwareKeyboardDialog QWidget#button_A_shift, -QDialog#QtSoftwareKeyboardDialog QWidget#button_A_num { - image: url(:/overlay/button_A_dark.png); -} - QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled, @@ -2899,20 +2827,3 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_0:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled { color: rgba(144, 144, 144, 1); } - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled { - image: url(:/overlay/osk_button_plus_dark_disabled.png); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { - image: url(:/overlay/osk_button_B_dark_disabled.png); -} - -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, -QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled { - image: url(:/overlay/osk_button_Y_dark_disabled.png); -} diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/icons.qrc b/dist/qt_themes/qdarkstyle_midnight_blue/icons.qrc new file mode 100644 index 0000000000..1a071adda6 --- /dev/null +++ b/dist/qt_themes/qdarkstyle_midnight_blue/icons.qrc @@ -0,0 +1,224 @@ + + + + + icons/index.theme + + + icons/index.theme + + + + rc/arrow_down.png + rc/arrow_down@2x.png + rc/arrow_down_disabled.png + rc/arrow_down_disabled@2x.png + rc/arrow_down_focus.png + rc/arrow_down_focus@2x.png + rc/arrow_down_pressed.png + rc/arrow_down_pressed@2x.png + rc/arrow_left.png + rc/arrow_left@2x.png + rc/arrow_left_disabled.png + rc/arrow_left_disabled@2x.png + rc/arrow_left_focus.png + rc/arrow_left_focus@2x.png + rc/arrow_left_pressed.png + rc/arrow_left_pressed@2x.png + rc/arrow_right.png + rc/arrow_right@2x.png + rc/arrow_right_disabled.png + rc/arrow_right_disabled@2x.png + rc/arrow_right_focus.png + rc/arrow_right_focus@2x.png + rc/arrow_right_pressed.png + rc/arrow_right_pressed@2x.png + rc/arrow_up.png + rc/arrow_up@2x.png + rc/arrow_up_disabled.png + rc/arrow_up_disabled@2x.png + rc/arrow_up_focus.png + rc/arrow_up_focus@2x.png + rc/arrow_up_pressed.png + rc/arrow_up_pressed@2x.png + rc/base_icon.png + rc/base_icon@2x.png + rc/base_icon_disabled.png + rc/base_icon_disabled@2x.png + rc/base_icon_focus.png + rc/base_icon_focus@2x.png + rc/base_icon_pressed.png + rc/base_icon_pressed@2x.png + rc/branch_closed.png + rc/branch_closed@2x.png + rc/branch_closed_disabled.png + rc/branch_closed_disabled@2x.png + rc/branch_closed_focus.png + rc/branch_closed_focus@2x.png + rc/branch_closed_pressed.png + rc/branch_closed_pressed@2x.png + rc/branch_end.png + rc/branch_end@2x.png + rc/branch_end_disabled.png + rc/branch_end_disabled@2x.png + rc/branch_end_focus.png + rc/branch_end_focus@2x.png + rc/branch_end_pressed.png + rc/branch_end_pressed@2x.png + rc/branch_line.png + rc/branch_line@2x.png + rc/branch_line_disabled.png + rc/branch_line_disabled@2x.png + rc/branch_line_focus.png + rc/branch_line_focus@2x.png + rc/branch_line_pressed.png + rc/branch_line_pressed@2x.png + rc/branch_more.png + rc/branch_more@2x.png + rc/branch_more_disabled.png + rc/branch_more_disabled@2x.png + rc/branch_more_focus.png + rc/branch_more_focus@2x.png + rc/branch_more_pressed.png + rc/branch_more_pressed@2x.png + rc/branch_open.png + rc/branch_open@2x.png + rc/branch_open_disabled.png + rc/branch_open_disabled@2x.png + rc/branch_open_focus.png + rc/branch_open_focus@2x.png + rc/branch_open_pressed.png + rc/branch_open_pressed@2x.png + rc/checkbox_checked.png + rc/checkbox_checked@2x.png + rc/checkbox_checked_disabled.png + rc/checkbox_checked_disabled@2x.png + rc/checkbox_checked_focus.png + rc/checkbox_checked_focus@2x.png + rc/checkbox_checked_pressed.png + rc/checkbox_checked_pressed@2x.png + rc/checkbox_indeterminate.png + rc/checkbox_indeterminate@2x.png + rc/checkbox_indeterminate_disabled.png + rc/checkbox_indeterminate_disabled@2x.png + rc/checkbox_indeterminate_focus.png + rc/checkbox_indeterminate_focus@2x.png + rc/checkbox_indeterminate_pressed.png + rc/checkbox_indeterminate_pressed@2x.png + rc/checkbox_unchecked.png + rc/checkbox_unchecked@2x.png + rc/checkbox_unchecked_disabled.png + rc/checkbox_unchecked_disabled@2x.png + rc/checkbox_unchecked_focus.png + rc/checkbox_unchecked_focus@2x.png + rc/checkbox_unchecked_pressed.png + rc/checkbox_unchecked_pressed@2x.png + rc/line_horizontal.png + rc/line_horizontal@2x.png + rc/line_horizontal_disabled.png + rc/line_horizontal_disabled@2x.png + rc/line_horizontal_focus.png + rc/line_horizontal_focus@2x.png + rc/line_horizontal_pressed.png + rc/line_horizontal_pressed@2x.png + rc/line_vertical.png + rc/line_vertical@2x.png + rc/line_vertical_disabled.png + rc/line_vertical_disabled@2x.png + rc/line_vertical_focus.png + rc/line_vertical_focus@2x.png + rc/line_vertical_pressed.png + rc/line_vertical_pressed@2x.png + rc/radio_checked.png + rc/radio_checked@2x.png + rc/radio_checked_disabled.png + rc/radio_checked_disabled@2x.png + rc/radio_checked_focus.png + rc/radio_checked_focus@2x.png + rc/radio_checked_pressed.png + rc/radio_checked_pressed@2x.png + rc/radio_unchecked.png + rc/radio_unchecked@2x.png + rc/radio_unchecked_disabled.png + rc/radio_unchecked_disabled@2x.png + rc/radio_unchecked_focus.png + rc/radio_unchecked_focus@2x.png + rc/radio_unchecked_pressed.png + rc/radio_unchecked_pressed@2x.png + rc/toolbar_move_horizontal.png + rc/toolbar_move_horizontal@2x.png + rc/toolbar_move_horizontal_disabled.png + rc/toolbar_move_horizontal_disabled@2x.png + rc/toolbar_move_horizontal_focus.png + rc/toolbar_move_horizontal_focus@2x.png + rc/toolbar_move_horizontal_pressed.png + rc/toolbar_move_horizontal_pressed@2x.png + rc/toolbar_move_vertical.png + rc/toolbar_move_vertical@2x.png + rc/toolbar_move_vertical_disabled.png + rc/toolbar_move_vertical_disabled@2x.png + rc/toolbar_move_vertical_focus.png + rc/toolbar_move_vertical_focus@2x.png + rc/toolbar_move_vertical_pressed.png + rc/toolbar_move_vertical_pressed@2x.png + rc/toolbar_separator_horizontal.png + rc/toolbar_separator_horizontal@2x.png + rc/toolbar_separator_horizontal_disabled.png + rc/toolbar_separator_horizontal_disabled@2x.png + rc/toolbar_separator_horizontal_focus.png + rc/toolbar_separator_horizontal_focus@2x.png + rc/toolbar_separator_horizontal_pressed.png + rc/toolbar_separator_horizontal_pressed@2x.png + rc/toolbar_separator_vertical.png + rc/toolbar_separator_vertical@2x.png + rc/toolbar_separator_vertical_disabled.png + rc/toolbar_separator_vertical_disabled@2x.png + rc/toolbar_separator_vertical_focus.png + rc/toolbar_separator_vertical_focus@2x.png + rc/toolbar_separator_vertical_pressed.png + rc/toolbar_separator_vertical_pressed@2x.png + rc/transparent.png + rc/transparent@2x.png + rc/transparent_disabled.png + rc/transparent_disabled@2x.png + rc/transparent_focus.png + rc/transparent_focus@2x.png + rc/transparent_pressed.png + rc/transparent_pressed@2x.png + rc/window_close.png + rc/window_close@2x.png + rc/window_close_disabled.png + rc/window_close_disabled@2x.png + rc/window_close_focus.png + rc/window_close_focus@2x.png + rc/window_close_pressed.png + rc/window_close_pressed@2x.png + rc/window_grip.png + rc/window_grip@2x.png + rc/window_grip_disabled.png + rc/window_grip_disabled@2x.png + rc/window_grip_focus.png + rc/window_grip_focus@2x.png + rc/window_grip_pressed.png + rc/window_grip_pressed@2x.png + rc/window_minimize.png + rc/window_minimize@2x.png + rc/window_minimize_disabled.png + rc/window_minimize_disabled@2x.png + rc/window_minimize_focus.png + rc/window_minimize_focus@2x.png + rc/window_minimize_pressed.png + rc/window_minimize_pressed@2x.png + rc/window_undock.png + rc/window_undock@2x.png + rc/window_undock_disabled.png + rc/window_undock_disabled@2x.png + rc/window_undock_focus.png + rc/window_undock_focus@2x.png + rc/window_undock_pressed.png + rc/window_undock_pressed@2x.png + + diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/icons/index.theme b/dist/qt_themes/qdarkstyle_midnight_blue/icons/index.theme index 20f9f6d633..34c449f19a 100644 --- a/dist/qt_themes/qdarkstyle_midnight_blue/icons/index.theme +++ b/dist/qt_themes/qdarkstyle_midnight_blue/icons/index.theme @@ -1,14 +1,4 @@ [Icon Theme] Name=qdarkstyle_midnight_blue -Comment=dark theme -Inherits=colorful -Directories=16x16,48x48,256x256 - -[16x16] -Size=16 - -[48x48] -Size=48 - -[256x256] -Size=256 +Comment=Dark theme (Midnight Blue style) +Inherits=default_dark diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/style.qrc b/dist/qt_themes/qdarkstyle_midnight_blue/style.qrc index dc3d7fecbd..0cdaefa035 100644 --- a/dist/qt_themes/qdarkstyle_midnight_blue/style.qrc +++ b/dist/qt_themes/qdarkstyle_midnight_blue/style.qrc @@ -1,228 +1,5 @@ - - icons/index.theme - ../qdarkstyle/icons/16x16/lock.png - ../qdarkstyle/icons/16x16/view-refresh.png - ../qdarkstyle/icons/48x48/bad_folder.png - ../qdarkstyle/icons/48x48/chip.png - ../qdarkstyle/icons/48x48/folder.png - ../qdarkstyle/icons/48x48/no_avatar.png - ../qdarkstyle/icons/48x48/list-add.png - ../qdarkstyle/icons/48x48/sd_card.png - ../qdarkstyle/icons/48x48/star.png - ../qdarkstyle/icons/256x256/plus_folder.png - - - rc/arrow_down.png - rc/arrow_down@2x.png - rc/arrow_down_disabled.png - rc/arrow_down_disabled@2x.png - rc/arrow_down_focus.png - rc/arrow_down_focus@2x.png - rc/arrow_down_pressed.png - rc/arrow_down_pressed@2x.png - rc/arrow_left.png - rc/arrow_left@2x.png - rc/arrow_left_disabled.png - rc/arrow_left_disabled@2x.png - rc/arrow_left_focus.png - rc/arrow_left_focus@2x.png - rc/arrow_left_pressed.png - rc/arrow_left_pressed@2x.png - rc/arrow_right.png - rc/arrow_right@2x.png - rc/arrow_right_disabled.png - rc/arrow_right_disabled@2x.png - rc/arrow_right_focus.png - rc/arrow_right_focus@2x.png - rc/arrow_right_pressed.png - rc/arrow_right_pressed@2x.png - rc/arrow_up.png - rc/arrow_up@2x.png - rc/arrow_up_disabled.png - rc/arrow_up_disabled@2x.png - rc/arrow_up_focus.png - rc/arrow_up_focus@2x.png - rc/arrow_up_pressed.png - rc/arrow_up_pressed@2x.png - rc/base_icon.png - rc/base_icon@2x.png - rc/base_icon_disabled.png - rc/base_icon_disabled@2x.png - rc/base_icon_focus.png - rc/base_icon_focus@2x.png - rc/base_icon_pressed.png - rc/base_icon_pressed@2x.png - rc/branch_closed.png - rc/branch_closed@2x.png - rc/branch_closed_disabled.png - rc/branch_closed_disabled@2x.png - rc/branch_closed_focus.png - rc/branch_closed_focus@2x.png - rc/branch_closed_pressed.png - rc/branch_closed_pressed@2x.png - rc/branch_end.png - rc/branch_end@2x.png - rc/branch_end_disabled.png - rc/branch_end_disabled@2x.png - rc/branch_end_focus.png - rc/branch_end_focus@2x.png - rc/branch_end_pressed.png - rc/branch_end_pressed@2x.png - rc/branch_line.png - rc/branch_line@2x.png - rc/branch_line_disabled.png - rc/branch_line_disabled@2x.png - rc/branch_line_focus.png - rc/branch_line_focus@2x.png - rc/branch_line_pressed.png - rc/branch_line_pressed@2x.png - rc/branch_more.png - rc/branch_more@2x.png - rc/branch_more_disabled.png - rc/branch_more_disabled@2x.png - rc/branch_more_focus.png - rc/branch_more_focus@2x.png - rc/branch_more_pressed.png - rc/branch_more_pressed@2x.png - rc/branch_open.png - rc/branch_open@2x.png - rc/branch_open_disabled.png - rc/branch_open_disabled@2x.png - rc/branch_open_focus.png - rc/branch_open_focus@2x.png - rc/branch_open_pressed.png - rc/branch_open_pressed@2x.png - rc/checkbox_checked.png - rc/checkbox_checked@2x.png - rc/checkbox_checked_disabled.png - rc/checkbox_checked_disabled@2x.png - rc/checkbox_checked_focus.png - rc/checkbox_checked_focus@2x.png - rc/checkbox_checked_pressed.png - rc/checkbox_checked_pressed@2x.png - rc/checkbox_indeterminate.png - rc/checkbox_indeterminate@2x.png - rc/checkbox_indeterminate_disabled.png - rc/checkbox_indeterminate_disabled@2x.png - rc/checkbox_indeterminate_focus.png - rc/checkbox_indeterminate_focus@2x.png - rc/checkbox_indeterminate_pressed.png - rc/checkbox_indeterminate_pressed@2x.png - rc/checkbox_unchecked.png - rc/checkbox_unchecked@2x.png - rc/checkbox_unchecked_disabled.png - rc/checkbox_unchecked_disabled@2x.png - rc/checkbox_unchecked_focus.png - rc/checkbox_unchecked_focus@2x.png - rc/checkbox_unchecked_pressed.png - rc/checkbox_unchecked_pressed@2x.png - rc/line_horizontal.png - rc/line_horizontal@2x.png - rc/line_horizontal_disabled.png - rc/line_horizontal_disabled@2x.png - rc/line_horizontal_focus.png - rc/line_horizontal_focus@2x.png - rc/line_horizontal_pressed.png - rc/line_horizontal_pressed@2x.png - rc/line_vertical.png - rc/line_vertical@2x.png - rc/line_vertical_disabled.png - rc/line_vertical_disabled@2x.png - rc/line_vertical_focus.png - rc/line_vertical_focus@2x.png - rc/line_vertical_pressed.png - rc/line_vertical_pressed@2x.png - rc/radio_checked.png - rc/radio_checked@2x.png - rc/radio_checked_disabled.png - rc/radio_checked_disabled@2x.png - rc/radio_checked_focus.png - rc/radio_checked_focus@2x.png - rc/radio_checked_pressed.png - rc/radio_checked_pressed@2x.png - rc/radio_unchecked.png - rc/radio_unchecked@2x.png - rc/radio_unchecked_disabled.png - rc/radio_unchecked_disabled@2x.png - rc/radio_unchecked_focus.png - rc/radio_unchecked_focus@2x.png - rc/radio_unchecked_pressed.png - rc/radio_unchecked_pressed@2x.png - rc/toolbar_move_horizontal.png - rc/toolbar_move_horizontal@2x.png - rc/toolbar_move_horizontal_disabled.png - rc/toolbar_move_horizontal_disabled@2x.png - rc/toolbar_move_horizontal_focus.png - rc/toolbar_move_horizontal_focus@2x.png - rc/toolbar_move_horizontal_pressed.png - rc/toolbar_move_horizontal_pressed@2x.png - rc/toolbar_move_vertical.png - rc/toolbar_move_vertical@2x.png - rc/toolbar_move_vertical_disabled.png - rc/toolbar_move_vertical_disabled@2x.png - rc/toolbar_move_vertical_focus.png - rc/toolbar_move_vertical_focus@2x.png - rc/toolbar_move_vertical_pressed.png - rc/toolbar_move_vertical_pressed@2x.png - rc/toolbar_separator_horizontal.png - rc/toolbar_separator_horizontal@2x.png - rc/toolbar_separator_horizontal_disabled.png - rc/toolbar_separator_horizontal_disabled@2x.png - rc/toolbar_separator_horizontal_focus.png - rc/toolbar_separator_horizontal_focus@2x.png - rc/toolbar_separator_horizontal_pressed.png - rc/toolbar_separator_horizontal_pressed@2x.png - rc/toolbar_separator_vertical.png - rc/toolbar_separator_vertical@2x.png - rc/toolbar_separator_vertical_disabled.png - rc/toolbar_separator_vertical_disabled@2x.png - rc/toolbar_separator_vertical_focus.png - rc/toolbar_separator_vertical_focus@2x.png - rc/toolbar_separator_vertical_pressed.png - rc/toolbar_separator_vertical_pressed@2x.png - rc/transparent.png - rc/transparent@2x.png - rc/transparent_disabled.png - rc/transparent_disabled@2x.png - rc/transparent_focus.png - rc/transparent_focus@2x.png - rc/transparent_pressed.png - rc/transparent_pressed@2x.png - rc/window_close.png - rc/window_close@2x.png - rc/window_close_disabled.png - rc/window_close_disabled@2x.png - rc/window_close_focus.png - rc/window_close_focus@2x.png - rc/window_close_pressed.png - rc/window_close_pressed@2x.png - rc/window_grip.png - rc/window_grip@2x.png - rc/window_grip_disabled.png - rc/window_grip_disabled@2x.png - rc/window_grip_focus.png - rc/window_grip_focus@2x.png - rc/window_grip_pressed.png - rc/window_grip_pressed@2x.png - rc/window_minimize.png - rc/window_minimize@2x.png - rc/window_minimize_disabled.png - rc/window_minimize_disabled@2x.png - rc/window_minimize_focus.png - rc/window_minimize_focus@2x.png - rc/window_minimize_pressed.png - rc/window_minimize_pressed@2x.png - rc/window_undock.png - rc/window_undock@2x.png - rc/window_undock_disabled.png - rc/window_undock_disabled@2x.png - rc/window_undock_focus.png - rc/window_undock_focus@2x.png - rc/window_undock_pressed.png - rc/window_undock_pressed@2x.png - - - style.qss - + + dark.qss + diff --git a/dist/qt_themes/qdarkstyle_midnight_blue_monochrome/icons.qrc b/dist/qt_themes/qdarkstyle_midnight_blue_monochrome/icons.qrc new file mode 100644 index 0000000000..60b95db02a --- /dev/null +++ b/dist/qt_themes/qdarkstyle_midnight_blue_monochrome/icons.qrc @@ -0,0 +1,33 @@ + + + + + + + icons/index.theme + ../monochrome_dark/icons/16x16/lock.png + ../monochrome_dark/icons/48x48/bad_folder.png + ../monochrome_dark/icons/48x48/chip.png + ../monochrome_dark/icons/48x48/folder.png + ../monochrome_dark/icons/48x48/list-add.png + ../monochrome_dark/icons/48x48/sd_card.png + ../monochrome_dark/icons/48x48/star.png + ../monochrome_dark/icons/256x256/plus_folder.png + + + + icons/index.theme + ../monochrome_dark/icons/16x16/lock.png + ../monochrome_dark/icons/48x48/bad_folder.png + ../monochrome_dark/icons/48x48/chip.png + ../monochrome_dark/icons/48x48/folder.png + ../monochrome_dark/icons/48x48/list-add.png + ../monochrome_dark/icons/48x48/no_avatar.png + ../monochrome_dark/icons/48x48/sd_card.png + ../monochrome_dark/icons/48x48/star.png + ../monochrome_dark/icons/256x256/plus_folder.png + + diff --git a/dist/qt_themes/qdarkstyle_midnight_blue_monochrome/icons/index.theme b/dist/qt_themes/qdarkstyle_midnight_blue_monochrome/icons/index.theme new file mode 100644 index 0000000000..d6ed7d55ec --- /dev/null +++ b/dist/qt_themes/qdarkstyle_midnight_blue_monochrome/icons/index.theme @@ -0,0 +1,14 @@ +[Icon Theme] +Name=qdarkstyle_midnight_blue_monochrome +Comment=Monochrome dark theme (Midnight Blue style) +Inherits=qdarkstyle_midnight_blue +Directories=16x16,48x48,256x256 + +[16x16] +Size=16 + +[48x48] +Size=48 + +[256x256] +Size=256 diff --git a/dist/qt_themes/qdarkstyle_midnight_blue_monochrome/style.qrc b/dist/qt_themes/qdarkstyle_midnight_blue_monochrome/style.qrc new file mode 100644 index 0000000000..eeb5f34cbb --- /dev/null +++ b/dist/qt_themes/qdarkstyle_midnight_blue_monochrome/style.qrc @@ -0,0 +1,8 @@ + + + ../qdarkstyle_midnight_blue/dark.qss + + + ../qdarkstyle/dark.qss + + diff --git a/dist/qt_themes/qdarkstyle_monochrome/icons.qrc b/dist/qt_themes/qdarkstyle_monochrome/icons.qrc new file mode 100644 index 0000000000..355fe22beb --- /dev/null +++ b/dist/qt_themes/qdarkstyle_monochrome/icons.qrc @@ -0,0 +1,33 @@ + + + + + + + icons/index.theme + ../monochrome_dark/icons/16x16/lock.png + ../monochrome_dark/icons/48x48/bad_folder.png + ../monochrome_dark/icons/48x48/chip.png + ../monochrome_dark/icons/48x48/folder.png + ../monochrome_dark/icons/48x48/list-add.png + ../monochrome_dark/icons/48x48/sd_card.png + ../monochrome_dark/icons/48x48/star.png + ../monochrome_dark/icons/256x256/plus_folder.png + + + + icons/index.theme + ../monochrome_dark/icons/16x16/lock.png + ../monochrome_dark/icons/48x48/bad_folder.png + ../monochrome_dark/icons/48x48/chip.png + ../monochrome_dark/icons/48x48/folder.png + ../monochrome_dark/icons/48x48/list-add.png + ../monochrome_dark/icons/48x48/no_avatar.png + ../monochrome_dark/icons/48x48/sd_card.png + ../monochrome_dark/icons/48x48/star.png + ../monochrome_dark/icons/256x256/plus_folder.png + + diff --git a/dist/qt_themes/qdarkstyle_monochrome/icons/index.theme b/dist/qt_themes/qdarkstyle_monochrome/icons/index.theme new file mode 100644 index 0000000000..a8fd60ba29 --- /dev/null +++ b/dist/qt_themes/qdarkstyle_monochrome/icons/index.theme @@ -0,0 +1,14 @@ +[Icon Theme] +Name=qdarkstyle_monochrome +Comment=Monochrome dark theme (Mine Shaft style) +Inherits=qdarkstyle +Directories=16x16,48x48,256x256 + +[16x16] +Size=16 + +[48x48] +Size=48 + +[256x256] +Size=256 diff --git a/dist/qt_themes/qdarkstyle_monochrome/style.qrc b/dist/qt_themes/qdarkstyle_monochrome/style.qrc new file mode 100644 index 0000000000..76f7767ca8 --- /dev/null +++ b/dist/qt_themes/qdarkstyle_monochrome/style.qrc @@ -0,0 +1,8 @@ + + + ../qdarkstyle/dark.qss + + + ../qdarkstyle/dark.qss + + diff --git a/src/suyu/applets/qt_software_keyboard.cpp b/src/suyu/applets/qt_software_keyboard.cpp index ca7169e2a2..3a88656a17 100644 --- a/src/suyu/applets/qt_software_keyboard.cpp +++ b/src/suyu/applets/qt_software_keyboard.cpp @@ -372,6 +372,14 @@ QtSoftwareKeyboardDialog::~QtSoftwareKeyboardDialog() { StopInputThread(); } +QString QtSoftwareKeyboardDialog::theme() { + if (GMainWindow::CheckDarkMode()) { + return QStringLiteral("_dark"); + } else { + return QString{}; + } +} + void QtSoftwareKeyboardDialog::ShowNormalKeyboard(QPoint pos, QSize size) { if (isVisible()) { return; @@ -382,6 +390,7 @@ void QtSoftwareKeyboardDialog::ShowNormalKeyboard(QPoint pos, QSize size) { SetKeyboardType(); SetPasswordMode(); SetControllerImage(); + SetButtonImages(); DisableKeyboardButtons(); SetBackspaceOkEnabled(); @@ -449,6 +458,7 @@ void QtSoftwareKeyboardDialog::ShowInlineKeyboard( SetKeyboardType(); SetControllerImage(); + SetButtonImages(); DisableKeyboardButtons(); SetBackspaceOkEnabled(); @@ -822,70 +832,146 @@ void QtSoftwareKeyboardDialog::SetControllerImage() { const auto controller_type = handheld->IsConnected() ? handheld->GetNpadStyleIndex() : player_1->GetNpadStyleIndex(); - const QString theme = [] { - // Use dark icons if current OS mode is dark, or the theme contains "dark", or "midnight" in - // its name - if (GMainWindow::CheckDarkMode() || QIcon::themeName().contains(QStringLiteral("dark")) || - QIcon::themeName().contains(QStringLiteral("midnight"))) { - return QStringLiteral("_dark"); - } else { - return QString{}; - } - }(); - switch (controller_type) { case Core::HID::NpadStyleIndex::Fullkey: case Core::HID::NpadStyleIndex::GameCube: ui->icon_controller->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_pro%1.png);").arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_pro.png);").arg(theme())); ui->icon_controller_shift->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_pro%1.png);").arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_pro.png);").arg(theme())); ui->icon_controller_num->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_pro%1.png);").arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_pro.png);").arg(theme())); break; case Core::HID::NpadStyleIndex::JoyconDual: ui->icon_controller->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_dual_joycon%1.png);").arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_dual_joycon.png);").arg(theme())); ui->icon_controller_shift->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_dual_joycon%1.png);").arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_dual_joycon.png);").arg(theme())); ui->icon_controller_num->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_dual_joycon%1.png);").arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_dual_joycon.png);").arg(theme())); break; case Core::HID::NpadStyleIndex::JoyconLeft: ui->icon_controller->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_single_joycon_left%1.png);") - .arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_single_joycon_left.png);") + .arg(theme())); ui->icon_controller_shift->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_single_joycon_left%1.png);") - .arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_single_joycon_left.png);") + .arg(theme())); ui->icon_controller_num->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_single_joycon_left%1.png);") - .arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_single_joycon_left.png);") + .arg(theme())); break; case Core::HID::NpadStyleIndex::JoyconRight: ui->icon_controller->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_single_joycon_right%1.png);") - .arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_single_joycon_right.png);") + .arg(theme())); ui->icon_controller_shift->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_single_joycon_right%1.png);") - .arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_single_joycon_right.png);") + .arg(theme())); ui->icon_controller_num->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_single_joycon_right%1.png);") - .arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_single_joycon_right.png);") + .arg(theme())); break; case Core::HID::NpadStyleIndex::Handheld: ui->icon_controller->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_handheld%1.png);").arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_handheld.png);").arg(theme())); ui->icon_controller_shift->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_handheld%1.png);").arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_handheld.png);").arg(theme())); ui->icon_controller_num->setStyleSheet( - QStringLiteral("image: url(:/overlay/controller_handheld%1.png);").arg(theme)); + QStringLiteral("image: url(:/overlay%1/controller_handheld.png);").arg(theme())); break; default: break; } } +void QtSoftwareKeyboardDialog::SetButtonImages() { + QString button_backspace_stylesheet = + QStringLiteral("QPushButton {" + " image: url(:/overlay%1/osk_button_B.png);" + " image-position: right;" + " qproperty-icon: url(:/overlay%1/osk_button_backspace.png); }" + "QPushButton:disabled { image: url(:/overlay%1/osk_button_B_disabled.png);}") + .arg(theme()); + ui->button_backspace->setStyleSheet(button_backspace_stylesheet); + ui->button_backspace_shift->setStyleSheet(button_backspace_stylesheet); + ui->button_backspace_shift->setIconSize(ui->button_backspace->iconSize()); + ui->button_backspace_num->setStyleSheet(button_backspace_stylesheet); + + QString button_space_stylesheet = + QStringLiteral("QPushButton {" + " image: url(:/overlay%1/osk_button_Y.png);" + " image-position: right;" + " qproperty-icon: url(:/overlay%1/osk_button_space.png); }" + "QPushButton:disabled { image: url(:/overlay%1/osk_button_Y_disabled.png);}") + .arg(theme()); + ui->button_space->setStyleSheet(button_space_stylesheet); + ui->button_space_shift->setStyleSheet(button_space_stylesheet); + + QString button_ok_stylesheet = + QStringLiteral( + "QPushButton { image: url(:/overlay%1/osk_button_plus.png); }" + "QPushButton:disabled { image: url(:/overlay%1/osk_button_plus_disabled.png); }") + .arg(theme()); + ui->button_ok->setStyleSheet(button_ok_stylesheet); + ui->button_ok_shift->setStyleSheet(button_ok_stylesheet); + ui->button_ok_num->setStyleSheet(button_ok_stylesheet); + + QString button_shift_stylesheet = + QStringLiteral("image: url(:/overlay/osk_button_shift_lock_off.png);" + "image-position: left;" + "qproperty-icon: url(:/overlay%1/osk_button_shift.png);") + .arg(theme()); + ui->button_shift->setStyleSheet(button_shift_stylesheet); + + QString button_shift_shift_stylesheet = + QStringLiteral("image: url(:/overlay/osk_button_shift_lock_off.png);" + "image-position: left;" + "qproperty-icon: url(:/overlay%1/osk_button_shift_on.png);") + .arg(theme()); + ui->button_shift_shift->setStyleSheet(button_shift_shift_stylesheet); + ui->button_shift_shift->setIconSize(ui->button_shift->iconSize()); + + QString L_stylesheet = QStringLiteral("image: url(:/overlay%1/button_L.png);").arg(theme()); + ui->button_L->setStyleSheet(L_stylesheet); + ui->button_L_shift->setStyleSheet(L_stylesheet); + ui->button_L_num->setStyleSheet(L_stylesheet); + + QString R_stylesheet = QStringLiteral("image: url(:/overlay%1/button_R.png);").arg(theme()); + ui->button_R->setStyleSheet(R_stylesheet); + ui->button_R_shift->setStyleSheet(R_stylesheet); + ui->button_R_num->setStyleSheet(R_stylesheet); + + QString arrow_left_stylesheet = + QStringLiteral("image: url(:/overlay%1/arrow_left.png);").arg(theme()); + ui->arrow_left->setStyleSheet(arrow_left_stylesheet); + ui->arrow_left_shift->setStyleSheet(arrow_left_stylesheet); + ui->arrow_left_num->setStyleSheet(arrow_left_stylesheet); + + QString arrow_right_stylesheet = + QStringLiteral("image: url(:/overlay%1/arrow_right.png);").arg(theme()); + ui->arrow_right->setStyleSheet(arrow_right_stylesheet); + ui->arrow_right_shift->setStyleSheet(arrow_right_stylesheet); + ui->arrow_right_num->setStyleSheet(arrow_right_stylesheet); + + QString button_press_stick_stylesheet = + QStringLiteral("image: url(:/overlay%1/button_press_stick.png);").arg(theme()); + ui->button_press_stick->setStyleSheet(button_press_stick_stylesheet); + ui->button_press_stick_shift->setStyleSheet(button_press_stick_stylesheet); + + QString button_X_stylesheet = + QStringLiteral("image: url(:/overlay%1/button_X.png);").arg(theme()); + ui->button_X->setStyleSheet(button_X_stylesheet); + ui->button_X_shift->setStyleSheet(button_X_stylesheet); + ui->button_X_num->setStyleSheet(button_X_stylesheet); + + QString button_A_stylesheet = + QStringLiteral("image: url(:/overlay%1/button_A.png);").arg(theme()); + ui->button_A->setStyleSheet(button_A_stylesheet); + ui->button_A_shift->setStyleSheet(button_A_stylesheet); + ui->button_A_num->setStyleSheet(button_A_stylesheet); +} + void QtSoftwareKeyboardDialog::DisableKeyboardButtons() { switch (bottom_osk_index) { case BottomOSKIndex::LowerCase: @@ -1052,10 +1138,8 @@ void QtSoftwareKeyboardDialog::ChangeBottomOSKIndex() { ui->bottomOSK->setCurrentIndex(static_cast(bottom_osk_index)); ui->button_shift_shift->setStyleSheet( - QStringLiteral("image: url(:/overlay/osk_button_shift_lock_off.png);" - "\nimage-position: left;")); + QStringLiteral("image: url(:/overlay/osk_button_shift_lock_off.png);")); - ui->button_shift_shift->setIconSize(ui->button_shift->iconSize()); ui->button_backspace_shift->setIconSize(ui->button_backspace->iconSize()); break; case BottomOSKIndex::UpperCase: @@ -1066,9 +1150,6 @@ void QtSoftwareKeyboardDialog::ChangeBottomOSKIndex() { QStringLiteral("image: url(:/overlay/osk_button_shift_lock_off.png);" "\nimage-position: left;")); - ui->button_shift_shift->setIconSize(ui->button_shift->iconSize()); - ui->button_backspace_shift->setIconSize(ui->button_backspace->iconSize()); - ui->label_shift_shift->setText(QStringLiteral("Caps Lock")); bottom_osk_index = BottomOSKIndex::LowerCase; @@ -1080,9 +1161,6 @@ void QtSoftwareKeyboardDialog::ChangeBottomOSKIndex() { QStringLiteral("image: url(:/overlay/osk_button_shift_lock_on.png);" "\nimage-position: left;")); - ui->button_shift_shift->setIconSize(ui->button_shift->iconSize()); - ui->button_backspace_shift->setIconSize(ui->button_backspace->iconSize()); - ui->label_shift_shift->setText(QStringLiteral("Caps Lock Off")); } break; diff --git a/src/suyu/applets/qt_software_keyboard.h b/src/suyu/applets/qt_software_keyboard.h index 7e2fdf09ea..fda6ac623d 100644 --- a/src/suyu/applets/qt_software_keyboard.h +++ b/src/suyu/applets/qt_software_keyboard.h @@ -80,6 +80,12 @@ private: NumberPad, }; + /** + * Get the current theme suffix + * @return an empty string for light theme, "_dark" for dark theme + */ + QString theme(); + /** * Moves and resizes the window to a specified position and size. * @@ -109,6 +115,9 @@ private: /// Sets the controller image at the bottom left of the software keyboard. void SetControllerImage(); + /// Sets the controller image at the bottom left of the software keyboard. + void SetButtonImages(); + /// Disables buttons based on initialize_parameters. void DisableKeyboardButtons(); diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index e6d14717cf..b687e2500d 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -9,7 +9,6 @@ #include #include #include -#include #include #include "core/hle/service/am/applet_manager.h" @@ -297,12 +296,11 @@ GMainWindow::GMainWindow(std::unique_ptr config_, bool has_broken_vulk statusBar()->hide(); startup_icon_theme = QIcon::themeName(); - // fallback can only be set once, colorful theme icons are okay on both light/dark - QIcon::setFallbackThemeName(QStringLiteral("colorful")); + // fallback can only be set once, default theme icons are okay on both light/dark + QIcon::setFallbackThemeName(QStringLiteral("default")); QIcon::setFallbackSearchPaths(QStringList(QStringLiteral(":/icons"))); default_theme_paths = QIcon::themeSearchPaths(); - UpdateUITheme(); SetDiscordEnabled(UISettings::values.enable_discord_presence.GetValue()); discord_rpc->Update(); @@ -3612,8 +3610,6 @@ void GMainWindow::OnConfigure() { multiplayer_state->UpdateCredentials(); } - emit UpdateThemedIcons(); - const auto reload = UISettings::values.is_game_list_reload_pending.exchange(false); if (reload || Settings::values.language_index.GetValue() != old_language_index) { game_list->PopulateAsync(UISettings::values.game_dirs); @@ -5030,9 +5026,9 @@ bool GMainWindow::CheckDarkMode() { // Using the freedesktop specifications for checking dark mode LOG_INFO(Frontend, "Retrieving theme from freedesktop color-scheme..."); gdbus_arguments << QStringLiteral("--dest=org.freedesktop.portal.Desktop") - << QStringLiteral("--object-path /org/freedesktop/portal/desktop") - << QStringLiteral("--method org.freedesktop.portal.Settings.Read " - "org.freedesktop.appearance color-scheme"); + << QStringLiteral("--object-path /org/freedesktop/portal/desktop") + << QStringLiteral("--method org.freedesktop.portal.Settings.Read") + << QStringLiteral("org.freedesktop.appearance color-scheme"); process.start(QStringLiteral("gdbus call --session"), gdbus_arguments); process.waitForFinished(1000); QByteArray dbus_output = process.readAllStandardOutput(); @@ -5096,7 +5092,8 @@ void GMainWindow::changeEvent(QEvent* event) { UpdateUITheme(); } - } else QWidget::changeEvent(event); + } + QWidget::changeEvent(event); } void GMainWindow::LoadTranslation() { diff --git a/src/suyu/main.h b/src/suyu/main.h index d0f1bd96e6..f9a5057d83 100644 --- a/src/suyu/main.h +++ b/src/suyu/main.h @@ -167,7 +167,6 @@ class GMainWindow : public QMainWindow { public: void filterBarSetChecked(bool state); static bool CheckDarkMode(); - void UpdateUITheme(); explicit GMainWindow(std::unique_ptr config_, bool has_broken_vulkan); ~GMainWindow() override; diff --git a/src/suyu/uisettings.cpp b/src/suyu/uisettings.cpp index 8d65905104..7cf32ddd0e 100644 --- a/src/suyu/uisettings.cpp +++ b/src/suyu/uisettings.cpp @@ -23,12 +23,12 @@ namespace FS = Common::FS; namespace UISettings { const Themes included_themes{{ - {"Default", ":/default/"}, - {"Default Colorful", ":/colorful/"}, - {"Dark", ":/qdarkstyle/"}, - {"Dark Colorful", ":/colorful_dark/"}, - {"Midnight Blue", ":/qdarkstyle_midnight_blue/"}, - {"Midnight Blue Colorful", ":/colorful_midnight_blue/"}, + {"Default", ":/default"}, + {"Default monochrome", ":/monochrome"}, + {"Mine Shaft", ":/qdarkstyle"}, + {"Mine Shaft monochrome", ":/qdarkstyle_monochrome"}, + {"Midnight Blue", ":/qdarkstyle_midnight_blue"}, + {"Midnight Blue monochrome", ":/qdarkstyle_midnight_blue_monochrome"}, }}; Values values = {}; diff --git a/src/suyu/uisettings.h b/src/suyu/uisettings.h index 6bb903efa7..75571acde8 100644 --- a/src/suyu/uisettings.h +++ b/src/suyu/uisettings.h @@ -48,7 +48,7 @@ struct Shortcut { ContextualShortcut shortcut; }; -static constexpr std::string_view default_theme{"colorful"}; +static constexpr std::string_view default_theme{":/default"}; using Themes = std::array, 6>; extern const Themes included_themes; From c00c425b488a09324ce5373345a597ad9abde66e Mon Sep 17 00:00:00 2001 From: flodavid Date: Mon, 12 Feb 2024 04:01:25 +0100 Subject: [PATCH 106/165] Add dark mode configuration setting in UI tab - Allows to choose "Auto", "Always On" or "Always Off" - Dark mode options are only shown if the style does not support theme - If Auto is chosen, value is retrieved from OS - On Windows, the application needs a restart to apply the settings - Use the default dark palette for Windows, like on Linux --- src/common/settings.cpp | 1 + src/common/settings.h | 1 + src/common/settings_enums.h | 2 + src/suyu/configuration/configure_ui.cpp | 67 +++++++++ src/suyu/configuration/configure_ui.h | 1 + src/suyu/configuration/configure_ui.ui | 14 ++ src/suyu/configuration/qt_config.cpp | 10 +- src/suyu/main.cpp | 192 +++++++++++++++--------- src/suyu/startup_checks.cpp | 4 - src/suyu/uisettings.h | 3 + 10 files changed, 221 insertions(+), 74 deletions(-) diff --git a/src/common/settings.cpp b/src/common/settings.cpp index 948c557674..3339d5b4f0 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -67,6 +67,7 @@ SWITCHABLE(u8, true); // Used in UISettings // TODO see if we can move this to uisettings.cpp SWITCHABLE(ConfirmStop, true); +SWITCHABLE(DarkModeState, true); #undef SETTING #undef SWITCHABLE diff --git a/src/common/settings.h b/src/common/settings.h index 829759c94b..77788befe7 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -90,6 +90,7 @@ SWITCHABLE(u8, true); // Used in UISettings // TODO see if we can move this to uisettings.h SWITCHABLE(ConfirmStop, true); +SWITCHABLE(DarkModeState, true); #undef SETTING #undef SWITCHABLE diff --git a/src/common/settings_enums.h b/src/common/settings_enums.h index fabae6d687..777f5b1b0a 100644 --- a/src/common/settings_enums.h +++ b/src/common/settings_enums.h @@ -155,6 +155,8 @@ ENUM(ConsoleMode, Handheld, Docked); ENUM(AppletMode, HLE, LLE); +ENUM(DarkModeState, Off, On, Auto); + template inline std::string CanonicalizeEnum(Type id) { const auto group = EnumMetadata::Canonicalizations(); diff --git a/src/suyu/configuration/configure_ui.cpp b/src/suyu/configuration/configure_ui.cpp index 046b34721e..589c035589 100644 --- a/src/suyu/configuration/configure_ui.cpp +++ b/src/suyu/configuration/configure_ui.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include "common/common_types.h" #include "common/fs/path_util.h" @@ -29,6 +30,8 @@ #include "suyu/uisettings.h" #include "ui_configure_ui.h" +using Settings::DarkModeState; + namespace { constexpr std::array default_game_icon_sizes{ std::make_pair(0, QT_TRANSLATE_NOOP("ConfigureUI", "None")), @@ -153,6 +156,9 @@ ConfigureUi::ConfigureUi(Core::System& system_, QWidget* parent) &ConfigureUi::RequestGameListUpdate); connect(ui->row_2_text_combobox, QOverload::of(&QComboBox::currentIndexChanged), this, &ConfigureUi::RequestGameListUpdate); + // Update available dark mode options depending on selected style + connect(ui->theme_combobox, QOverload::of(&QComboBox::currentIndexChanged), this, + &ConfigureUi::UpdateDarkModeOptions); // Update text ComboBoxes after user interaction. connect(ui->row_1_text_combobox, QOverload::of(&QComboBox::activated), @@ -185,6 +191,8 @@ ConfigureUi::~ConfigureUi() = default; void ConfigureUi::ApplyConfiguration() { UISettings::values.theme = ui->theme_combobox->itemData(ui->theme_combobox->currentIndex()).toString(); + UISettings::values.dark_mode_state = + static_cast(ui->dark_mode_combobox->currentData().toUInt()); UISettings::values.show_add_ons = ui->show_add_ons->isChecked(); UISettings::values.show_compat = ui->show_compat->isChecked(); UISettings::values.show_size = ui->show_size->isChecked(); @@ -206,12 +214,71 @@ void ConfigureUi::ApplyConfiguration() { system.ApplySettings(); } +void ConfigureUi::UpdateDarkModeOptions() { + ui->dark_mode_combobox->clear(); + + QString selected_theme = ui->theme_combobox->currentData().toString(); + + /* Dark mode option are added according to the modes the current style supports */ + bool has_common_style = QFile::exists(selected_theme + QStringLiteral("/style.qss")); + bool has_light_style = QFile::exists(selected_theme + QStringLiteral("/light.qss")); + bool has_dark_style = QFile::exists(selected_theme + QStringLiteral("/dark.qss")); +#ifdef _WIN32 + // Indicate which option needs a restart to be applied, depending on current environment + // variable + QByteArray current_qt_qpa = qgetenv("QT_QPA_PLATFORM"); + if (current_qt_qpa.contains("darkmode=2")) { + if (has_common_style || (has_dark_style && has_light_style)) { + ui->dark_mode_combobox->addItem(tr("Auto"), QVariant::fromValue(DarkModeState::Auto)); + } + if (has_common_style || has_dark_style) { + ui->dark_mode_combobox->addItem(tr("Always On") + + QStringLiteral(" (%1)").arg(tr("Needs restart")), + QVariant::fromValue(DarkModeState::On)); + } + if (has_common_style || has_light_style) { + ui->dark_mode_combobox->addItem(tr("Always Off") + + QStringLiteral(" (%1)").arg(tr("Needs restart")), + QVariant::fromValue(DarkModeState::Off)); + } + } else { + if (has_common_style || (has_dark_style && has_light_style)) { + ui->dark_mode_combobox->addItem(tr("Auto") + + QStringLiteral(" (%1)").arg(tr("Needs restart")), + QVariant::fromValue(DarkModeState::Auto)); + } + if (has_common_style || has_dark_style) { + ui->dark_mode_combobox->addItem(tr("Always On"), + QVariant::fromValue(DarkModeState::On)); + } + if (has_common_style || has_light_style) { + ui->dark_mode_combobox->addItem(tr("Always Off"), + QVariant::fromValue(DarkModeState::Off)); + } + } +#else + if (has_common_style || (has_dark_style && has_light_style)) { + ui->dark_mode_combobox->addItem(tr("Auto"), QVariant::fromValue(DarkModeState::Auto)); + } + if (has_common_style || has_dark_style) { + ui->dark_mode_combobox->addItem(tr("Always On"), QVariant::fromValue(DarkModeState::On)); + } + if (has_common_style || has_light_style) { + ui->dark_mode_combobox->addItem(tr("Always Off"), QVariant::fromValue(DarkModeState::Off)); + } +#endif +} + void ConfigureUi::RequestGameListUpdate() { UISettings::values.is_game_list_reload_pending.exchange(true); } void ConfigureUi::SetConfiguration() { ui->theme_combobox->setCurrentIndex(ui->theme_combobox->findData(UISettings::values.theme)); + // Dark mode options are populated after the theme is selected, to get the current configuration + UpdateDarkModeOptions(); + ui->dark_mode_combobox->setCurrentIndex( + ui->dark_mode_combobox->findData(QVariant::fromValue(UISettings::values.dark_mode_state))); ui->language_combobox->setCurrentIndex(ui->language_combobox->findData( QString::fromStdString(UISettings::values.language.GetValue()))); ui->show_add_ons->setChecked(UISettings::values.show_add_ons.GetValue()); diff --git a/src/suyu/configuration/configure_ui.h b/src/suyu/configuration/configure_ui.h index 2a2563a131..a52ad7cc74 100644 --- a/src/suyu/configuration/configure_ui.h +++ b/src/suyu/configuration/configure_ui.h @@ -34,6 +34,7 @@ signals: void LanguageChanged(const QString& locale); private: + void UpdateDarkModeOptions(); void RequestGameListUpdate(); void SetConfiguration(); diff --git a/src/suyu/configuration/configure_ui.ui b/src/suyu/configuration/configure_ui.ui index b8e6483814..cdd46005fd 100644 --- a/src/suyu/configuration/configure_ui.ui +++ b/src/suyu/configuration/configure_ui.ui @@ -63,6 +63,20 @@ + + + + + + Dark Mode: + + + + + + + + diff --git a/src/suyu/configuration/qt_config.cpp b/src/suyu/configuration/qt_config.cpp index 2868db4ebb..2ed14ee2be 100644 --- a/src/suyu/configuration/qt_config.cpp +++ b/src/suyu/configuration/qt_config.cpp @@ -260,8 +260,10 @@ void QtConfig::ReadShortcutValues() { void QtConfig::ReadUIValues() { BeginGroup(Settings::TranslateCategory(Settings::Category::Ui)); - UISettings::values.theme = QString::fromStdString( - ReadStringSetting(std::string("theme"), std::string(UISettings::default_theme))); + UISettings::values.theme = + QString::fromStdString(ReadStringSetting("theme", std::string(UISettings::default_theme))); + UISettings::values.dark_mode_state = static_cast( + ReadIntegerSetting("dark_mode_state", static_cast(DarkModeState::Auto))); ReadUIGamelistValues(); ReadUILayoutValues(); @@ -467,8 +469,10 @@ void QtConfig::SaveUIValues() { WriteCategory(Settings::Category::Ui); WriteCategory(Settings::Category::UiGeneral); - WriteStringSetting(std::string("theme"), UISettings::values.theme.toStdString(), + WriteStringSetting("theme", UISettings::values.theme.toStdString(), std::make_optional(std::string(UISettings::default_theme))); + WriteIntegerSetting("dark_mode_state", static_cast(UISettings::values.dark_mode_state), + std::make_optional(static_cast(DarkModeState::Auto))); SaveUIGamelistValues(); SaveUILayoutValues(); diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index b687e2500d..13089859f2 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -3536,6 +3536,7 @@ void GMainWindow::ResetWindowSize1080() { void GMainWindow::OnConfigure() { const QString old_theme = UISettings::values.theme; + DarkModeState old_dark_mode_state = UISettings::values.dark_mode_state; const bool old_discord_presence = UISettings::values.enable_discord_presence.GetValue(); const auto old_language_index = Settings::values.language_index.GetValue(); #ifdef __unix__ @@ -3594,7 +3595,8 @@ void GMainWindow::OnConfigure() { } InitializeHotkeys(); - if (UISettings::values.theme != old_theme) { + if (UISettings::values.theme != old_theme || + UISettings::values.dark_mode_state != old_dark_mode_state) { UpdateUITheme(); } if (UISettings::values.enable_discord_presence.GetValue() != old_discord_presence) { @@ -4791,13 +4793,11 @@ void GMainWindow::filterBarSetChecked(bool state) { } void GMainWindow::UpdateUITheme() { - LOG_DEBUG(Frontend, "Updating UI"); - QString default_theme = QString::fromStdString(UISettings::default_theme.data()); + const QString default_theme = QString::fromStdString(UISettings::default_theme.data()); QString current_theme = UISettings::values.theme; if (current_theme.isEmpty()) { current_theme = default_theme; } - const bool current_dark_mode = CheckDarkMode(); UpdateIcons(current_theme); @@ -4860,7 +4860,7 @@ bool GMainWindow::TryLoadStylesheet(const QString& theme_uri) { style_path = theme_uri + QStringLiteral("/light.qss"); } if (!QFile::exists(style_path)) { - LOG_INFO(Frontend, "Themed (light/dark) stylesheet could not be found, using default one"); + LOG_DEBUG(Frontend, "No themed (light/dark) stylesheet, using default one"); // Use common stylesheet if themed one does not exist style_path = theme_uri + QStringLiteral("/style.qss"); } @@ -4871,7 +4871,7 @@ bool GMainWindow::TryLoadStylesheet(const QString& theme_uri) { // Update the color palette before applying the stylesheet UpdateThemePalette(); - LOG_INFO(Frontend, "Loading stylesheet in: {}", theme_uri.toStdString()); + LOG_DEBUG(Frontend, "Loading stylesheet in: {}", theme_uri.toStdString()); QTextStream ts_theme(&style_file); qApp->setStyleSheet(ts_theme.readAll()); setStyleSheet(ts_theme.readAll()); @@ -4903,12 +4903,34 @@ void GMainWindow::UpdateThemePalette() { QPalette themePalette(qApp->palette()); #ifdef _WIN32 QColor dark(25, 25, 25); - QColor darkGray(100, 100, 100); - QColor gray(150, 150, 150); - QColor light(230, 230, 230); - // By default, revert fusion style set for Windows dark theme - QString style; + QString style_name; if (CheckDarkMode()) { + // We check that the dark mode state is "On" and force a dark palette + if (UISettings::values.dark_mode_state == DarkModeState::On) { + // Set Default Windows Dark palette on Windows platforms to force Dark mode + themePalette.setColor(QPalette::Window, Qt::black); + themePalette.setColor(QPalette::WindowText, Qt::white); + themePalette.setColor(QPalette::Disabled, QPalette::WindowText, QColor(127, 127, 127)); + themePalette.setColor(QPalette::Base, Qt::black); + themePalette.setColor(QPalette::AlternateBase, dark); + themePalette.setColor(QPalette::ToolTipBase, Qt::white); + themePalette.setColor(QPalette::ToolTipText, Qt::black); + themePalette.setColor(QPalette::Text, Qt::white); + themePalette.setColor(QPalette::Disabled, QPalette::Text, QColor(127, 127, 127)); + themePalette.setColor(QPalette::Dark, QColor(128, 128, 128)); + themePalette.setColor(QPalette::Shadow, Qt::white); + themePalette.setColor(QPalette::Button, Qt::black); + themePalette.setColor(QPalette::ButtonText, Qt::white); + themePalette.setColor(QPalette::Disabled, QPalette::ButtonText, QColor(127, 127, 127)); + themePalette.setColor(QPalette::BrightText, QColor(192, 192, 192)); + themePalette.setColor(QPalette::Link, QColor(0, 140, 200)); + themePalette.setColor(QPalette::Highlight, QColor(24, 70, 93)); + themePalette.setColor(QPalette::Disabled, QPalette::Highlight, QColor(0, 85, 255)); + themePalette.setColor(QPalette::HighlightedText, QColor(239, 240, 241)); + themePalette.setColor(QPalette::Disabled, QPalette::HighlightedText, + QColor(239, 240, 241)); + } + // AlternateBase is kept at rgb(233, 231, 227) or rgb(245, 245, 245) on Windows dark // palette, fix this. Sometimes, it even is rgb(0, 0, 0), but uses a very light gray for // alternate rows, do not know why @@ -4919,22 +4941,23 @@ void GMainWindow::UpdateThemePalette() { alternate_base_modified = true; } // Use fusion theme, since its close to windowsvista, but works well with a dark palette - style = QStringLiteral("fusion"); + style_name = QStringLiteral("fusion"); } else { // Reset AlternateBase if it has been modified if (alternate_base_modified) { themePalette.setColor(QPalette::AlternateBase, QColor(245, 245, 245)); alternate_base_modified = false; } + // Reset light palette + themePalette = this->style()->standardPalette(); // Reset Windows theme to the default - style = QStringLiteral("windowsvista"); + style_name = QStringLiteral("windowsvista"); } - LOG_DEBUG(Frontend, "Using style: {}", style.toStdString()); - qApp->setStyle(style); + LOG_DEBUG(Frontend, "Using style: {}", style_name.toStdString()); + qApp->setStyle(style_name); #else if (CheckDarkMode()) { // Set Dark palette on non Windows platforms (that may not have a dark palette) - LOG_INFO(Frontend, "Using custom dark palette"); themePalette.setColor(QPalette::Window, QColor(53, 53, 53)); themePalette.setColor(QPalette::WindowText, Qt::white); themePalette.setColor(QPalette::Disabled, QPalette::WindowText, QColor(127, 127, 127)); @@ -4956,8 +4979,7 @@ void GMainWindow::UpdateThemePalette() { themePalette.setColor(QPalette::HighlightedText, Qt::white); themePalette.setColor(QPalette::Disabled, QPalette::HighlightedText, QColor(127, 127, 127)); } else { - LOG_INFO(Frontend, "Using standard palette"); - // Reset light palette on non Windows platforms + // Reset light palette themePalette = this->style()->standardPalette(); } #endif @@ -5018,61 +5040,72 @@ bool GMainWindow::ListenColorSchemeChange() { #endif bool GMainWindow::CheckDarkMode() { - const QPalette current_palette(qApp->palette()); + bool is_dark_mode_auto; +#ifdef _WIN32 + // Dark mode cannot be changed after the app started on Windows + is_dark_mode_auto = qgetenv("QT_QPA_PLATFORM").contains("darkmode=2"); +#else + is_dark_mode_auto = UISettings::values.dark_mode_state == DarkModeState::Auto; +#endif + if (!is_dark_mode_auto) { + return UISettings::values.dark_mode_state == DarkModeState::On; + } else { + const QPalette current_palette(qApp->palette()); #ifdef __unix__ - QProcess process; - QStringList gdbus_arguments; + QProcess process; - // Using the freedesktop specifications for checking dark mode - LOG_INFO(Frontend, "Retrieving theme from freedesktop color-scheme..."); - gdbus_arguments << QStringLiteral("--dest=org.freedesktop.portal.Desktop") - << QStringLiteral("--object-path /org/freedesktop/portal/desktop") - << QStringLiteral("--method org.freedesktop.portal.Settings.Read") - << QStringLiteral("org.freedesktop.appearance color-scheme"); - process.start(QStringLiteral("gdbus call --session"), gdbus_arguments); - process.waitForFinished(1000); - QByteArray dbus_output = process.readAllStandardOutput(); + // Using the freedesktop specifications for checking dark mode + LOG_DEBUG(Frontend, "Retrieving theme from freedesktop color-scheme..."); + QStringList gdbus_arguments; + gdbus_arguments << QStringLiteral("--dest=org.freedesktop.portal.Desktop") + << QStringLiteral("--object-path /org/freedesktop/portal/desktop") + << QStringLiteral("--method org.freedesktop.portal.Settings.Read") + << QStringLiteral("org.freedesktop.appearance color-scheme"); + process.start(QStringLiteral("gdbus call --session"), gdbus_arguments); + process.waitForFinished(1000); + QByteArray dbus_output = process.readAllStandardOutput(); - if (!dbus_output.isEmpty()) { - const int systemColorSchema = QString::fromUtf8(dbus_output).trimmed().right(1).toInt(); - return systemColorSchema == 1; - } + if (!dbus_output.isEmpty()) { + const int systemColorSchema = QString::fromUtf8(dbus_output).trimmed().right(1).toInt(); + return systemColorSchema == 1; + } - // Try alternative for Gnome if the previous one failed - QStringList gsettings_arguments; - gsettings_arguments << QStringLiteral("get") - << QStringLiteral("org.gnome.desktop.interface") - << QStringLiteral("color-scheme"); - - LOG_DEBUG(Frontend, "failed, retrieving theme from gsettings color-scheme..."); - process.start(QStringLiteral("gsettings"), gsettings_arguments); - process.waitForFinished(1000); - QByteArray gsettings_output = process.readAllStandardOutput(); - - // Try older gtk-theme method if the previous one failed - if (gsettings_output.isEmpty()) { - LOG_INFO(Frontend, "failed, retrieving theme from gtk-theme..."); - gsettings_arguments.takeLast(); - gsettings_arguments << QStringLiteral("gtk-theme"); + // Try alternative for Gnome if the previous one failed + QStringList gsettings_arguments; + gsettings_arguments << QStringLiteral("get") + << QStringLiteral("org.gnome.desktop.interface") + << QStringLiteral("color-scheme"); + LOG_DEBUG(Frontend, "failed, retrieving theme from gsettings color-scheme..."); process.start(QStringLiteral("gsettings"), gsettings_arguments); process.waitForFinished(1000); - gsettings_output = process.readAllStandardOutput(); - } + QByteArray gsettings_output = process.readAllStandardOutput(); - // Interpret gsettings value if it succeeded - if (!gsettings_output.isEmpty()) { - QString systeme_theme = QString::fromUtf8(gsettings_output); - LOG_DEBUG(Frontend, "Gsettings output: {}", systeme_theme.toStdString()); - return systeme_theme.contains(QStringLiteral("dark"), Qt::CaseInsensitive); - } - LOG_DEBUG(Frontend, "failed, retrieving theme from palette"); + // Try older gtk-theme method if the previous one failed + if (gsettings_output.isEmpty()) { + LOG_DEBUG(Frontend, "failed, retrieving theme from gtk-theme..."); + gsettings_arguments.takeLast(); + gsettings_arguments << QStringLiteral("gtk-theme"); + + process.start(QStringLiteral("gsettings"), gsettings_arguments); + process.waitForFinished(1000); + gsettings_output = process.readAllStandardOutput(); + } + + // Interpret gsettings value if it succeeded + if (!gsettings_output.isEmpty()) { + QString systeme_theme = QString::fromUtf8(gsettings_output); + LOG_DEBUG(Frontend, "Gsettings output: {}", systeme_theme.toStdString()); + return systeme_theme.contains(QStringLiteral("dark"), Qt::CaseInsensitive); + } + LOG_DEBUG(Frontend, "failed, retrieving theme from palette"); #endif - // Use default method based on palette swap by OS. - // It is the only method on Windows with Qt 5. - // Windows needs QT_QPA_PLATFORM env variable set to windows:darkmode=2 to force palette change - return (current_palette.color(QPalette::WindowText).lightness() > - current_palette.color(QPalette::Window).lightness()); + // Use default method based on palette swap by OS. It is the only method on Windows with + // Qt 5. Windows needs QT_QPA_PLATFORM env variable set to windows:darkmode=2 to force + // palette change + return (current_palette.color(QPalette::WindowText).lightness() > + current_palette.color(QPalette::Window).lightness()); + } } void GMainWindow::changeEvent(QEvent* event) { @@ -5080,9 +5113,9 @@ void GMainWindow::changeEvent(QEvent* event) { // UpdateUITheme is a decent work around if (event->type() == QEvent::PaletteChange || event->type() == QEvent::ApplicationPaletteChange) { - LOG_INFO(Frontend, - "Window color palette changed by event: {} (QEvent::PaletteChange is: {})", - event->type(), QEvent::PaletteChange); + LOG_DEBUG(Frontend, + "Window color palette changed by event: {} (QEvent::PaletteChange is: {})", + event->type(), QEvent::PaletteChange); const QPalette test_palette(qApp->palette()); // Keeping eye on QPalette::Window to avoid looping. QPalette::Text might be useful too const QColor window_color = test_palette.color(QPalette::Active, QPalette::Window); @@ -5274,6 +5307,31 @@ int main(int argc, char* argv[]) { QCoreApplication::setApplicationName(QStringLiteral("suyu")); #ifdef _WIN32 + QByteArray current_qt_qpa = qgetenv("QT_QPA_PLATFORM"); + // Follow dark mode setting, if the "-platform" launch option is not set. + // Otherwise, just follow dark mode for the window decoration (title bar). + if (!current_qt_qpa.contains(":darkmode=")) { + if (UISettings::values.dark_mode_state == DarkModeState::Auto) { + // When setting is Auto, force adapting window decoration and stylesheet palette to use + // Windows theme. Default is darkmode:0, which always uses light palette + if (current_qt_qpa.isEmpty()) { + // Set the value + qputenv("QT_QPA_PLATFORM", QByteArray("windows:darkmode=2")); + } else { + // Concatenate to the existing value + qputenv("QT_QPA_PLATFORM", current_qt_qpa + ",darkmode=2"); + } + } else { + // When setting is no Auto, adapt window decoration to the palette used + if (current_qt_qpa.isEmpty()) { + // Set the value + qputenv("QT_QPA_PLATFORM", QByteArray("windows:darkmode=1")); + } else { + // Concatenate to the existing value + qputenv("QT_QPA_PLATFORM", current_qt_qpa + ",darkmode=1"); + } + } + } // Increases the maximum open file limit to 8192 _setmaxstdio(8192); #endif diff --git a/src/suyu/startup_checks.cpp b/src/suyu/startup_checks.cpp index 32011f6d5c..07e8bcb5d8 100644 --- a/src/suyu/startup_checks.cpp +++ b/src/suyu/startup_checks.cpp @@ -6,7 +6,6 @@ #ifdef _WIN32 #include #include -#include #include #include #elif defined(SUYU_UNIX) @@ -38,9 +37,6 @@ void CheckVulkan() { bool CheckEnvVars(bool* is_child) { #ifdef _WIN32 - // Force adapting theme to follow Windows dark mode - qputenv("QT_QPA_PLATFORM", QByteArray("windows:darkmode=2")); - // Check environment variable to see if we are the child char variable_contents[8]; const DWORD startup_check_var = diff --git a/src/suyu/uisettings.h b/src/suyu/uisettings.h index 75571acde8..ded6a42244 100644 --- a/src/suyu/uisettings.h +++ b/src/suyu/uisettings.h @@ -18,6 +18,7 @@ using Settings::Category; using Settings::ConfirmStop; +using Settings::DarkModeState; using Settings::Setting; using Settings::SwitchableSetting; @@ -144,6 +145,7 @@ struct Values { Setting language{linkage, {}, "language", Category::Paths}; QString theme; + DarkModeState dark_mode_state; // Shortcut name std::vector shortcuts; @@ -261,3 +263,4 @@ Q_DECLARE_METATYPE(Settings::RendererBackend); Q_DECLARE_METATYPE(Settings::ShaderBackend); Q_DECLARE_METATYPE(Settings::AstcRecompression); Q_DECLARE_METATYPE(Settings::AstcDecodeMode); +Q_DECLARE_METATYPE(Settings::DarkModeState); From b28acaf7c967c72cda103f48482656affa832dee Mon Sep 17 00:00:00 2001 From: flodavid Date: Fri, 23 Feb 2024 16:37:41 +0100 Subject: [PATCH 107/165] Fix qdarkstyle and midnight blue sliders being cropped - Allow Threshold sliders in control configuration to be up to 40px tall, instead of 15 --- dist/qt_themes/qdarkstyle/dark.qss | 4 ++ .../qdarkstyle_midnight_blue/dark.qss | 4 ++ .../configuration/configure_input_player.ui | 72 +++++++++---------- 3 files changed, 44 insertions(+), 36 deletions(-) diff --git a/dist/qt_themes/qdarkstyle/dark.qss b/dist/qt_themes/qdarkstyle/dark.qss index 09397f89f5..95e575c42f 100644 --- a/dist/qt_themes/qdarkstyle/dark.qss +++ b/dist/qt_themes/qdarkstyle/dark.qss @@ -944,6 +944,10 @@ QListView::indicator:indeterminate:pressed { image: url(:/qss_icons/rc/checkbox_indeterminate_focus.png); } +QSlider:horizontal { + height: 20px; +} + QSlider::groove:horizontal { border: 1px solid #565a5e; height: 4px; diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/dark.qss b/dist/qt_themes/qdarkstyle_midnight_blue/dark.qss index a90ac5d5e0..3086b90ade 100644 --- a/dist/qt_themes/qdarkstyle_midnight_blue/dark.qss +++ b/dist/qt_themes/qdarkstyle_midnight_blue/dark.qss @@ -1296,6 +1296,10 @@ QSlider:focus { border: none; } +QSlider:horizontal { + height: 20px; +} + QSlider::groove:horizontal { background: #32414B; border: 1px solid #32414B; diff --git a/src/suyu/configuration/configure_input_player.ui b/src/suyu/configuration/configure_input_player.ui index 5beb1b6bfc..761015cd94 100644 --- a/src/suyu/configuration/configure_input_player.ui +++ b/src/suyu/configuration/configure_input_player.ui @@ -1430,12 +1430,12 @@ - - - 0 - 0 - - + + + 0 + 0 + + ZL @@ -1481,20 +1481,20 @@ - - - - 70 - 15 - - - - 100 - - - Qt::Horizontal - - + + + + 70 + 40 + + + + 100 + + + Qt::Horizontal + + @@ -1927,22 +1927,22 @@ - - - - - 70 - 15 - - - - 100 - - - Qt::Horizontal - - - + + + + + 70 + 40 + + + + 100 + + + Qt::Horizontal + + + From 323ea0cdfd58458af2a6264cf58c4b9bb87b585f Mon Sep 17 00:00:00 2001 From: flodavid Date: Thu, 11 Apr 2024 10:19:20 -0700 Subject: [PATCH 108/165] WIP: fix macOS style when OS dark mode is active --- src/suyu/main.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index 13089859f2..300eb0819a 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -4851,6 +4851,7 @@ void GMainWindow::UpdateIcons(const QString& theme_path) { } bool GMainWindow::TryLoadStylesheet(const QString& theme_uri) { + LOG_DEBUG(Frontend, "TryLoadStylesheet()"); QString style_path; // Use themed stylesheet if it exists @@ -4900,6 +4901,7 @@ static void AdjustLinkColor() { } void GMainWindow::UpdateThemePalette() { + LOG_DEBUG(Frontend, "UpdateThemePalette()"); QPalette themePalette(qApp->palette()); #ifdef _WIN32 QColor dark(25, 25, 25); @@ -4955,6 +4957,33 @@ void GMainWindow::UpdateThemePalette() { } LOG_DEBUG(Frontend, "Using style: {}", style_name.toStdString()); qApp->setStyle(style_name); +#elif defined(__APPLE__) + // Force the usage of the light palette in light mode + if (CheckDarkMode()) { + // Reset dark palette + themePalette = this->style()->standardPalette(); + } else { + themePalette.setColor(QPalette::Window, QColor(236, 236, 236)); + themePalette.setColor(QPalette::WindowText, Qt::black); + themePalette.setColor(QPalette::Disabled, QPalette::WindowText, Qt::black); + themePalette.setColor(QPalette::Base, Qt::white); + themePalette.setColor(QPalette::AlternateBase, QColor(245, 245, 245)); + themePalette.setColor(QPalette::ToolTipBase, Qt::white); + themePalette.setColor(QPalette::ToolTipText, Qt::black); + themePalette.setColor(QPalette::Text, Qt::black); + themePalette.setColor(QPalette::Disabled, QPalette::Text, Qt::black); + themePalette.setColor(QPalette::Dark, QColor(191, 191, 191)); + themePalette.setColor(QPalette::Shadow, Qt::black); + themePalette.setColor(QPalette::Button, QColor(236, 236, 236)); + themePalette.setColor(QPalette::ButtonText, Qt::black); + themePalette.setColor(QPalette::Disabled, QPalette::ButtonText, QColor(147, 147, 147)); + themePalette.setColor(QPalette::BrightText, Qt::white); + themePalette.setColor(QPalette::Link, QColor(0, 140, 200)); + themePalette.setColor(QPalette::Highlight, QColor(179, 215, 255)); + themePalette.setColor(QPalette::Disabled, QPalette::Highlight, QColor(220, 220, 220)); + themePalette.setColor(QPalette::HighlightedText, Qt::black); + themePalette.setColor(QPalette::Disabled, QPalette::HighlightedText, Qt::black); + } #else if (CheckDarkMode()) { // Set Dark palette on non Windows platforms (that may not have a dark palette) From 138d67b3078939cdeceb76e14fab5101ab384c8b Mon Sep 17 00:00:00 2001 From: Exverge Date: Sun, 31 Mar 2024 20:08:49 -0400 Subject: [PATCH 109/165] Refactor android to dev.suyu.suyu_emu --- .ci/scripts/linux/upload.sh | 2 +- CMakeLists.txt | 8 +- ...suyu.desktop => dev.suyu_emu.suyu.desktop} | 2 +- ...nfo.xml => dev.suyu_emu.suyu.metainfo.xml} | 4 +- ...uyu_emu.suyu.xml => dev.suyu_emu.suyu.xml} | 8 +- src/android/app/build.gradle.kts | 4 +- src/android/app/src/main/AndroidManifest.xml | 8 +- .../suyu/suyu_emu/NativeLibrary.kt | 18 ++--- .../suyu/suyu_emu/SuyuApplication.kt | 12 +-- .../suyu_emu/activities/EmulationActivity.kt | 36 ++++----- .../suyu_emu/adapters/AbstractDiffAdapter.kt | 4 +- .../suyu_emu/adapters/AbstractListAdapter.kt | 4 +- .../adapters/AbstractSingleSelectionList.kt | 6 +- .../suyu/suyu_emu/adapters/AddonAdapter.kt | 10 +-- .../suyu/suyu_emu/adapters/AppletAdapter.kt | 20 ++--- .../adapters/CabinetLauncherDialogAdapter.kt | 22 ++--- .../suyu/suyu_emu/adapters/DriverAdapter.kt | 18 ++--- .../suyu/suyu_emu/adapters/FolderAdapter.kt | 14 ++-- .../suyu/suyu_emu/adapters/GameAdapter.kt | 20 ++--- .../adapters/GamePropertiesAdapter.kt | 20 ++--- .../suyu_emu/adapters/HomeSettingAdapter.kt | 18 ++--- .../suyu_emu/adapters/InstallableAdapter.kt | 10 +-- .../suyu/suyu_emu/adapters/LicenseAdapter.kt | 12 +-- .../suyu/suyu_emu/adapters/SetupAdapter.kt | 18 ++--- .../applets/keyboard/SoftwareKeyboard.kt | 8 +- .../keyboard/ui/KeyboardDialogFragment.kt | 12 +-- .../DiskShaderCacheProgress.kt | 12 +-- .../suyu_emu/features/DocumentProvider.kt | 10 +-- .../suyu_emu/features/input/NativeInput.kt | 16 ++-- .../features/input/SuyuInputDevice.kt | 8 +- .../suyu_emu/features/input/SuyuVibrator.kt | 4 +- .../features/input/model/AnalogDirection.kt | 2 +- .../features/input/model/ButtonName.kt | 2 +- .../features/input/model/InputType.kt | 2 +- .../features/input/model/NativeAnalog.kt | 2 +- .../features/input/model/NativeButton.kt | 2 +- .../features/input/model/NativeTrigger.kt | 2 +- .../features/input/model/NpadStyleIndex.kt | 4 +- .../features/input/model/PlayerInput.kt | 2 +- .../settings/model/AbstractBooleanSetting.kt | 2 +- .../settings/model/AbstractByteSetting.kt | 2 +- .../settings/model/AbstractFloatSetting.kt | 2 +- .../settings/model/AbstractIntSetting.kt | 2 +- .../settings/model/AbstractLongSetting.kt | 2 +- .../settings/model/AbstractSetting.kt | 4 +- .../settings/model/AbstractShortSetting.kt | 2 +- .../settings/model/AbstractStringSetting.kt | 2 +- .../features/settings/model/BooleanSetting.kt | 4 +- .../features/settings/model/ByteSetting.kt | 4 +- .../features/settings/model/FloatSetting.kt | 4 +- .../features/settings/model/IntSetting.kt | 4 +- .../features/settings/model/LongSetting.kt | 4 +- .../features/settings/model/Settings.kt | 6 +- .../features/settings/model/ShortSetting.kt | 4 +- .../features/settings/model/StringSetting.kt | 4 +- .../settings/model/view/AnalogInputSetting.kt | 12 +-- .../settings/model/view/ButtonInputSetting.kt | 10 +-- .../settings/model/view/DateTimeSetting.kt | 4 +- .../settings/model/view/HeaderSetting.kt | 2 +- .../model/view/InputProfileSetting.kt | 8 +- .../settings/model/view/InputSetting.kt | 14 ++-- .../model/view/IntSingleChoiceSetting.kt | 4 +- .../model/view/ModifierInputSetting.kt | 10 +-- .../settings/model/view/RunnableSetting.kt | 2 +- .../settings/model/view/SettingsItem.kt | 30 +++---- .../model/view/SingleChoiceSetting.kt | 6 +- .../settings/model/view/SliderSetting.kt | 12 +-- .../settings/model/view/StringInputSetting.kt | 4 +- .../model/view/StringSingleChoiceSetting.kt | 4 +- .../settings/model/view/SubmenuSetting.kt | 4 +- .../settings/model/view/SwitchSetting.kt | 8 +- .../settings/ui/InputDialogFragment.kt | 24 +++--- .../settings/ui/InputProfileAdapter.kt | 12 +-- .../settings/ui/InputProfileDialogFragment.kt | 12 +-- .../ui/NewInputProfileDialogFragment.kt | 8 +- .../features/settings/ui/SettingsActivity.kt | 16 ++-- .../features/settings/ui/SettingsAdapter.kt | 26 +++--- .../settings/ui/SettingsDialogFragment.kt | 32 ++++---- .../features/settings/ui/SettingsFragment.kt | 16 ++-- .../settings/ui/SettingsFragmentPresenter.kt | 44 +++++----- .../settings/ui/SettingsSearchFragment.kt | 16 ++-- .../features/settings/ui/SettingsViewModel.kt | 14 ++-- .../ui/viewholder/DateTimeViewHolder.kt | 12 +-- .../ui/viewholder/HeaderViewHolder.kt | 8 +- .../ui/viewholder/InputProfileViewHolder.kt | 14 ++-- .../settings/ui/viewholder/InputViewHolder.kt | 20 ++--- .../ui/viewholder/RunnableViewHolder.kt | 12 +-- .../ui/viewholder/SettingViewHolder.kt | 10 +-- .../ui/viewholder/SingleChoiceViewHolder.kt | 16 ++-- .../ui/viewholder/SliderViewHolder.kt | 14 ++-- .../ui/viewholder/StringInputViewHolder.kt | 12 +-- .../ui/viewholder/SubmenuViewHolder.kt | 12 +-- .../ui/viewholder/SwitchSettingViewHolder.kt | 12 +-- .../features/settings/utils/SettingsFile.kt | 10 +-- .../suyu/suyu_emu/fragments/AboutFragment.kt | 12 +-- .../fragments/AddGameFolderDialogFragment.kt | 12 +-- .../suyu/suyu_emu/fragments/AddonsFragment.kt | 21 +++-- .../fragments/AppletLauncherFragment.kt | 16 ++-- .../CabinetLauncherDialogFragment.kt | 8 +- .../ContentTypeSelectionDialogFragment.kt | 10 +-- .../fragments/CoreErrorDialogFragment.kt | 6 +- .../fragments/DriverManagerFragment.kt | 27 +++---- .../fragments/DriversLoadingDialogFragment.kt | 10 +-- .../suyu_emu/fragments/EarlyAccessFragment.kt | 10 +-- .../suyu_emu/fragments/EmulationFragment.kt | 40 +++++----- .../GameFolderPropertiesDialogFragment.kt | 14 ++-- .../suyu_emu/fragments/GameFoldersFragment.kt | 19 +++-- .../suyu_emu/fragments/GameInfoFragment.kt | 18 ++--- .../fragments/GamePropertiesFragment.kt | 44 +++++----- .../fragments/HomeSettingsFragment.kt | 35 ++++---- .../suyu_emu/fragments/InstallableFragment.kt | 29 ++++--- .../fragments/LaunchGameDialogFragment.kt | 10 +-- .../LicenseBottomSheetDialogFragment.kt | 8 +- .../suyu_emu/fragments/LicensesFragment.kt | 14 ++-- .../fragments/MessageDialogFragment.kt | 8 +- .../PermissionDeniedDialogFragment.kt | 4 +- .../fragments/ProgressDialogFragment.kt | 12 +-- .../fragments/ResetSettingsDialogFragment.kt | 6 +- .../suyu/suyu_emu/fragments/SearchFragment.kt | 22 ++--- .../suyu/suyu_emu/fragments/SetupFragment.kt | 35 ++++---- .../fragments/SetupWarningDialogFragment.kt | 4 +- .../layout/AutofitGridLayoutManager.kt | 4 +- .../suyu/suyu_emu/model/AddonViewModel.kt | 6 +- .../suyu/suyu_emu/model/Applet.kt | 4 +- .../suyu/suyu_emu/model/Driver.kt | 4 +- .../suyu/suyu_emu/model/DriverViewModel.kt | 18 ++--- .../suyu/suyu_emu/model/EmulationViewModel.kt | 2 +- .../{org => dev}/suyu/suyu_emu/model/Game.kt | 14 ++-- .../suyu/suyu_emu/model/GameDir.kt | 2 +- .../suyu/suyu_emu/model/GameProperties.kt | 2 +- .../suyu_emu/model/GameVerificationResult.kt | 2 +- .../suyu/suyu_emu/model/GamesViewModel.kt | 10 +-- .../suyu/suyu_emu/model/HomeSetting.kt | 2 +- .../suyu/suyu_emu/model/HomeViewModel.kt | 2 +- .../suyu/suyu_emu/model/InstallResult.kt | 2 +- .../suyu/suyu_emu/model/Installable.kt | 2 +- .../suyu/suyu_emu/model/License.kt | 2 +- .../suyu_emu/model/MessageDialogViewModel.kt | 2 +- .../suyu_emu/model/MinimalDocumentFile.kt | 2 +- .../{org => dev}/suyu/suyu_emu/model/Patch.kt | 2 +- .../suyu/suyu_emu/model/PatchType.kt | 2 +- .../suyu/suyu_emu/model/SelectableItem.kt | 2 +- .../suyu/suyu_emu/model/SetupPage.kt | 2 +- .../suyu/suyu_emu/model/TaskViewModel.kt | 2 +- .../suyu/suyu_emu/overlay/InputOverlay.kt | 24 +++--- .../overlay/InputOverlayDrawableButton.kt | 8 +- .../overlay/InputOverlayDrawableDpad.kt | 6 +- .../overlay/InputOverlayDrawableJoystick.kt | 10 +-- .../suyu_emu/overlay/model/OverlayControl.kt | 6 +- .../overlay/model/OverlayControlData.kt | 2 +- .../overlay/model/OverlayControlDefault.kt | 2 +- .../suyu_emu/overlay/model/OverlayLayout.kt | 2 +- .../suyu/suyu_emu/ui/GamesFragment.kt | 20 ++--- .../suyu/suyu_emu/ui/main/MainActivity.kt | 36 ++++----- .../suyu/suyu_emu/ui/main/ThemeProvider.kt | 2 +- .../suyu/suyu_emu/utils/AddonUtil.kt | 2 +- .../suyu_emu/utils/DirectoryInitialization.kt | 20 ++--- .../suyu/suyu_emu/utils/DocumentsTree.kt | 4 +- .../suyu/suyu_emu/utils/FileUtil.kt | 8 +- .../suyu/suyu_emu/utils/GameHelper.kt | 12 +-- .../suyu/suyu_emu/utils/GameIconUtils.kt | 8 +- .../suyu/suyu_emu/utils/GameMetadata.kt | 2 +- .../suyu/suyu_emu/utils/GpuDriverHelper.kt | 8 +- .../suyu/suyu_emu/utils/GpuDriverMetadata.kt | 2 +- .../suyu/suyu_emu/utils/InputHandler.kt | 8 +- .../suyu/suyu_emu/utils/InsetsHelper.kt | 2 +- .../suyu/suyu_emu/utils/LifecycleUtils.kt | 2 +- .../{org => dev}/suyu/suyu_emu/utils/Log.kt | 2 +- .../suyu/suyu_emu/utils/MemoryUtil.kt | 6 +- .../suyu/suyu_emu/utils/NativeConfig.kt | 8 +- .../suyu/suyu_emu/utils/NfcReader.kt | 4 +- .../suyu/suyu_emu/utils/ParamPackage.kt | 2 +- .../suyu/suyu_emu/utils/PreferenceUtil.kt | 2 +- .../suyu/suyu_emu/utils/SerializableHelper.kt | 2 +- .../suyu/suyu_emu/utils/ThemeHelper.kt | 10 +-- .../suyu/suyu_emu/utils/ViewUtils.kt | 2 +- .../suyu_emu/viewholder/AbstractViewHolder.kt | 6 +- .../suyu_emu/views/FixedRatioSurfaceView.kt | 2 +- .../app/src/main/jni/game_metadata.cpp | 16 ++-- src/android/app/src/main/jni/native.cpp | 80 +++++++++---------- .../app/src/main/jni/native_config.cpp | 78 +++++++++--------- src/android/app/src/main/jni/native_input.cpp | 78 +++++++++--------- src/android/app/src/main/jni/native_log.cpp | 10 +-- .../main/res/layout/fragment_emulation.xml | 6 +- .../res/navigation/emulation_navigation.xml | 10 +-- .../main/res/navigation/home_navigation.xml | 48 +++++------ .../res/navigation/settings_navigation.xml | 8 +- .../app/src/main/res/values-ar/strings.xml | 10 +-- .../app/src/main/res/values-ckb/strings.xml | 16 ++-- .../app/src/main/res/values-cs/strings.xml | 8 +- .../app/src/main/res/values-de/strings.xml | 16 ++-- .../app/src/main/res/values-es/strings.xml | 20 ++--- .../app/src/main/res/values-fa/strings.xml | 16 ++-- .../app/src/main/res/values-fr/strings.xml | 20 ++--- .../app/src/main/res/values-he/strings.xml | 20 ++--- .../app/src/main/res/values-hu/strings.xml | 18 ++--- .../app/src/main/res/values-id/strings.xml | 18 ++--- .../app/src/main/res/values-it/strings.xml | 20 ++--- .../app/src/main/res/values-ja/strings.xml | 16 ++-- .../app/src/main/res/values-ko/strings.xml | 20 ++--- .../app/src/main/res/values-nb/strings.xml | 16 ++-- .../app/src/main/res/values-pl/strings.xml | 16 ++-- .../src/main/res/values-pt-rBR/strings.xml | 20 ++--- .../src/main/res/values-pt-rPT/strings.xml | 16 ++-- .../app/src/main/res/values-ru/strings.xml | 20 ++--- .../app/src/main/res/values-uk/strings.xml | 14 ++-- .../app/src/main/res/values-vi/strings.xml | 16 ++-- .../src/main/res/values-zh-rCN/strings.xml | 20 ++--- .../src/main/res/values-zh-rTW/strings.xml | 20 ++--- .../app/src/main/res/values/strings.xml | 20 ++--- .../android/applets/software_keyboard.cpp | 10 +-- src/common/android/id_cache.cpp | 18 ++--- src/suyu/about_dialog.cpp | 2 +- src/suyu/main.cpp | 2 +- 214 files changed, 1244 insertions(+), 1250 deletions(-) rename dist/{org.suyu_emu.suyu.desktop => dev.suyu_emu.suyu.desktop} (95%) rename dist/{org.suyu_emu.suyu.metainfo.xml => dev.suyu_emu.suyu.metainfo.xml} (96%) rename dist/{org.suyu_emu.suyu.xml => dev.suyu_emu.suyu.xml} (88%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/NativeLibrary.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/SuyuApplication.kt (86%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/activities/EmulationActivity.kt (95%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/AbstractDiffAdapter.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/AbstractListAdapter.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/AbstractSingleSelectionList.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/AddonAdapter.kt (84%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/AppletAdapter.kt (84%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt (79%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/DriverAdapter.kt (82%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/FolderAdapter.kt (80%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/GameAdapter.kt (89%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt (88%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/HomeSettingAdapter.kt (87%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/InstallableAdapter.kt (83%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/LicenseAdapter.kt (81%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/adapters/SetupAdapter.kt (86%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard.kt (95%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/applets/keyboard/ui/KeyboardDialogFragment.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt (84%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/DocumentProvider.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/NativeInput.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/SuyuInputDevice.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/SuyuVibrator.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/model/AnalogDirection.kt (86%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/model/ButtonName.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/model/InputType.kt (87%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/model/NativeAnalog.kt (89%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/model/NativeButton.kt (93%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/model/NativeTrigger.kt (85%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/model/NpadStyleIndex.kt (91%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/input/model/PlayerInput.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt (83%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt (82%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt (82%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt (82%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt (82%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/AbstractSetting.kt (88%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt (82%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt (82%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/BooleanSetting.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/ByteSetting.kt (88%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/FloatSetting.kt (89%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/IntSetting.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/LongSetting.kt (88%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/Settings.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/ShortSetting.kt (89%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/StringSetting.kt (89%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/AnalogInputSetting.kt (72%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/ButtonInputSetting.kt (75%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt (84%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt (85%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/InputProfileSetting.kt (85%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/InputSetting.kt (93%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt (90%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/ModifierInputSetting.kt (78%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt (91%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt (82%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt (78%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/StringInputSetting.kt (86%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt (90%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt (82%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt (79%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/InputDialogFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/InputProfileAdapter.kt (89%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/InputProfileDialogFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/NewInputProfileDialogFragment.kt (93%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt (93%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt (95%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt (82%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt (70%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt (72%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/InputViewHolder.kt (76%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt (79%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt (84%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt (85%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt (79%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt (79%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt (78%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt (81%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/features/settings/utils/SettingsFile.kt (77%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/AboutFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt (88%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/AddonsFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/AppletLauncherFragment.kt (91%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt (86%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/CoreErrorDialogFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/DriverManagerFragment.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt (87%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/EarlyAccessFragment.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/EmulationFragment.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt (88%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/GameFoldersFragment.kt (89%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/GameInfoFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/GamePropertiesFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/HomeSettingsFragment.kt (95%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/InstallableFragment.kt (95%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt (90%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt (90%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/LicensesFragment.kt (93%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/MessageDialogFragment.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt (95%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/ProgressDialogFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt (88%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/SearchFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/SetupFragment.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/AddonViewModel.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/Applet.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/Driver.kt (89%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/DriverViewModel.kt (93%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/EmulationViewModel.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/Game.kt (91%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/GameDir.kt (89%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/GameProperties.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/GameVerificationResult.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/GamesViewModel.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/HomeSetting.kt (93%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/HomeViewModel.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/InstallResult.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/Installable.kt (90%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/License.kt (91%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/MessageDialogViewModel.kt (91%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/MinimalDocumentFile.kt (91%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/Patch.kt (90%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/PatchType.kt (91%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/SelectableItem.kt (89%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/SetupPage.kt (95%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/model/TaskViewModel.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/overlay/InputOverlay.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt (95%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/overlay/model/OverlayControl.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/overlay/model/OverlayControlData.kt (93%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt (90%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/overlay/model/OverlayLayout.kt (84%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/ui/GamesFragment.kt (92%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/ui/main/MainActivity.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/ui/main/ThemeProvider.kt (88%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/AddonUtil.kt (85%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/DirectoryInitialization.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/DocumentsTree.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/FileUtil.kt (99%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/GameHelper.kt (95%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/GameIconUtils.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/GameMetadata.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/GpuDriverHelper.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/GpuDriverMetadata.kt (99%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/InputHandler.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/InsetsHelper.kt (95%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/LifecycleUtils.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/Log.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/MemoryUtil.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/NativeConfig.kt (96%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/NfcReader.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/ParamPackage.kt (99%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/PreferenceUtil.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/SerializableHelper.kt (97%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/ThemeHelper.kt (94%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/utils/ViewUtils.kt (98%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/viewholder/AbstractViewHolder.kt (80%) rename src/android/app/src/main/java/{org => dev}/suyu/suyu_emu/views/FixedRatioSurfaceView.kt (98%) diff --git a/.ci/scripts/linux/upload.sh b/.ci/scripts/linux/upload.sh index 392106bcd2..0e383fd059 100755 --- a/.ci/scripts/linux/upload.sh +++ b/.ci/scripts/linux/upload.sh @@ -37,7 +37,7 @@ fi # Don't let AppImageLauncher ask to integrate EA if [ "${RELEASE_NAME}" = "mainline" ] || [ "${RELEASE_NAME}" = "early-access" ]; then - echo "X-AppImage-Integrate=false" >> AppDir/org.suyu_emu.suyu.desktop + echo "X-AppImage-Integrate=false" >> AppDir/dev.suyu_emu.suyu.desktop fi if [ "${RELEASE_NAME}" = "mainline" ]; then diff --git a/CMakeLists.txt b/CMakeLists.txt index 9406dd64a1..cbeb2ee689 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -732,14 +732,14 @@ endif() # https://specifications.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html # https://www.freedesktop.org/software/appstream/docs/ if(ENABLE_QT AND UNIX AND NOT APPLE) - install(FILES "dist/org.suyu_emu.suyu.desktop" + install(FILES "dist/dev.suyu_emu.suyu.desktop" DESTINATION "share/applications") install(FILES "dist/suyu.svg" DESTINATION "share/icons/hicolor/scalable/apps" - RENAME "org.suyu_emu.suyu.svg") - install(FILES "dist/org.suyu_emu.suyu.xml" + RENAME "dev.suyu_emu.suyu.svg") + install(FILES "dist/dev.suyu_emu.suyu.xml" DESTINATION "share/mime/packages") - install(FILES "dist/org.suyu_emu.suyu.metainfo.xml" + install(FILES "dist/dev.suyu_emu.suyu.metainfo.xml" DESTINATION "share/metainfo") endif() diff --git a/dist/org.suyu_emu.suyu.desktop b/dist/dev.suyu_emu.suyu.desktop similarity index 95% rename from dist/org.suyu_emu.suyu.desktop rename to dist/dev.suyu_emu.suyu.desktop index 26bc6dd6f1..215c9d884a 100644 --- a/dist/org.suyu_emu.suyu.desktop +++ b/dist/dev.suyu_emu.suyu.desktop @@ -8,7 +8,7 @@ Type=Application Name=suyu GenericName=Switch Emulator Comment=Nintendo Switch video game console emulator -Icon=org.suyu_emu.suyu +Icon=dev.suyu_emu.suyu TryExec=suyu Exec=suyu %f Categories=Game;Emulator;Qt; diff --git a/dist/org.suyu_emu.suyu.metainfo.xml b/dist/dev.suyu_emu.suyu.metainfo.xml similarity index 96% rename from dist/org.suyu_emu.suyu.metainfo.xml rename to dist/dev.suyu_emu.suyu.metainfo.xml index aeb2fecfbe..7677919f77 100644 --- a/dist/org.suyu_emu.suyu.metainfo.xml +++ b/dist/dev.suyu_emu.suyu.metainfo.xml @@ -7,7 +7,7 @@ SPDX-License-Identifier: CC0-1.0 --> - org.suyu_emu.suyu + dev.suyu_emu.suyu CC0-1.0 suyu Nintendo Switch emulator @@ -34,7 +34,7 @@ SPDX-License-Identifier: CC0-1.0 https://community.citra-emu.org/ https://gitlab.com/suyu-emu/suyu https://suyu-emu.org/wiki/contributing/ - org.suyu_emu.suyu.desktop + dev.suyu_emu.suyu.desktop suyu suyu-cmd diff --git a/dist/org.suyu_emu.suyu.xml b/dist/dev.suyu_emu.suyu.xml similarity index 88% rename from dist/org.suyu_emu.suyu.xml rename to dist/dev.suyu_emu.suyu.xml index 9fafef671b..7e1414ce17 100644 --- a/dist/org.suyu_emu.suyu.xml +++ b/dist/dev.suyu_emu.suyu.xml @@ -10,7 +10,7 @@ SPDX-License-Identifier: GPL-2.0-or-later Nintendo Switch homebrew executable NRO - + @@ -18,7 +18,7 @@ SPDX-License-Identifier: GPL-2.0-or-later Nintendo Switch homebrew executable NSO - + @@ -26,7 +26,7 @@ SPDX-License-Identifier: GPL-2.0-or-later Nintendo Switch Package NSP - + @@ -34,7 +34,7 @@ SPDX-License-Identifier: GPL-2.0-or-later Nintendo Switch Card Image XCI - + diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts index 78f8cc3488..9312d48c33 100644 --- a/src/android/app/build.gradle.kts +++ b/src/android/app/build.gradle.kts @@ -25,7 +25,7 @@ val autoVersion = (((System.currentTimeMillis() / 1000) - 1451606400) / 10).toIn @Suppress("UnstableApiUsage") android { - namespace = "org.suyu.suyu_emu" + namespace = "dev.suyu.suyu_emu" compileSdkVersion = "android-34" ndkVersion = "26.1.10909125" @@ -54,7 +54,7 @@ android { defaultConfig { // TODO If this is ever modified, change application_id in strings.xml - applicationId = "org.suyu.suyu_emu" + applicationId = "dev.suyu.suyu_emu" minSdk = 30 targetSdk = 34 versionName = getGitVersion() diff --git a/src/android/app/src/main/AndroidManifest.xml b/src/android/app/src/main/AndroidManifest.xml index 02d08c00be..5f893cd986 100644 --- a/src/android/app/src/main/AndroidManifest.xml +++ b/src/android/app/src/main/AndroidManifest.xml @@ -17,7 +17,7 @@ SPDX-License-Identifier: GPL-3.0-or-later @@ -48,12 +48,12 @@ SPDX-License-Identifier: GPL-3.0-or-later () { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AppletAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/AppletAdapter.kt similarity index 84% rename from src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AppletAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/AppletAdapter.kt index 73c43a6d2c..c6d373f7a5 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/AppletAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/AppletAdapter.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.adapters +package dev.suyu.suyu_emu.adapters import android.view.LayoutInflater import android.view.ViewGroup @@ -9,15 +9,15 @@ import android.widget.Toast import androidx.core.content.res.ResourcesCompat import androidx.fragment.app.FragmentActivity import androidx.navigation.findNavController -import org.suyu.suyu_emu.HomeNavigationDirections -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.databinding.CardSimpleOutlinedBinding -import org.suyu.suyu_emu.model.Applet -import org.suyu.suyu_emu.model.AppletInfo -import org.suyu.suyu_emu.model.Game -import org.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.HomeNavigationDirections +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.databinding.CardSimpleOutlinedBinding +import dev.suyu.suyu_emu.model.Applet +import dev.suyu.suyu_emu.model.AppletInfo +import dev.suyu.suyu_emu.model.Game +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder class AppletAdapter(val activity: FragmentActivity, applets: List) : AbstractListAdapter(applets) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt similarity index 79% rename from src/android/app/src/main/java/org/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt index 188b3ae464..d7125d8603 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/CabinetLauncherDialogAdapter.kt @@ -1,23 +1,23 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.adapters +package dev.suyu.suyu_emu.adapters import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.content.res.ResourcesCompat import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController -import org.suyu.suyu_emu.HomeNavigationDirections -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.databinding.DialogListItemBinding -import org.suyu.suyu_emu.model.CabinetMode -import org.suyu.suyu_emu.adapters.CabinetLauncherDialogAdapter.CabinetModeViewHolder -import org.suyu.suyu_emu.model.AppletInfo -import org.suyu.suyu_emu.model.Game -import org.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.HomeNavigationDirections +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.databinding.DialogListItemBinding +import dev.suyu.suyu_emu.model.CabinetMode +import dev.suyu.suyu_emu.adapters.CabinetLauncherDialogAdapter.CabinetModeViewHolder +import dev.suyu.suyu_emu.model.AppletInfo +import dev.suyu.suyu_emu.model.Game +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder class CabinetLauncherDialogAdapter(val fragment: Fragment) : AbstractListAdapter( diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/DriverAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/DriverAdapter.kt similarity index 82% rename from src/android/app/src/main/java/org/suyu/suyu_emu/adapters/DriverAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/DriverAdapter.kt index 4c8e53abbd..58c8555750 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/DriverAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/DriverAdapter.kt @@ -1,18 +1,18 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.adapters +package dev.suyu.suyu_emu.adapters import android.view.LayoutInflater import android.view.ViewGroup -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.CardDriverOptionBinding -import org.suyu.suyu_emu.features.settings.model.StringSetting -import org.suyu.suyu_emu.model.Driver -import org.suyu.suyu_emu.model.DriverViewModel -import org.suyu.suyu_emu.utils.ViewUtils.marquee -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.CardDriverOptionBinding +import dev.suyu.suyu_emu.features.settings.model.StringSetting +import dev.suyu.suyu_emu.model.Driver +import dev.suyu.suyu_emu.model.DriverViewModel +import dev.suyu.suyu_emu.utils.ViewUtils.marquee +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder class DriverAdapter(private val driverViewModel: DriverViewModel) : AbstractSingleSelectionList( diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/FolderAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/FolderAdapter.kt similarity index 80% rename from src/android/app/src/main/java/org/suyu/suyu_emu/adapters/FolderAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/FolderAdapter.kt index dfe332586d..ce73151938 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/FolderAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/FolderAdapter.kt @@ -1,18 +1,18 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.adapters +package dev.suyu.suyu_emu.adapters import android.net.Uri import android.view.LayoutInflater import android.view.ViewGroup import androidx.fragment.app.FragmentActivity -import org.suyu.suyu_emu.databinding.CardFolderBinding -import org.suyu.suyu_emu.fragments.GameFolderPropertiesDialogFragment -import org.suyu.suyu_emu.model.GameDir -import org.suyu.suyu_emu.model.GamesViewModel -import org.suyu.suyu_emu.utils.ViewUtils.marquee -import org.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.databinding.CardFolderBinding +import dev.suyu.suyu_emu.fragments.GameFolderPropertiesDialogFragment +import dev.suyu.suyu_emu.model.GameDir +import dev.suyu.suyu_emu.model.GamesViewModel +import dev.suyu.suyu_emu.utils.ViewUtils.marquee +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder class FolderAdapter(val activity: FragmentActivity, val gamesViewModel: GamesViewModel) : AbstractDiffAdapter() { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GameAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/GameAdapter.kt similarity index 89% rename from src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GameAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/GameAdapter.kt index 6a87c8852c..7cca8b9aec 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GameAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/GameAdapter.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.adapters +package dev.suyu.suyu_emu.adapters import android.net.Uri import android.view.LayoutInflater @@ -19,15 +19,15 @@ import androidx.preference.PreferenceManager import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.suyu.suyu_emu.HomeNavigationDirections -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.databinding.CardGameBinding -import org.suyu.suyu_emu.model.Game -import org.suyu.suyu_emu.model.GamesViewModel -import org.suyu.suyu_emu.utils.GameIconUtils -import org.suyu.suyu_emu.utils.ViewUtils.marquee -import org.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.HomeNavigationDirections +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.databinding.CardGameBinding +import dev.suyu.suyu_emu.model.Game +import dev.suyu.suyu_emu.model.GamesViewModel +import dev.suyu.suyu_emu.utils.GameIconUtils +import dev.suyu.suyu_emu.utils.ViewUtils.marquee +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder class GameAdapter(private val activity: AppCompatActivity) : AbstractDiffAdapter(exact = false) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt similarity index 88% rename from src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt index 1d3916b43f..6cc783d2c2 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/GamePropertiesAdapter.kt @@ -1,21 +1,21 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.adapters +package dev.suyu.suyu_emu.adapters import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.content.res.ResourcesCompat import androidx.lifecycle.LifecycleOwner -import org.suyu.suyu_emu.databinding.CardInstallableIconBinding -import org.suyu.suyu_emu.databinding.CardSimpleOutlinedBinding -import org.suyu.suyu_emu.model.GameProperty -import org.suyu.suyu_emu.model.InstallableProperty -import org.suyu.suyu_emu.model.SubmenuProperty -import org.suyu.suyu_emu.utils.ViewUtils.marquee -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.utils.collect -import org.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.databinding.CardInstallableIconBinding +import dev.suyu.suyu_emu.databinding.CardSimpleOutlinedBinding +import dev.suyu.suyu_emu.model.GameProperty +import dev.suyu.suyu_emu.model.InstallableProperty +import dev.suyu.suyu_emu.model.SubmenuProperty +import dev.suyu.suyu_emu.utils.ViewUtils.marquee +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder class GamePropertiesAdapter( private val viewLifecycle: LifecycleOwner, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/HomeSettingAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/HomeSettingAdapter.kt similarity index 87% rename from src/android/app/src/main/java/org/suyu/suyu_emu/adapters/HomeSettingAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/HomeSettingAdapter.kt index 973e0b457d..8ecc0e6f90 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/HomeSettingAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/HomeSettingAdapter.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.adapters +package dev.suyu.suyu_emu.adapters import android.view.LayoutInflater import android.view.ViewGroup @@ -9,14 +9,14 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat import androidx.lifecycle.LifecycleOwner -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.CardHomeOptionBinding -import org.suyu.suyu_emu.fragments.MessageDialogFragment -import org.suyu.suyu_emu.model.HomeSetting -import org.suyu.suyu_emu.utils.ViewUtils.marquee -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.utils.collect -import org.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.CardHomeOptionBinding +import dev.suyu.suyu_emu.fragments.MessageDialogFragment +import dev.suyu.suyu_emu.model.HomeSetting +import dev.suyu.suyu_emu.utils.ViewUtils.marquee +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder class HomeSettingAdapter( private val activity: AppCompatActivity, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/InstallableAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/InstallableAdapter.kt similarity index 83% rename from src/android/app/src/main/java/org/suyu/suyu_emu/adapters/InstallableAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/InstallableAdapter.kt index fbd420aaae..e4bef9e2b6 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/InstallableAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/InstallableAdapter.kt @@ -1,14 +1,14 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.adapters +package dev.suyu.suyu_emu.adapters import android.view.LayoutInflater import android.view.ViewGroup -import org.suyu.suyu_emu.databinding.CardInstallableBinding -import org.suyu.suyu_emu.model.Installable -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.databinding.CardInstallableBinding +import dev.suyu.suyu_emu.model.Installable +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder class InstallableAdapter(installables: List) : AbstractListAdapter(installables) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/LicenseAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/LicenseAdapter.kt similarity index 81% rename from src/android/app/src/main/java/org/suyu/suyu_emu/adapters/LicenseAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/LicenseAdapter.kt index 5358cd6067..dec98c8032 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/LicenseAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/LicenseAdapter.kt @@ -1,16 +1,16 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.adapters +package dev.suyu.suyu_emu.adapters import android.view.LayoutInflater import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity -import org.suyu.suyu_emu.databinding.ListItemSettingBinding -import org.suyu.suyu_emu.fragments.LicenseBottomSheetDialogFragment -import org.suyu.suyu_emu.model.License -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.databinding.ListItemSettingBinding +import dev.suyu.suyu_emu.fragments.LicenseBottomSheetDialogFragment +import dev.suyu.suyu_emu.model.License +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder class LicenseAdapter(private val activity: AppCompatActivity, licenses: List) : AbstractListAdapter(licenses) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/SetupAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/SetupAdapter.kt similarity index 86% rename from src/android/app/src/main/java/org/suyu/suyu_emu/adapters/SetupAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/SetupAdapter.kt index 2dcd5cfc64..134de7cfc3 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/adapters/SetupAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/adapters/SetupAdapter.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.adapters +package dev.suyu.suyu_emu.adapters import android.text.Html import android.view.LayoutInflater @@ -10,14 +10,14 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.content.res.ResourcesCompat import androidx.lifecycle.ViewModelProvider import com.google.android.material.button.MaterialButton -import org.suyu.suyu_emu.databinding.PageSetupBinding -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.model.SetupCallback -import org.suyu.suyu_emu.model.SetupPage -import org.suyu.suyu_emu.model.StepState -import org.suyu.suyu_emu.utils.ViewUtils -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.databinding.PageSetupBinding +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.model.SetupCallback +import dev.suyu.suyu_emu.model.SetupPage +import dev.suyu.suyu_emu.model.StepState +import dev.suyu.suyu_emu.utils.ViewUtils +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder class SetupAdapter(val activity: AppCompatActivity, pages: List) : AbstractListAdapter(pages) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard.kt similarity index 95% rename from src/android/app/src/main/java/org/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard.kt index 8558858d9f..8831c0d439 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.applets.keyboard +package dev.suyu.suyu_emu.applets.keyboard import android.content.Context import android.os.Handler @@ -13,9 +13,9 @@ import android.view.inputmethod.InputMethodManager import androidx.annotation.Keep import androidx.core.view.ViewCompat import java.io.Serializable -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.applets.keyboard.ui.KeyboardDialogFragment +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.applets.keyboard.ui.KeyboardDialogFragment @Keep object SoftwareKeyboard { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/applets/keyboard/ui/KeyboardDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/applets/keyboard/ui/KeyboardDialogFragment.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/applets/keyboard/ui/KeyboardDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/applets/keyboard/ui/KeyboardDialogFragment.kt index b80d9e0d04..c6ea6a8f67 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/applets/keyboard/ui/KeyboardDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/applets/keyboard/ui/KeyboardDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.applets.keyboard.ui +package dev.suyu.suyu_emu.applets.keyboard.ui import android.app.Dialog import android.content.DialogInterface @@ -10,11 +10,11 @@ import android.text.InputFilter import android.text.InputType import androidx.fragment.app.DialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.applets.keyboard.SoftwareKeyboard -import org.suyu.suyu_emu.applets.keyboard.SoftwareKeyboard.KeyboardConfig -import org.suyu.suyu_emu.databinding.DialogEditTextBinding -import org.suyu.suyu_emu.utils.SerializableHelper.serializable +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.applets.keyboard.SoftwareKeyboard +import dev.suyu.suyu_emu.applets.keyboard.SoftwareKeyboard.KeyboardConfig +import dev.suyu.suyu_emu.databinding.DialogEditTextBinding +import dev.suyu.suyu_emu.utils.SerializableHelper.serializable class KeyboardDialogFragment : DialogFragment() { private lateinit var binding: DialogEditTextBinding diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt similarity index 84% rename from src/android/app/src/main/java/org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt index 80df698230..48dd975538 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress.kt @@ -1,15 +1,15 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.disk_shader_cache +package dev.suyu.suyu_emu.disk_shader_cache import androidx.annotation.Keep import androidx.lifecycle.ViewModelProvider -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.activities.EmulationActivity -import org.suyu.suyu_emu.model.EmulationViewModel -import org.suyu.suyu_emu.utils.Log +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.activities.EmulationActivity +import dev.suyu.suyu_emu.model.EmulationViewModel +import dev.suyu.suyu_emu.utils.Log @Keep object DiskShaderCacheProgress { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/DocumentProvider.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/DocumentProvider.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/DocumentProvider.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/DocumentProvider.kt index 3e434cdd66..9d77f36d54 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/DocumentProvider.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/DocumentProvider.kt @@ -4,7 +4,7 @@ // SPDX-License-Identifier: MPL-2.0 // Copyright © 2023 Skyline Team and Contributors (https://github.com/skyline-emu/) -package org.suyu.suyu_emu.features +package dev.suyu.suyu_emu.features import android.database.Cursor import android.database.MatrixCursor @@ -14,10 +14,10 @@ import android.provider.DocumentsContract import android.provider.DocumentsProvider import android.webkit.MimeTypeMap import java.io.* -import org.suyu.suyu_emu.BuildConfig -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.getPublicFilesDir +import dev.suyu.suyu_emu.BuildConfig +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.getPublicFilesDir class DocumentProvider : DocumentsProvider() { private val baseDirectory: File diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/NativeInput.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/NativeInput.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/NativeInput.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/NativeInput.kt index 9639a614ac..f9485c3642 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/NativeInput.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/NativeInput.kt @@ -2,15 +2,15 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input +package dev.suyu.suyu_emu.features.input -import org.suyu.suyu_emu.features.input.model.NativeButton -import org.suyu.suyu_emu.features.input.model.NativeAnalog -import org.suyu.suyu_emu.features.input.model.InputType -import org.suyu.suyu_emu.features.input.model.ButtonName -import org.suyu.suyu_emu.features.input.model.NpadStyleIndex -import org.suyu.suyu_emu.utils.NativeConfig -import org.suyu.suyu_emu.utils.ParamPackage +import dev.suyu.suyu_emu.features.input.model.NativeButton +import dev.suyu.suyu_emu.features.input.model.NativeAnalog +import dev.suyu.suyu_emu.features.input.model.InputType +import dev.suyu.suyu_emu.features.input.model.ButtonName +import dev.suyu.suyu_emu.features.input.model.NpadStyleIndex +import dev.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.ParamPackage import android.view.InputDevice object NativeInput { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/SuyuInputDevice.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/SuyuInputDevice.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/SuyuInputDevice.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/SuyuInputDevice.kt index 4e7fc4adf0..f04ebb5253 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/SuyuInputDevice.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/SuyuInputDevice.kt @@ -2,13 +2,13 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input +package dev.suyu.suyu_emu.features.input import android.view.InputDevice import androidx.annotation.Keep -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.utils.InputHandler.getGUID +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.utils.InputHandler.getGUID @Keep interface SuyuInputDevice { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/SuyuVibrator.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/SuyuVibrator.kt similarity index 96% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/SuyuVibrator.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/SuyuVibrator.kt index 33cf4f5788..b1e3dad1a6 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/SuyuVibrator.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/SuyuVibrator.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input +package dev.suyu.suyu_emu.features.input import android.content.Context import android.os.Build @@ -13,7 +13,7 @@ import android.os.VibratorManager import android.view.InputDevice import androidx.annotation.Keep import androidx.annotation.RequiresApi -import org.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.SuyuApplication @Keep @Suppress("DEPRECATION") diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/AnalogDirection.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/AnalogDirection.kt similarity index 86% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/AnalogDirection.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/AnalogDirection.kt index ff4762c7d4..f2cf59a23c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/AnalogDirection.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/AnalogDirection.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input.model +package dev.suyu.suyu_emu.features.input.model enum class AnalogDirection(val int: Int, val param: String) { Up(0, "up"), diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/ButtonName.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/ButtonName.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/ButtonName.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/ButtonName.kt index c33e986cdb..ccbb555bd3 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/ButtonName.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/ButtonName.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input.model +package dev.suyu.suyu_emu.features.input.model // Loosely matches the enum in common/input.h enum class ButtonName(val int: Int) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/InputType.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/InputType.kt similarity index 87% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/InputType.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/InputType.kt index 6d441f180a..1b93341e0d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/InputType.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/InputType.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input.model +package dev.suyu.suyu_emu.features.input.model // Must match the corresponding enum in input_common/main.h enum class InputType(val int: Int) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeAnalog.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NativeAnalog.kt similarity index 89% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeAnalog.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NativeAnalog.kt index cbddbadcc8..7d8cced220 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeAnalog.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NativeAnalog.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input.model +package dev.suyu.suyu_emu.features.input.model // Must match enum in src/common/settings_input.h enum class NativeAnalog(val int: Int) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeButton.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NativeButton.kt similarity index 93% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeButton.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NativeButton.kt index c290cea7ca..29ad0b7b97 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeButton.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NativeButton.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input.model +package dev.suyu.suyu_emu.features.input.model // Must match enum in src/common/settings_input.h enum class NativeButton(val int: Int) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeTrigger.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NativeTrigger.kt similarity index 85% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeTrigger.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NativeTrigger.kt index ac6583b28f..8ce026c19b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NativeTrigger.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NativeTrigger.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input.model +package dev.suyu.suyu_emu.features.input.model // Must match enum in src/common/settings_input.h enum class NativeTrigger(val int: Int) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NpadStyleIndex.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NpadStyleIndex.kt similarity index 91% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NpadStyleIndex.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NpadStyleIndex.kt index 7bad46d728..a884de8de3 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/NpadStyleIndex.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/NpadStyleIndex.kt @@ -2,10 +2,10 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input.model +package dev.suyu.suyu_emu.features.input.model import androidx.annotation.StringRes -import org.suyu.suyu_emu.R +import dev.suyu.suyu_emu.R // Must match enum in src/core/hid/hid_types.h enum class NpadStyleIndex(val int: Int, @StringRes val nameId: Int = 0) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/PlayerInput.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/PlayerInput.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/PlayerInput.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/PlayerInput.kt index 35e600dbd0..d6c9178984 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/input/model/PlayerInput.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/model/PlayerInput.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.input.model +package dev.suyu.suyu_emu.features.input.model import androidx.annotation.Keep diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt similarity index 83% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt index 8266e3dbd1..4066805d12 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractBooleanSetting.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model interface AbstractBooleanSetting : AbstractSetting { fun getBoolean(needsGlobal: Boolean = false): Boolean diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt similarity index 82% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt index 6ef8255341..d8cd03f295 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractByteSetting.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model interface AbstractByteSetting : AbstractSetting { fun getByte(needsGlobal: Boolean = false): Byte diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt similarity index 82% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt index 5437a65ade..bd95009db8 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractFloatSetting.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model interface AbstractFloatSetting : AbstractSetting { fun getFloat(needsGlobal: Boolean = false): Float diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt similarity index 82% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt index 1d979d153d..c9269cde37 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractIntSetting.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model interface AbstractIntSetting : AbstractSetting { fun getInt(needsGlobal: Boolean = false): Int diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt similarity index 82% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt index 22e94c10b8..b74a150c12 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractLongSetting.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model interface AbstractLongSetting : AbstractSetting { fun getLong(needsGlobal: Boolean = false): Long diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractSetting.kt similarity index 88% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractSetting.kt index f4cf067e65..41bbf62d46 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractSetting.kt @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.NativeConfig interface AbstractSetting { val key: String diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt similarity index 82% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt index 4488802269..e8c3bcf9ab 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractShortSetting.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model interface AbstractShortSetting : AbstractSetting { fun getShort(needsGlobal: Boolean = false): Short diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt similarity index 82% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt index 3afb1bc3a1..5820192b74 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/AbstractStringSetting.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model interface AbstractStringSetting : AbstractSetting { fun getString(needsGlobal: Boolean = false): String diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/BooleanSetting.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/BooleanSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/BooleanSetting.kt index 2e36e82b9a..2958f02ca1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/BooleanSetting.kt @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.NativeConfig enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { AUDIO_MUTED("audio_muted"), diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ByteSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/ByteSetting.kt similarity index 88% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ByteSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/ByteSetting.kt index 9a3f966697..fe6f84a0f6 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ByteSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/ByteSetting.kt @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.NativeConfig enum class ByteSetting(override val key: String) : AbstractByteSetting { AUDIO_VOLUME("volume"); diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/FloatSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/FloatSetting.kt similarity index 89% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/FloatSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/FloatSetting.kt index 6d266cb5c8..a6d744d68b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/FloatSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/FloatSetting.kt @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.NativeConfig enum class FloatSetting(override val key: String) : AbstractFloatSetting { // No float settings currently exist diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/IntSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/IntSetting.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/IntSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/IntSetting.kt index bf62df3c28..4e9f0a00c4 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/IntSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/IntSetting.kt @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.NativeConfig enum class IntSetting(override val key: String) : AbstractIntSetting { CPU_BACKEND("cpu_backend"), diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/LongSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/LongSetting.kt similarity index 88% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/LongSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/LongSetting.kt index 01f2e580ae..e6bc2116eb 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/LongSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/LongSetting.kt @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.NativeConfig enum class LongSetting(override val key: String) : AbstractLongSetting { CUSTOM_RTC("custom_rtc"); diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/Settings.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/Settings.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/Settings.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/Settings.kt index 2352c3824f..b4cfca4c77 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/Settings.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/Settings.kt @@ -1,10 +1,10 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication object Settings { enum class MenuTag(val titleId: Int = 0) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ShortSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/ShortSetting.kt similarity index 89% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ShortSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/ShortSetting.kt index 45614501c3..2525e6d63a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/ShortSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/ShortSetting.kt @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.NativeConfig enum class ShortSetting(override val key: String) : AbstractShortSetting { RENDERER_SPEED_LIMIT("speed_limit"); diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/StringSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/StringSetting.kt similarity index 89% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/StringSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/StringSetting.kt index 3f40fedcce..61a169ae8a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/StringSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/StringSetting.kt @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model +package dev.suyu.suyu_emu.features.settings.model -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.NativeConfig enum class StringSetting(override val key: String) : AbstractStringSetting { DRIVER_PATH("driver_path"), diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/AnalogInputSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/AnalogInputSetting.kt similarity index 72% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/AnalogInputSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/AnalogInputSetting.kt index 78103ba858..bea116f229 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/AnalogInputSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/AnalogInputSetting.kt @@ -2,14 +2,14 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.input.model.AnalogDirection -import org.suyu.suyu_emu.features.input.model.InputType -import org.suyu.suyu_emu.features.input.model.NativeAnalog -import org.suyu.suyu_emu.utils.ParamPackage +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.model.AnalogDirection +import dev.suyu.suyu_emu.features.input.model.InputType +import dev.suyu.suyu_emu.features.input.model.NativeAnalog +import dev.suyu.suyu_emu.utils.ParamPackage class AnalogInputSetting( override val playerIndex: Int, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/ButtonInputSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/ButtonInputSetting.kt similarity index 75% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/ButtonInputSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/ButtonInputSetting.kt index e586cedbb0..6279ef7b92 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/ButtonInputSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/ButtonInputSetting.kt @@ -2,13 +2,13 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.utils.ParamPackage -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.input.model.InputType -import org.suyu.suyu_emu.features.input.model.NativeButton +import dev.suyu.suyu_emu.utils.ParamPackage +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.model.InputType +import dev.suyu.suyu_emu.features.input.model.NativeButton class ButtonInputSetting( override val playerIndex: Int, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt similarity index 84% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt index 7ed6a721af..72fe741c0e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/DateTimeSetting.kt @@ -1,10 +1,10 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.features.settings.model.AbstractLongSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractLongSetting class DateTimeSetting( private val longSetting: AbstractLongSetting, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt similarity index 85% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt index da9b34e9be..df6bdfb129 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/HeaderSetting.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/InputProfileSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/InputProfileSetting.kt similarity index 85% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/InputProfileSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/InputProfileSetting.kt index 461588354a..708e0ae40f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/InputProfileSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/InputProfileSetting.kt @@ -2,11 +2,11 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.utils.NativeConfig class InputProfileSetting(private val playerIndex: Int) : SettingsItem(emptySetting, R.string.profile, "", 0, "") { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/InputSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/InputSetting.kt similarity index 93% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/InputSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/InputSetting.kt index ac54cda377..417e8f2655 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/InputSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/InputSetting.kt @@ -2,15 +2,15 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.input.model.ButtonName -import org.suyu.suyu_emu.features.input.model.InputType -import org.suyu.suyu_emu.utils.ParamPackage +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.model.ButtonName +import dev.suyu.suyu_emu.features.input.model.InputType +import dev.suyu.suyu_emu.utils.ParamPackage sealed class InputSetting( @StringRes titleId: Int, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt similarity index 90% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt index ba43799254..f61a60be15 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/IntSingleChoiceSetting.kt @@ -1,10 +1,10 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.features.settings.model.AbstractIntSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractIntSetting class IntSingleChoiceSetting( private val intSetting: AbstractIntSetting, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/ModifierInputSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/ModifierInputSetting.kt similarity index 78% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/ModifierInputSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/ModifierInputSetting.kt index 4d1e2c6699..611160286e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/ModifierInputSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/ModifierInputSetting.kt @@ -2,13 +2,13 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.input.model.InputType -import org.suyu.suyu_emu.features.input.model.NativeAnalog -import org.suyu.suyu_emu.utils.ParamPackage +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.model.InputType +import dev.suyu.suyu_emu.features.input.model.NativeAnalog +import dev.suyu.suyu_emu.utils.ParamPackage class ModifierInputSetting( override val playerIndex: Int, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt similarity index 91% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt index b48e0ee4d1..8a7f88ebb5 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/RunnableSetting.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.DrawableRes import androidx.annotation.StringRes diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt index f59f4ebf53..ea59f5ff63 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SettingsItem.kt @@ -1,23 +1,23 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.input.model.NpadStyleIndex -import org.suyu.suyu_emu.features.settings.model.AbstractBooleanSetting -import org.suyu.suyu_emu.features.settings.model.AbstractSetting -import org.suyu.suyu_emu.features.settings.model.BooleanSetting -import org.suyu.suyu_emu.features.settings.model.ByteSetting -import org.suyu.suyu_emu.features.settings.model.IntSetting -import org.suyu.suyu_emu.features.settings.model.LongSetting -import org.suyu.suyu_emu.features.settings.model.ShortSetting -import org.suyu.suyu_emu.features.settings.model.StringSetting -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.model.NpadStyleIndex +import dev.suyu.suyu_emu.features.settings.model.AbstractBooleanSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractSetting +import dev.suyu.suyu_emu.features.settings.model.BooleanSetting +import dev.suyu.suyu_emu.features.settings.model.ByteSetting +import dev.suyu.suyu_emu.features.settings.model.IntSetting +import dev.suyu.suyu_emu.features.settings.model.LongSetting +import dev.suyu.suyu_emu.features.settings.model.ShortSetting +import dev.suyu.suyu_emu.features.settings.model.StringSetting +import dev.suyu.suyu_emu.utils.NativeConfig /** * ViewModel abstraction for an Item in the RecyclerView powering SettingsFragments. diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt similarity index 82% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt index 4d0edda0ff..70fc58941f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SingleChoiceSetting.kt @@ -1,12 +1,12 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.ArrayRes import androidx.annotation.StringRes -import org.suyu.suyu_emu.features.settings.model.AbstractIntSetting -import org.suyu.suyu_emu.features.settings.model.AbstractSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractIntSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractSetting class SingleChoiceSetting( setting: AbstractSetting, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt similarity index 78% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt index 45471a64e8..1ad5caeb7e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SliderSetting.kt @@ -1,14 +1,14 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.features.settings.model.AbstractByteSetting -import org.suyu.suyu_emu.features.settings.model.AbstractFloatSetting -import org.suyu.suyu_emu.features.settings.model.AbstractIntSetting -import org.suyu.suyu_emu.features.settings.model.AbstractSetting -import org.suyu.suyu_emu.features.settings.model.AbstractShortSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractByteSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractFloatSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractIntSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractShortSetting import kotlin.math.roundToInt class SliderSetting( diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringInputSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/StringInputSetting.kt similarity index 86% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringInputSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/StringInputSetting.kt index f2dbeb2912..82c36b622d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringInputSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/StringInputSetting.kt @@ -2,10 +2,10 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.features.settings.model.AbstractStringSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractStringSetting class StringInputSetting( setting: AbstractStringSetting, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt similarity index 90% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt index 2a35a1b425..f3556eb415 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/StringSingleChoiceSetting.kt @@ -1,10 +1,10 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.features.settings.model.AbstractStringSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractStringSetting class StringSingleChoiceSetting( private val stringSetting: AbstractStringSetting, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt similarity index 82% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt index e381af10a3..c88a6014c1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SubmenuSetting.kt @@ -1,11 +1,11 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.DrawableRes import androidx.annotation.StringRes -import org.suyu.suyu_emu.features.settings.model.Settings +import dev.suyu.suyu_emu.features.settings.model.Settings class SubmenuSetting( @StringRes titleId: Int = 0, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt similarity index 79% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt index f7d4b73f91..afa83ccfc0 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/model/view/SwitchSetting.kt @@ -1,12 +1,12 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.model.view +package dev.suyu.suyu_emu.features.settings.model.view import androidx.annotation.StringRes -import org.suyu.suyu_emu.features.settings.model.AbstractBooleanSetting -import org.suyu.suyu_emu.features.settings.model.AbstractIntSetting -import org.suyu.suyu_emu.features.settings.model.AbstractSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractBooleanSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractIntSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractSetting class SwitchSetting( setting: AbstractSetting, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/InputDialogFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/InputDialogFragment.kt index af7767af51..904fdeef15 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/InputDialogFragment.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import android.app.Dialog import android.graphics.drawable.Animatable2 @@ -18,17 +18,17 @@ import android.view.ViewGroup import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.DialogMappingBinding -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.input.model.NativeAnalog -import org.suyu.suyu_emu.features.input.model.NativeButton -import org.suyu.suyu_emu.features.settings.model.view.AnalogInputSetting -import org.suyu.suyu_emu.features.settings.model.view.ButtonInputSetting -import org.suyu.suyu_emu.features.settings.model.view.InputSetting -import org.suyu.suyu_emu.features.settings.model.view.ModifierInputSetting -import org.suyu.suyu_emu.utils.InputHandler -import org.suyu.suyu_emu.utils.ParamPackage +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.DialogMappingBinding +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.model.NativeAnalog +import dev.suyu.suyu_emu.features.input.model.NativeButton +import dev.suyu.suyu_emu.features.settings.model.view.AnalogInputSetting +import dev.suyu.suyu_emu.features.settings.model.view.ButtonInputSetting +import dev.suyu.suyu_emu.features.settings.model.view.InputSetting +import dev.suyu.suyu_emu.features.settings.model.view.ModifierInputSetting +import dev.suyu.suyu_emu.utils.InputHandler +import dev.suyu.suyu_emu.utils.ParamPackage class InputDialogFragment : DialogFragment() { private var inputAccepted = false diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputProfileAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/InputProfileAdapter.kt similarity index 89% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputProfileAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/InputProfileAdapter.kt index 693cb77cbb..2b4dd0f98e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputProfileAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/InputProfileAdapter.kt @@ -2,16 +2,16 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.adapters.AbstractListAdapter -import org.suyu.suyu_emu.databinding.ListItemInputProfileBinding -import org.suyu.suyu_emu.viewholder.AbstractViewHolder -import org.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.adapters.AbstractListAdapter +import dev.suyu.suyu_emu.databinding.ListItemInputProfileBinding +import dev.suyu.suyu_emu.viewholder.AbstractViewHolder +import dev.suyu.suyu_emu.R class InputProfileAdapter(options: List) : AbstractListAdapter>(options) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputProfileDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/InputProfileDialogFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputProfileDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/InputProfileDialogFragment.kt index 55acee9eda..aa37d86817 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/InputProfileDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/InputProfileDialogFragment.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import android.app.Dialog import android.os.Bundle @@ -14,11 +14,11 @@ import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.DialogInputProfilesBinding -import org.suyu.suyu_emu.features.settings.model.view.InputProfileSetting -import org.suyu.suyu_emu.fragments.MessageDialogFragment -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.DialogInputProfilesBinding +import dev.suyu.suyu_emu.features.settings.model.view.InputProfileSetting +import dev.suyu.suyu_emu.fragments.MessageDialogFragment +import dev.suyu.suyu_emu.utils.collect class InputProfileDialogFragment : DialogFragment() { private var position = 0 diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/NewInputProfileDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/NewInputProfileDialogFragment.kt similarity index 93% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/NewInputProfileDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/NewInputProfileDialogFragment.kt index e683caf190..abf02cf804 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/NewInputProfileDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/NewInputProfileDialogFragment.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import android.app.Dialog import android.os.Bundle @@ -10,9 +10,9 @@ import android.widget.Toast import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.databinding.DialogEditTextBinding -import org.suyu.suyu_emu.features.settings.model.view.InputProfileSetting -import org.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.DialogEditTextBinding +import dev.suyu.suyu_emu.features.settings.model.view.InputProfileSetting +import dev.suyu.suyu_emu.R class NewInputProfileDialogFragment : DialogFragment() { private var position = 0 diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt similarity index 93% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt index aaa621a1da..aa33a4afd6 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsActivity.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import android.os.Bundle import android.view.View @@ -16,14 +16,14 @@ import androidx.core.view.WindowInsetsCompat import androidx.navigation.fragment.NavHostFragment import androidx.navigation.navArgs import com.google.android.material.color.MaterialColors -import org.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.NativeLibrary import java.io.IOException -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.ActivitySettingsBinding -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.settings.utils.SettingsFile -import org.suyu.suyu_emu.fragments.ResetSettingsDialogFragment -import org.suyu.suyu_emu.utils.* +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.ActivitySettingsBinding +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.settings.utils.SettingsFile +import dev.suyu.suyu_emu.fragments.ResetSettingsDialogFragment +import dev.suyu.suyu_emu.utils.* class SettingsActivity : AppCompatActivity() { private lateinit var binding: ActivitySettingsBinding diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt similarity index 95% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt index 6693e16096..e72eb6a67e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsAdapter.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import android.content.Context import android.icu.util.Calendar @@ -20,18 +20,18 @@ import androidx.recyclerview.widget.ListAdapter import com.google.android.material.datepicker.MaterialDatePicker import com.google.android.material.timepicker.MaterialTimePicker import com.google.android.material.timepicker.TimeFormat -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SettingsNavigationDirections -import org.suyu.suyu_emu.databinding.ListItemSettingBinding -import org.suyu.suyu_emu.databinding.ListItemSettingInputBinding -import org.suyu.suyu_emu.databinding.ListItemSettingSwitchBinding -import org.suyu.suyu_emu.databinding.ListItemSettingsHeaderBinding -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.input.model.AnalogDirection -import org.suyu.suyu_emu.features.settings.model.AbstractIntSetting -import org.suyu.suyu_emu.features.settings.model.view.* -import org.suyu.suyu_emu.features.settings.ui.viewholder.* -import org.suyu.suyu_emu.utils.ParamPackage +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SettingsNavigationDirections +import dev.suyu.suyu_emu.databinding.ListItemSettingBinding +import dev.suyu.suyu_emu.databinding.ListItemSettingInputBinding +import dev.suyu.suyu_emu.databinding.ListItemSettingSwitchBinding +import dev.suyu.suyu_emu.databinding.ListItemSettingsHeaderBinding +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.model.AnalogDirection +import dev.suyu.suyu_emu.features.settings.model.AbstractIntSetting +import dev.suyu.suyu_emu.features.settings.model.view.* +import dev.suyu.suyu_emu.features.settings.ui.viewholder.* +import dev.suyu.suyu_emu.utils.ParamPackage class SettingsAdapter( private val fragment: Fragment, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt index 8d22dc1d55..11b46e9338 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import android.app.Dialog import android.content.DialogInterface @@ -13,21 +13,21 @@ import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.slider.Slider -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.DialogEditTextBinding -import org.suyu.suyu_emu.databinding.DialogSliderBinding -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.input.model.AnalogDirection -import org.suyu.suyu_emu.features.settings.model.view.AnalogInputSetting -import org.suyu.suyu_emu.features.settings.model.view.ButtonInputSetting -import org.suyu.suyu_emu.features.settings.model.view.IntSingleChoiceSetting -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.model.view.SingleChoiceSetting -import org.suyu.suyu_emu.features.settings.model.view.SliderSetting -import org.suyu.suyu_emu.features.settings.model.view.StringInputSetting -import org.suyu.suyu_emu.features.settings.model.view.StringSingleChoiceSetting -import org.suyu.suyu_emu.utils.ParamPackage -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.DialogEditTextBinding +import dev.suyu.suyu_emu.databinding.DialogSliderBinding +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.model.AnalogDirection +import dev.suyu.suyu_emu.features.settings.model.view.AnalogInputSetting +import dev.suyu.suyu_emu.features.settings.model.view.ButtonInputSetting +import dev.suyu.suyu_emu.features.settings.model.view.IntSingleChoiceSetting +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.model.view.SingleChoiceSetting +import dev.suyu.suyu_emu.features.settings.model.view.SliderSetting +import dev.suyu.suyu_emu.features.settings.model.view.StringInputSetting +import dev.suyu.suyu_emu.features.settings.model.view.StringSingleChoiceSetting +import dev.suyu.suyu_emu.utils.ParamPackage +import dev.suyu.suyu_emu.utils.collect class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener { private var type = 0 diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt index 8e7896780a..4e53f925ac 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import android.annotation.SuppressLint import android.os.Bundle @@ -17,13 +17,13 @@ import androidx.navigation.findNavController import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.transition.MaterialSharedAxis -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.FragmentSettingsBinding -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.settings.model.Settings -import org.suyu.suyu_emu.fragments.MessageDialogFragment -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.FragmentSettingsBinding +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.settings.model.Settings +import dev.suyu.suyu_emu.fragments.MessageDialogFragment +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.utils.collect class SettingsFragment : Fragment() { private lateinit var presenter: SettingsFragmentPresenter diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt similarity index 96% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt index 876725a35e..0b22a5c063 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -1,32 +1,32 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import android.annotation.SuppressLint import android.os.Build import android.widget.Toast -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.input.model.AnalogDirection -import org.suyu.suyu_emu.features.input.model.NativeAnalog -import org.suyu.suyu_emu.features.input.model.NativeButton -import org.suyu.suyu_emu.features.input.model.NpadStyleIndex -import org.suyu.suyu_emu.features.settings.model.AbstractBooleanSetting -import org.suyu.suyu_emu.features.settings.model.AbstractIntSetting -import org.suyu.suyu_emu.features.settings.model.BooleanSetting -import org.suyu.suyu_emu.features.settings.model.ByteSetting -import org.suyu.suyu_emu.features.settings.model.IntSetting -import org.suyu.suyu_emu.features.settings.model.LongSetting -import org.suyu.suyu_emu.features.settings.model.Settings -import org.suyu.suyu_emu.features.settings.model.Settings.MenuTag -import org.suyu.suyu_emu.features.settings.model.ShortSetting -import org.suyu.suyu_emu.features.settings.model.StringSetting -import org.suyu.suyu_emu.features.settings.model.view.* -import org.suyu.suyu_emu.utils.InputHandler -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.model.AnalogDirection +import dev.suyu.suyu_emu.features.input.model.NativeAnalog +import dev.suyu.suyu_emu.features.input.model.NativeButton +import dev.suyu.suyu_emu.features.input.model.NpadStyleIndex +import dev.suyu.suyu_emu.features.settings.model.AbstractBooleanSetting +import dev.suyu.suyu_emu.features.settings.model.AbstractIntSetting +import dev.suyu.suyu_emu.features.settings.model.BooleanSetting +import dev.suyu.suyu_emu.features.settings.model.ByteSetting +import dev.suyu.suyu_emu.features.settings.model.IntSetting +import dev.suyu.suyu_emu.features.settings.model.LongSetting +import dev.suyu.suyu_emu.features.settings.model.Settings +import dev.suyu.suyu_emu.features.settings.model.Settings.MenuTag +import dev.suyu.suyu_emu.features.settings.model.ShortSetting +import dev.suyu.suyu_emu.features.settings.model.StringSetting +import dev.suyu.suyu_emu.features.settings.model.view.* +import dev.suyu.suyu_emu.utils.InputHandler +import dev.suyu.suyu_emu.utils.NativeConfig class SettingsFragmentPresenter( private val settingsViewModel: SettingsViewModel, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt index bab4765b5a..2cd10632bd 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsSearchFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import android.content.Context import android.os.Bundle @@ -19,13 +19,13 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.divider.MaterialDividerItemDecoration import com.google.android.material.transition.MaterialSharedAxis import info.debatty.java.stringsimilarity.Cosine -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.FragmentSettingsSearchBinding -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.utils.NativeConfig -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.FragmentSettingsSearchBinding +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.utils.collect class SettingsSearchFragment : Fragment() { private var _binding: FragmentSettingsSearchBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt index e99dec076d..7f2faa336f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/SettingsViewModel.kt @@ -1,18 +1,18 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui +package dev.suyu.suyu_emu.features.settings.ui import androidx.lifecycle.ViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.model.Game -import org.suyu.suyu_emu.utils.InputHandler -import org.suyu.suyu_emu.utils.ParamPackage +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.model.Game +import dev.suyu.suyu_emu.utils.InputHandler +import dev.suyu.suyu_emu.utils.ParamPackage class SettingsViewModel : ViewModel() { var game: Game? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt similarity index 82% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt index a996f044f9..1581fea850 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/DateTimeViewHolder.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View import java.time.Instant @@ -9,11 +9,11 @@ import java.time.ZoneId import java.time.ZonedDateTime import java.time.format.DateTimeFormatter import java.time.format.FormatStyle -import org.suyu.suyu_emu.databinding.ListItemSettingBinding -import org.suyu.suyu_emu.features.settings.model.view.DateTimeSetting -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.databinding.ListItemSettingBinding +import dev.suyu.suyu_emu.features.settings.model.view.DateTimeSetting +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible class DateTimeViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : SettingViewHolder(binding.root, adapter) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt similarity index 70% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt index 7b9c8303d4..8768a387dd 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/HeaderViewHolder.kt @@ -1,12 +1,12 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View -import org.suyu.suyu_emu.databinding.ListItemSettingsHeaderBinding -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.databinding.ListItemSettingsHeaderBinding +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter class HeaderViewHolder(val binding: ListItemSettingsHeaderBinding, adapter: SettingsAdapter) : SettingViewHolder(binding.root, adapter) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt similarity index 72% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt index 72c27b668a..ea5ea262cc 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/InputProfileViewHolder.kt @@ -2,15 +2,15 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View -import org.suyu.suyu_emu.databinding.ListItemSettingBinding -import org.suyu.suyu_emu.features.settings.model.view.InputProfileSetting -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.databinding.ListItemSettingBinding +import dev.suyu.suyu_emu.features.settings.model.view.InputProfileSetting +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible class InputProfileViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : SettingViewHolder(binding.root, adapter) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/InputViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/InputViewHolder.kt similarity index 76% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/InputViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/InputViewHolder.kt index d66e4e7581..9260a90c36 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/InputViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/InputViewHolder.kt @@ -2,18 +2,18 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View -import org.suyu.suyu_emu.databinding.ListItemSettingInputBinding -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.settings.model.view.AnalogInputSetting -import org.suyu.suyu_emu.features.settings.model.view.ButtonInputSetting -import org.suyu.suyu_emu.features.settings.model.view.InputSetting -import org.suyu.suyu_emu.features.settings.model.view.ModifierInputSetting -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.databinding.ListItemSettingInputBinding +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.settings.model.view.AnalogInputSetting +import dev.suyu.suyu_emu.features.settings.model.view.ButtonInputSetting +import dev.suyu.suyu_emu.features.settings.model.view.InputSetting +import dev.suyu.suyu_emu.features.settings.model.view.ModifierInputSetting +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible class InputViewHolder(val binding: ListItemSettingInputBinding, adapter: SettingsAdapter) : SettingViewHolder(binding.root, adapter) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt similarity index 79% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt index f210925fd2..886ea6adce 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/RunnableViewHolder.kt @@ -1,15 +1,15 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View import androidx.core.content.res.ResourcesCompat -import org.suyu.suyu_emu.databinding.ListItemSettingBinding -import org.suyu.suyu_emu.features.settings.model.view.RunnableSetting -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.databinding.ListItemSettingBinding +import dev.suyu.suyu_emu.features.settings.model.view.RunnableSetting +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible class RunnableViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : SettingViewHolder(binding.root, adapter) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt similarity index 84% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt index 93b0967462..c0d467ef92 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SettingViewHolder.kt @@ -1,14 +1,14 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View import androidx.recyclerview.widget.RecyclerView -import org.suyu.suyu_emu.databinding.ListItemSettingBinding -import org.suyu.suyu_emu.databinding.ListItemSettingSwitchBinding -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.databinding.ListItemSettingBinding +import dev.suyu.suyu_emu.databinding.ListItemSettingSwitchBinding +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter abstract class SettingViewHolder(itemView: View, protected val adapter: SettingsAdapter) : RecyclerView.ViewHolder(itemView), View.OnClickListener, View.OnLongClickListener { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt similarity index 85% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt index f8b891c94a..450424503e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.kt @@ -1,16 +1,16 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View -import org.suyu.suyu_emu.databinding.ListItemSettingBinding -import org.suyu.suyu_emu.features.settings.model.view.IntSingleChoiceSetting -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.model.view.SingleChoiceSetting -import org.suyu.suyu_emu.features.settings.model.view.StringSingleChoiceSetting -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.databinding.ListItemSettingBinding +import dev.suyu.suyu_emu.features.settings.model.view.IntSingleChoiceSetting +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.model.view.SingleChoiceSetting +import dev.suyu.suyu_emu.features.settings.model.view.StringSingleChoiceSetting +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible class SingleChoiceViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : SettingViewHolder(binding.root, adapter) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt similarity index 79% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt index 160dc33b75..3d9ef7caf7 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SliderViewHolder.kt @@ -1,15 +1,15 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.ListItemSettingBinding -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.model.view.SliderSetting -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.ListItemSettingBinding +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.model.view.SliderSetting +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible class SliderViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : SettingViewHolder(binding.root, adapter) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt similarity index 79% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt index 3acc7248cd..63ce59a84b 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt @@ -2,14 +2,14 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View -import org.suyu.suyu_emu.databinding.ListItemSettingBinding -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.model.view.StringInputSetting -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.databinding.ListItemSettingBinding +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.model.view.StringInputSetting +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible class StringInputViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : SettingViewHolder(binding.root, adapter) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt similarity index 78% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt index 3701f0f46e..38102d672e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SubmenuViewHolder.kt @@ -1,15 +1,15 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View import androidx.core.content.res.ResourcesCompat -import org.suyu.suyu_emu.databinding.ListItemSettingBinding -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.model.view.SubmenuSetting -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.databinding.ListItemSettingBinding +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.model.view.SubmenuSetting +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible class SubmenuViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : SettingViewHolder(binding.root, adapter) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt similarity index 81% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt index 93e50f381b..4b45251298 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/ui/viewholder/SwitchSettingViewHolder.kt @@ -1,15 +1,15 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.ui.viewholder +package dev.suyu.suyu_emu.features.settings.ui.viewholder import android.view.View import android.widget.CompoundButton -import org.suyu.suyu_emu.databinding.ListItemSettingSwitchBinding -import org.suyu.suyu_emu.features.settings.model.view.SettingsItem -import org.suyu.suyu_emu.features.settings.model.view.SwitchSetting -import org.suyu.suyu_emu.features.settings.ui.SettingsAdapter -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.databinding.ListItemSettingSwitchBinding +import dev.suyu.suyu_emu.features.settings.model.view.SettingsItem +import dev.suyu.suyu_emu.features.settings.model.view.SwitchSetting +import dev.suyu.suyu_emu.features.settings.ui.SettingsAdapter +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible class SwitchSettingViewHolder(val binding: ListItemSettingSwitchBinding, adapter: SettingsAdapter) : SettingViewHolder(binding.root, adapter) { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/utils/SettingsFile.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/utils/SettingsFile.kt similarity index 77% rename from src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/utils/SettingsFile.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/utils/SettingsFile.kt index 3c05c2c219..3532cdef87 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/features/settings/utils/SettingsFile.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/features/settings/utils/SettingsFile.kt @@ -1,14 +1,14 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.features.settings.utils +package dev.suyu.suyu_emu.features.settings.utils import android.net.Uri -import org.suyu.suyu_emu.model.Game +import dev.suyu.suyu_emu.model.Game import java.io.* -import org.suyu.suyu_emu.utils.DirectoryInitialization -import org.suyu.suyu_emu.utils.FileUtil -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.DirectoryInitialization +import dev.suyu.suyu_emu.utils.FileUtil +import dev.suyu.suyu_emu.utils.NativeConfig /** * Contains static methods for interacting with .ini files in which settings are stored. diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AboutFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AboutFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AboutFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AboutFragment.kt index 66b4fd5604..5902a997aa 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AboutFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AboutFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.content.ClipData import android.content.ClipboardManager @@ -21,11 +21,11 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.findNavController import com.google.android.material.transition.MaterialSharedAxis -import org.suyu.suyu_emu.BuildConfig -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.FragmentAboutBinding -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.BuildConfig +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.FragmentAboutBinding +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins class AboutFragment : Fragment() { private var _binding: FragmentAboutBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt similarity index 88% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt index bfc06a31c9..6e75e5d139 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AddGameFolderDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.content.DialogInterface @@ -10,11 +10,11 @@ import android.os.Bundle import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.DialogAddFolderBinding -import org.suyu.suyu_emu.model.GameDir -import org.suyu.suyu_emu.model.GamesViewModel -import org.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.DialogAddFolderBinding +import dev.suyu.suyu_emu.model.GameDir +import dev.suyu.suyu_emu.model.GamesViewModel +import dev.suyu.suyu_emu.model.HomeViewModel class AddGameFolderDialogFragment : DialogFragment() { private val homeViewModel: HomeViewModel by activityViewModels() diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddonsFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AddonsFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddonsFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AddonsFragment.kt index 825b0869de..7d2b9a2f27 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AddonsFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AddonsFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.content.Intent import android.os.Bundle @@ -19,16 +19,15 @@ import androidx.navigation.findNavController import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.transition.MaterialSharedAxis -import kotlinx.coroutines.launch -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.adapters.AddonAdapter -import org.suyu.suyu_emu.databinding.FragmentAddonsBinding -import org.suyu.suyu_emu.model.AddonViewModel -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.utils.AddonUtil -import org.suyu.suyu_emu.utils.FileUtil.copyFilesTo -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.adapters.AddonAdapter +import dev.suyu.suyu_emu.databinding.FragmentAddonsBinding +import dev.suyu.suyu_emu.model.AddonViewModel +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.utils.AddonUtil +import dev.suyu.suyu_emu.utils.FileUtil.copyFilesTo +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.utils.collect import java.io.File class AddonsFragment : Fragment() { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AppletLauncherFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AppletLauncherFragment.kt similarity index 91% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AppletLauncherFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AppletLauncherFragment.kt index 138e5074af..622ef144a0 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/AppletLauncherFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/AppletLauncherFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.os.Bundle import android.view.LayoutInflater @@ -15,13 +15,13 @@ import androidx.fragment.app.activityViewModels import androidx.navigation.findNavController import androidx.recyclerview.widget.GridLayoutManager import com.google.android.material.transition.MaterialSharedAxis -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.adapters.AppletAdapter -import org.suyu.suyu_emu.databinding.FragmentAppletLauncherBinding -import org.suyu.suyu_emu.model.Applet -import org.suyu.suyu_emu.model.AppletInfo -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.adapters.AppletAdapter +import dev.suyu.suyu_emu.databinding.FragmentAppletLauncherBinding +import dev.suyu.suyu_emu.model.Applet +import dev.suyu.suyu_emu.model.AppletInfo +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins class AppletLauncherFragment : Fragment() { private var _binding: FragmentAppletLauncherBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt similarity index 86% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt index dce2c8ca1f..8be5d21ea0 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/CabinetLauncherDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.os.Bundle @@ -11,9 +11,9 @@ import android.view.ViewGroup import androidx.fragment.app.DialogFragment import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.adapters.CabinetLauncherDialogAdapter -import org.suyu.suyu_emu.databinding.DialogListBinding +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.adapters.CabinetLauncherDialogAdapter +import dev.suyu.suyu_emu.databinding.DialogListBinding class CabinetLauncherDialogFragment : DialogFragment() { private lateinit var binding: DialogListBinding diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt index 5bbf751a3a..a11e058a73 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/ContentTypeSelectionDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.content.DialogInterface @@ -10,10 +10,10 @@ import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import androidx.preference.PreferenceManager import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.model.AddonViewModel -import org.suyu.suyu_emu.ui.main.MainActivity +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.model.AddonViewModel +import dev.suyu.suyu_emu.ui.main.MainActivity class ContentTypeSelectionDialogFragment : DialogFragment() { private val addonViewModel: AddonViewModel by activityViewModels() diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CoreErrorDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/CoreErrorDialogFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CoreErrorDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/CoreErrorDialogFragment.kt index 16f3e8b08f..bcba2b9750 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/CoreErrorDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/CoreErrorDialogFragment.kt @@ -2,15 +2,15 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.content.DialogInterface import android.os.Bundle import androidx.fragment.app.DialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R class CoreErrorDialogFragment : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriverManagerFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/DriverManagerFragment.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriverManagerFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/DriverManagerFragment.kt index 812037563b..1645400b41 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriverManagerFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/DriverManagerFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.os.Bundle import android.view.LayoutInflater @@ -18,20 +18,19 @@ import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.GridLayoutManager import com.google.android.material.transition.MaterialSharedAxis import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.adapters.DriverAdapter -import org.suyu.suyu_emu.databinding.FragmentDriverManagerBinding -import org.suyu.suyu_emu.features.settings.model.StringSetting -import org.suyu.suyu_emu.model.Driver.Companion.toDriver -import org.suyu.suyu_emu.model.DriverViewModel -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.utils.FileUtil -import org.suyu.suyu_emu.utils.GpuDriverHelper -import org.suyu.suyu_emu.utils.NativeConfig -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.adapters.DriverAdapter +import dev.suyu.suyu_emu.databinding.FragmentDriverManagerBinding +import dev.suyu.suyu_emu.features.settings.model.StringSetting +import dev.suyu.suyu_emu.model.Driver.Companion.toDriver +import dev.suyu.suyu_emu.model.DriverViewModel +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.utils.FileUtil +import dev.suyu.suyu_emu.utils.GpuDriverHelper +import dev.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.utils.collect import java.io.File import java.io.IOException diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt similarity index 87% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt index 993eb015d7..6f97d5a4eb 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/DriversLoadingDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.os.Bundle @@ -11,10 +11,10 @@ import android.view.ViewGroup import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.DialogProgressBarBinding -import org.suyu.suyu_emu.model.DriverViewModel -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.DialogProgressBarBinding +import dev.suyu.suyu_emu.model.DriverViewModel +import dev.suyu.suyu_emu.utils.collect class DriversLoadingDialogFragment : DialogFragment() { private val driverViewModel: DriverViewModel by activityViewModels() diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EarlyAccessFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/EarlyAccessFragment.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EarlyAccessFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/EarlyAccessFragment.kt index 7eebf77159..28215693b6 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EarlyAccessFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/EarlyAccessFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.content.Intent import android.net.Uri @@ -16,10 +16,10 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController import com.google.android.material.transition.MaterialSharedAxis -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.FragmentEarlyAccessBinding -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.FragmentEarlyAccessBinding +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins class EarlyAccessFragment : Fragment() { private var _binding: FragmentEarlyAccessBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/EmulationFragment.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EmulationFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/EmulationFragment.kt index 62fbcaf629..79a7078e53 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/EmulationFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.annotation.SuppressLint import android.app.AlertDialog @@ -39,25 +39,25 @@ import androidx.window.layout.WindowInfoTracker import androidx.window.layout.WindowLayoutInfo import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.slider.Slider -import org.suyu.suyu_emu.HomeNavigationDirections -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.activities.EmulationActivity -import org.suyu.suyu_emu.databinding.DialogOverlayAdjustBinding -import org.suyu.suyu_emu.databinding.FragmentEmulationBinding -import org.suyu.suyu_emu.features.settings.model.BooleanSetting -import org.suyu.suyu_emu.features.settings.model.IntSetting -import org.suyu.suyu_emu.features.settings.model.Settings -import org.suyu.suyu_emu.features.settings.model.Settings.EmulationOrientation -import org.suyu.suyu_emu.features.settings.model.Settings.EmulationVerticalAlignment -import org.suyu.suyu_emu.features.settings.utils.SettingsFile -import org.suyu.suyu_emu.model.DriverViewModel -import org.suyu.suyu_emu.model.Game -import org.suyu.suyu_emu.model.EmulationViewModel -import org.suyu.suyu_emu.overlay.model.OverlayControl -import org.suyu.suyu_emu.overlay.model.OverlayLayout -import org.suyu.suyu_emu.utils.* -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.HomeNavigationDirections +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.activities.EmulationActivity +import dev.suyu.suyu_emu.databinding.DialogOverlayAdjustBinding +import dev.suyu.suyu_emu.databinding.FragmentEmulationBinding +import dev.suyu.suyu_emu.features.settings.model.BooleanSetting +import dev.suyu.suyu_emu.features.settings.model.IntSetting +import dev.suyu.suyu_emu.features.settings.model.Settings +import dev.suyu.suyu_emu.features.settings.model.Settings.EmulationOrientation +import dev.suyu.suyu_emu.features.settings.model.Settings.EmulationVerticalAlignment +import dev.suyu.suyu_emu.features.settings.utils.SettingsFile +import dev.suyu.suyu_emu.model.DriverViewModel +import dev.suyu.suyu_emu.model.Game +import dev.suyu.suyu_emu.model.EmulationViewModel +import dev.suyu.suyu_emu.overlay.model.OverlayControl +import dev.suyu.suyu_emu.overlay.model.OverlayLayout +import dev.suyu.suyu_emu.utils.* +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible import java.lang.NullPointerException class EmulationFragment : Fragment(), SurfaceHolder.Callback { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt similarity index 88% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt index e65f0f5e6c..f40c4daaae 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GameFolderPropertiesDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.content.DialogInterface @@ -9,12 +9,12 @@ import android.os.Bundle import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.DialogFolderPropertiesBinding -import org.suyu.suyu_emu.model.GameDir -import org.suyu.suyu_emu.model.GamesViewModel -import org.suyu.suyu_emu.utils.NativeConfig -import org.suyu.suyu_emu.utils.SerializableHelper.parcelable +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.DialogFolderPropertiesBinding +import dev.suyu.suyu_emu.model.GameDir +import dev.suyu.suyu_emu.model.GamesViewModel +import dev.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.SerializableHelper.parcelable class GameFolderPropertiesDialogFragment : DialogFragment() { private val gamesViewModel: GamesViewModel by activityViewModels() diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFoldersFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GameFoldersFragment.kt similarity index 89% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFoldersFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GameFoldersFragment.kt index 7b9ccce0a1..198afc26a1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameFoldersFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GameFoldersFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.content.Intent import android.os.Bundle @@ -16,15 +16,14 @@ import androidx.fragment.app.activityViewModels import androidx.navigation.findNavController import androidx.recyclerview.widget.GridLayoutManager import com.google.android.material.transition.MaterialSharedAxis -import kotlinx.coroutines.launch -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.adapters.FolderAdapter -import org.suyu.suyu_emu.databinding.FragmentFoldersBinding -import org.suyu.suyu_emu.model.GamesViewModel -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.ui.main.MainActivity -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.adapters.FolderAdapter +import dev.suyu.suyu_emu.databinding.FragmentFoldersBinding +import dev.suyu.suyu_emu.model.GamesViewModel +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.ui.main.MainActivity +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.utils.collect class GameFoldersFragment : Fragment() { private var _binding: FragmentFoldersBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameInfoFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GameInfoFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameInfoFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GameInfoFragment.kt index 16901fead4..743389016f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GameInfoFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GameInfoFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.content.ClipData import android.content.ClipboardManager @@ -21,14 +21,14 @@ import androidx.fragment.app.activityViewModels import androidx.navigation.findNavController import androidx.navigation.fragment.navArgs import com.google.android.material.transition.MaterialSharedAxis -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.FragmentGameInfoBinding -import org.suyu.suyu_emu.model.GameVerificationResult -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.utils.GameMetadata -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.FragmentGameInfoBinding +import dev.suyu.suyu_emu.model.GameVerificationResult +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.utils.GameMetadata +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins class GameInfoFragment : Fragment() { private var _binding: FragmentGameInfoBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GamePropertiesFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GamePropertiesFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GamePropertiesFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GamePropertiesFragment.kt index e56b186d06..751aa29a3f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/GamePropertiesFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/GamePropertiesFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.content.pm.ShortcutInfo import android.content.pm.ShortcutManager @@ -24,27 +24,27 @@ import com.google.android.material.transition.MaterialSharedAxis import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.suyu.suyu_emu.HomeNavigationDirections -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.adapters.GamePropertiesAdapter -import org.suyu.suyu_emu.databinding.FragmentGamePropertiesBinding -import org.suyu.suyu_emu.features.settings.model.Settings -import org.suyu.suyu_emu.model.DriverViewModel -import org.suyu.suyu_emu.model.GameProperty -import org.suyu.suyu_emu.model.GamesViewModel -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.model.InstallableProperty -import org.suyu.suyu_emu.model.SubmenuProperty -import org.suyu.suyu_emu.model.TaskState -import org.suyu.suyu_emu.utils.DirectoryInitialization -import org.suyu.suyu_emu.utils.FileUtil -import org.suyu.suyu_emu.utils.GameIconUtils -import org.suyu.suyu_emu.utils.GpuDriverHelper -import org.suyu.suyu_emu.utils.MemoryUtil -import org.suyu.suyu_emu.utils.ViewUtils.marquee -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.HomeNavigationDirections +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.adapters.GamePropertiesAdapter +import dev.suyu.suyu_emu.databinding.FragmentGamePropertiesBinding +import dev.suyu.suyu_emu.features.settings.model.Settings +import dev.suyu.suyu_emu.model.DriverViewModel +import dev.suyu.suyu_emu.model.GameProperty +import dev.suyu.suyu_emu.model.GamesViewModel +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.model.InstallableProperty +import dev.suyu.suyu_emu.model.SubmenuProperty +import dev.suyu.suyu_emu.model.TaskState +import dev.suyu.suyu_emu.utils.DirectoryInitialization +import dev.suyu.suyu_emu.utils.FileUtil +import dev.suyu.suyu_emu.utils.GameIconUtils +import dev.suyu.suyu_emu.utils.GpuDriverHelper +import dev.suyu.suyu_emu.utils.MemoryUtil +import dev.suyu.suyu_emu.utils.ViewUtils.marquee +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.utils.collect import java.io.BufferedOutputStream import java.io.File diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/HomeSettingsFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/HomeSettingsFragment.kt similarity index 95% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/HomeSettingsFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/HomeSettingsFragment.kt index 790ca7a54b..6b80f7ee79 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/HomeSettingsFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/HomeSettingsFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.Manifest import android.content.ActivityNotFoundException @@ -27,23 +27,22 @@ import androidx.navigation.findNavController import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.GridLayoutManager import com.google.android.material.transition.MaterialSharedAxis -import org.suyu.suyu_emu.BuildConfig -import org.suyu.suyu_emu.HomeNavigationDirections -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.adapters.HomeSettingAdapter -import org.suyu.suyu_emu.databinding.FragmentHomeSettingsBinding -import org.suyu.suyu_emu.features.DocumentProvider -import org.suyu.suyu_emu.features.settings.model.Settings -import org.suyu.suyu_emu.model.DriverViewModel -import org.suyu.suyu_emu.model.HomeSetting -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.ui.main.MainActivity -import org.suyu.suyu_emu.utils.FileUtil -import org.suyu.suyu_emu.utils.GpuDriverHelper -import org.suyu.suyu_emu.utils.Log -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.HomeNavigationDirections +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.adapters.HomeSettingAdapter +import dev.suyu.suyu_emu.databinding.FragmentHomeSettingsBinding +import dev.suyu.suyu_emu.features.DocumentProvider +import dev.suyu.suyu_emu.features.settings.model.Settings +import dev.suyu.suyu_emu.model.DriverViewModel +import dev.suyu.suyu_emu.model.HomeSetting +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.ui.main.MainActivity +import dev.suyu.suyu_emu.utils.FileUtil +import dev.suyu.suyu_emu.utils.GpuDriverHelper +import dev.suyu.suyu_emu.utils.Log +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins class HomeSettingsFragment : Fragment() { private var _binding: FragmentHomeSettingsBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/InstallableFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/InstallableFragment.kt similarity index 95% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/InstallableFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/InstallableFragment.kt index 4a4dd11f4f..659811e33d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/InstallableFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/InstallableFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.os.Bundle import android.view.LayoutInflater @@ -18,21 +18,20 @@ import androidx.navigation.findNavController import androidx.recyclerview.widget.GridLayoutManager import com.google.android.material.transition.MaterialSharedAxis import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.adapters.InstallableAdapter -import org.suyu.suyu_emu.databinding.FragmentInstallablesBinding -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.model.Installable -import org.suyu.suyu_emu.model.TaskState -import org.suyu.suyu_emu.ui.main.MainActivity -import org.suyu.suyu_emu.utils.DirectoryInitialization -import org.suyu.suyu_emu.utils.FileUtil -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.adapters.InstallableAdapter +import dev.suyu.suyu_emu.databinding.FragmentInstallablesBinding +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.model.Installable +import dev.suyu.suyu_emu.model.TaskState +import dev.suyu.suyu_emu.ui.main.MainActivity +import dev.suyu.suyu_emu.utils.DirectoryInitialization +import dev.suyu.suyu_emu.utils.FileUtil +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.utils.collect import java.io.BufferedOutputStream import java.io.File import java.math.BigInteger diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt similarity index 90% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt index 4cc4f62407..bd78b3480c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/LaunchGameDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.content.DialogInterface @@ -9,10 +9,10 @@ import android.os.Bundle import androidx.fragment.app.DialogFragment import androidx.navigation.fragment.findNavController import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.HomeNavigationDirections -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.model.Game -import org.suyu.suyu_emu.utils.SerializableHelper.parcelable +import dev.suyu.suyu_emu.HomeNavigationDirections +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.model.Game +import dev.suyu.suyu_emu.utils.SerializableHelper.parcelable class LaunchGameDialogFragment : DialogFragment() { private var selectedItem = 1 diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt similarity index 90% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt index 76e34b62da..f473acb881 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/LicenseBottomSheetDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.os.Bundle import android.view.LayoutInflater @@ -9,9 +9,9 @@ import android.view.View import android.view.ViewGroup import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialogFragment -import org.suyu.suyu_emu.databinding.DialogLicenseBinding -import org.suyu.suyu_emu.model.License -import org.suyu.suyu_emu.utils.SerializableHelper.parcelable +import dev.suyu.suyu_emu.databinding.DialogLicenseBinding +import dev.suyu.suyu_emu.model.License +import dev.suyu.suyu_emu.utils.SerializableHelper.parcelable class LicenseBottomSheetDialogFragment : BottomSheetDialogFragment() { private var _binding: DialogLicenseBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicensesFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/LicensesFragment.kt similarity index 93% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicensesFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/LicensesFragment.kt index b5709d624e..71bdec1ea0 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/LicensesFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/LicensesFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.os.Bundle import android.view.LayoutInflater @@ -16,12 +16,12 @@ import androidx.fragment.app.activityViewModels import androidx.navigation.findNavController import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.transition.MaterialSharedAxis -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.adapters.LicenseAdapter -import org.suyu.suyu_emu.databinding.FragmentLicensesBinding -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.model.License -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.adapters.LicenseAdapter +import dev.suyu.suyu_emu.databinding.FragmentLicensesBinding +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.model.License +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins class LicensesFragment : Fragment() { private var _binding: FragmentLicensesBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/MessageDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/MessageDialogFragment.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/MessageDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/MessageDialogFragment.kt index ed80521354..75414251e1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/MessageDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/MessageDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.content.Intent @@ -13,9 +13,9 @@ import androidx.fragment.app.FragmentActivity import androidx.fragment.app.activityViewModels import androidx.lifecycle.ViewModelProvider import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.model.MessageDialogViewModel -import org.suyu.suyu_emu.utils.Log +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.model.MessageDialogViewModel +import dev.suyu.suyu_emu.utils.Log class MessageDialogFragment : DialogFragment() { private val messageDialogViewModel: MessageDialogViewModel by activityViewModels() diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt similarity index 95% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt index c384584b19..02e91db633 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/PermissionDeniedDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.content.DialogInterface @@ -11,7 +11,7 @@ import android.os.Bundle import android.provider.Settings import androidx.fragment.app.DialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R +import dev.suyu.suyu_emu.R class PermissionDeniedDialogFragment : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ProgressDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/ProgressDialogFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ProgressDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/ProgressDialogFragment.kt index c1221f383c..db6a7c4e82 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ProgressDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/ProgressDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.os.Bundle @@ -15,11 +15,11 @@ import androidx.fragment.app.FragmentActivity import androidx.fragment.app.activityViewModels import androidx.lifecycle.ViewModelProvider import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.DialogProgressBarBinding -import org.suyu.suyu_emu.model.TaskViewModel -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.DialogProgressBarBinding +import dev.suyu.suyu_emu.model.TaskViewModel +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.utils.collect class ProgressDialogFragment : DialogFragment() { private val taskViewModel: TaskViewModel by activityViewModels() diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt similarity index 88% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt index 24f9f6a10a..ff96b1f8d5 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/ResetSettingsDialogFragment.kt @@ -1,14 +1,14 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.os.Bundle import androidx.fragment.app.DialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.features.settings.ui.SettingsActivity +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.features.settings.ui.SettingsActivity class ResetSettingsDialogFragment : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SearchFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/SearchFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SearchFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/SearchFragment.kt index 54155bdc43..7216fc641e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SearchFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/SearchFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.content.Context import android.content.SharedPreferences @@ -21,16 +21,16 @@ import androidx.preference.PreferenceManager import info.debatty.java.stringsimilarity.Jaccard import info.debatty.java.stringsimilarity.JaroWinkler import java.util.Locale -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.adapters.GameAdapter -import org.suyu.suyu_emu.databinding.FragmentSearchBinding -import org.suyu.suyu_emu.layout.AutofitGridLayoutManager -import org.suyu.suyu_emu.model.Game -import org.suyu.suyu_emu.model.GamesViewModel -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.adapters.GameAdapter +import dev.suyu.suyu_emu.databinding.FragmentSearchBinding +import dev.suyu.suyu_emu.layout.AutofitGridLayoutManager +import dev.suyu.suyu_emu.model.Game +import dev.suyu.suyu_emu.model.GamesViewModel +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.utils.collect class SearchFragment : Fragment() { private var _binding: FragmentSearchBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/SetupFragment.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/SetupFragment.kt index fdbdb20b65..3c2ccf4bcd 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/SetupFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.Manifest import android.content.Intent @@ -26,24 +26,23 @@ import androidx.navigation.findNavController import androidx.preference.PreferenceManager import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback import com.google.android.material.transition.MaterialFadeThrough -import kotlinx.coroutines.launch -import org.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.NativeLibrary import java.io.File -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.adapters.SetupAdapter -import org.suyu.suyu_emu.databinding.FragmentSetupBinding -import org.suyu.suyu_emu.features.settings.model.Settings -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.model.SetupCallback -import org.suyu.suyu_emu.model.SetupPage -import org.suyu.suyu_emu.model.StepState -import org.suyu.suyu_emu.ui.main.MainActivity -import org.suyu.suyu_emu.utils.DirectoryInitialization -import org.suyu.suyu_emu.utils.NativeConfig -import org.suyu.suyu_emu.utils.ViewUtils -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.adapters.SetupAdapter +import dev.suyu.suyu_emu.databinding.FragmentSetupBinding +import dev.suyu.suyu_emu.features.settings.model.Settings +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.model.SetupCallback +import dev.suyu.suyu_emu.model.SetupPage +import dev.suyu.suyu_emu.model.StepState +import dev.suyu.suyu_emu.ui.main.MainActivity +import dev.suyu.suyu_emu.utils.DirectoryInitialization +import dev.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.utils.ViewUtils +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.utils.collect class SetupFragment : Fragment() { private var _binding: FragmentSetupBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt index a508ebfd33..70556f57a6 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/fragments/SetupWarningDialogFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.fragments +package dev.suyu.suyu_emu.fragments import android.app.Dialog import android.content.DialogInterface @@ -10,7 +10,7 @@ import android.net.Uri import android.os.Bundle import androidx.fragment.app.DialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder -import org.suyu.suyu_emu.R +import dev.suyu.suyu_emu.R class SetupWarningDialogFragment : DialogFragment() { private var titleId: Int = 0 diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt index 6d37cf4f8b..b5bad73c03 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/layout/AutofitGridLayoutManager.kt @@ -1,13 +1,13 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.layout +package dev.suyu.suyu_emu.layout import android.content.Context import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.Recycler -import org.suyu.suyu_emu.R +import dev.suyu.suyu_emu.R /** * Cut down version of the solution provided here diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/AddonViewModel.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/AddonViewModel.kt similarity index 96% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/AddonViewModel.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/AddonViewModel.kt index e67611631e..184668475c 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/AddonViewModel.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/AddonViewModel.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -10,8 +10,8 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.utils.NativeConfig import java.util.concurrent.atomic.AtomicBoolean class AddonViewModel : ViewModel() { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Applet.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/Applet.kt similarity index 96% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/Applet.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/Applet.kt index af22fd0bc4..37f50588df 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Applet.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/Applet.kt @@ -1,11 +1,11 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import androidx.annotation.DrawableRes import androidx.annotation.StringRes -import org.suyu.suyu_emu.R +import dev.suyu.suyu_emu.R data class Applet( @StringRes val titleId: Int, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Driver.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/Driver.kt similarity index 89% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/Driver.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/Driver.kt index cf1f72bcc1..a866ceb6b8 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Driver.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/Driver.kt @@ -2,9 +2,9 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model -import org.suyu.suyu_emu.utils.GpuDriverMetadata +import dev.suyu.suyu_emu.utils.GpuDriverMetadata data class Driver( override var selected: Boolean, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/DriverViewModel.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/DriverViewModel.kt similarity index 93% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/DriverViewModel.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/DriverViewModel.kt index 7009d453ae..7d4f59c493 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/DriverViewModel.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/DriverViewModel.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -14,14 +14,14 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.features.settings.model.StringSetting -import org.suyu.suyu_emu.features.settings.utils.SettingsFile -import org.suyu.suyu_emu.model.Driver.Companion.toDriver -import org.suyu.suyu_emu.utils.GpuDriverHelper -import org.suyu.suyu_emu.utils.GpuDriverMetadata -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.features.settings.model.StringSetting +import dev.suyu.suyu_emu.features.settings.utils.SettingsFile +import dev.suyu.suyu_emu.model.Driver.Companion.toDriver +import dev.suyu.suyu_emu.utils.GpuDriverHelper +import dev.suyu.suyu_emu.utils.GpuDriverMetadata +import dev.suyu.suyu_emu.utils.NativeConfig import java.io.File class DriverViewModel : ViewModel() { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/EmulationViewModel.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/EmulationViewModel.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/EmulationViewModel.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/EmulationViewModel.kt index 3d6e744e93..3a0124b8b0 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/EmulationViewModel.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/EmulationViewModel.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import androidx.lifecycle.ViewModel import kotlinx.coroutines.flow.MutableStateFlow diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Game.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/Game.kt similarity index 91% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/Game.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/Game.kt index 039ce3d302..b186df68ab 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Game.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/Game.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import android.content.Intent import android.net.Uri @@ -9,12 +9,12 @@ import android.os.Parcelable import java.util.HashSet import kotlinx.parcelize.Parcelize import kotlinx.serialization.Serializable -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.activities.EmulationActivity -import org.suyu.suyu_emu.utils.DirectoryInitialization -import org.suyu.suyu_emu.utils.FileUtil +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.activities.EmulationActivity +import dev.suyu.suyu_emu.utils.DirectoryInitialization +import dev.suyu.suyu_emu.utils.FileUtil import java.time.LocalDateTime import java.time.format.DateTimeFormatter diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameDir.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/GameDir.kt similarity index 89% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/GameDir.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/GameDir.kt index b3f7a8d14a..881b6c992e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameDir.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/GameDir.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import android.os.Parcelable import kotlinx.parcelize.Parcelize diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameProperties.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/GameProperties.kt similarity index 96% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/GameProperties.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/GameProperties.kt index abeee8f73b..c052f4aaae 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameProperties.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/GameProperties.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import androidx.annotation.DrawableRes import androidx.annotation.StringRes diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameVerificationResult.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/GameVerificationResult.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/GameVerificationResult.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/GameVerificationResult.kt index 61c6014469..4964e16209 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GameVerificationResult.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/GameVerificationResult.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model enum class GameVerificationResult(val int: Int) { Success(0), diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GamesViewModel.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/GamesViewModel.kt similarity index 96% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/GamesViewModel.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/GamesViewModel.kt index f5a1e55256..58105ae341 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/GamesViewModel.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/GamesViewModel.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import android.net.Uri import androidx.documentfile.provider.DocumentFile @@ -17,10 +17,10 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.utils.GameHelper -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.utils.GameHelper +import dev.suyu.suyu_emu.utils.NativeConfig import java.util.concurrent.atomic.AtomicBoolean class GamesViewModel : ViewModel() { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeSetting.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/HomeSetting.kt similarity index 93% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeSetting.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/HomeSetting.kt index 114e4a89ad..6097181df2 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeSetting.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/HomeSetting.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeViewModel.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/HomeViewModel.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeViewModel.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/HomeViewModel.kt index 6cfbb725c8..d0e9a44149 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/HomeViewModel.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/HomeViewModel.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import android.net.Uri import androidx.lifecycle.ViewModel diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/InstallResult.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/InstallResult.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/InstallResult.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/InstallResult.kt index 110da0f32b..40668f192d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/InstallResult.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/InstallResult.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model enum class InstallResult(val int: Int) { Success(0), diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Installable.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/Installable.kt similarity index 90% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/Installable.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/Installable.kt index 6b15d54afe..632121f191 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Installable.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/Installable.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import androidx.annotation.StringRes diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/License.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/License.kt similarity index 91% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/License.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/License.kt index 735b07ee65..e10a68f668 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/License.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/License.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import android.os.Parcelable import kotlinx.parcelize.Parcelize diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/MessageDialogViewModel.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/MessageDialogViewModel.kt similarity index 91% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/MessageDialogViewModel.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/MessageDialogViewModel.kt index 1f51bb3a06..02474352c5 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/MessageDialogViewModel.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/MessageDialogViewModel.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import androidx.lifecycle.ViewModel diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/MinimalDocumentFile.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/MinimalDocumentFile.kt similarity index 91% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/MinimalDocumentFile.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/MinimalDocumentFile.kt index 176c6f3b71..f6580c8e2a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/MinimalDocumentFile.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/MinimalDocumentFile.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import android.net.Uri import android.provider.DocumentsContract diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Patch.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/Patch.kt similarity index 90% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/Patch.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/Patch.kt index 6e9d09d1be..aa105c3401 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/Patch.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/Patch.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import androidx.annotation.Keep diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/PatchType.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/PatchType.kt similarity index 91% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/PatchType.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/PatchType.kt index 1880f876ec..b48cc843dd 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/PatchType.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/PatchType.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model enum class PatchType(val int: Int) { Update(0), diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/SelectableItem.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/SelectableItem.kt similarity index 89% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/SelectableItem.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/SelectableItem.kt index b8209e3f1d..a98315c653 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/SelectableItem.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/SelectableItem.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model interface SelectableItem { var selected: Boolean diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/SetupPage.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/SetupPage.kt similarity index 95% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/SetupPage.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/SetupPage.kt index 0316009d6c..4766b1870a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/SetupPage.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/SetupPage.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model data class SetupPage( val iconId: Int, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/model/TaskViewModel.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/TaskViewModel.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/model/TaskViewModel.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/model/TaskViewModel.kt index e4d635ff4f..b3f9daaf98 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/model/TaskViewModel.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/model/TaskViewModel.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.model +package dev.suyu.suyu_emu.model import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlay.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlay.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlay.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlay.kt index 76e33bef37..dd5d906b53 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlay.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlay.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.overlay +package dev.suyu.suyu_emu.overlay import android.app.Activity import android.content.Context @@ -24,17 +24,17 @@ import androidx.core.content.ContextCompat import androidx.window.layout.WindowMetricsCalculator import kotlin.math.max import kotlin.math.min -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.features.input.model.NativeAnalog -import org.suyu.suyu_emu.features.input.model.NativeButton -import org.suyu.suyu_emu.features.input.model.NpadStyleIndex -import org.suyu.suyu_emu.features.settings.model.BooleanSetting -import org.suyu.suyu_emu.features.settings.model.IntSetting -import org.suyu.suyu_emu.overlay.model.OverlayControl -import org.suyu.suyu_emu.overlay.model.OverlayControlData -import org.suyu.suyu_emu.overlay.model.OverlayLayout -import org.suyu.suyu_emu.utils.NativeConfig +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.features.input.model.NativeAnalog +import dev.suyu.suyu_emu.features.input.model.NativeButton +import dev.suyu.suyu_emu.features.input.model.NpadStyleIndex +import dev.suyu.suyu_emu.features.settings.model.BooleanSetting +import dev.suyu.suyu_emu.features.settings.model.IntSetting +import dev.suyu.suyu_emu.overlay.model.OverlayControl +import dev.suyu.suyu_emu.overlay.model.OverlayControlData +import dev.suyu.suyu_emu.overlay.model.OverlayLayout +import dev.suyu.suyu_emu.utils.NativeConfig /** * Draws the interactive input overlay on top of the diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt similarity index 95% rename from src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt index 0ba7205e58..3d94061bb5 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlayDrawableButton.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.overlay +package dev.suyu.suyu_emu.overlay import android.content.res.Resources import android.graphics.Bitmap @@ -9,9 +9,9 @@ import android.graphics.Canvas import android.graphics.Rect import android.graphics.drawable.BitmapDrawable import android.view.MotionEvent -import org.suyu.suyu_emu.features.input.NativeInput.ButtonState -import org.suyu.suyu_emu.features.input.model.NativeButton -import org.suyu.suyu_emu.overlay.model.OverlayControlData +import dev.suyu.suyu_emu.features.input.NativeInput.ButtonState +import dev.suyu.suyu_emu.features.input.model.NativeButton +import dev.suyu.suyu_emu.overlay.model.OverlayControlData /** * Custom [BitmapDrawable] that is capable diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt index 6f24f5c1da..35d1f70f5e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlayDrawableDpad.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.overlay +package dev.suyu.suyu_emu.overlay import android.content.res.Resources import android.graphics.Bitmap @@ -9,8 +9,8 @@ import android.graphics.Canvas import android.graphics.Rect import android.graphics.drawable.BitmapDrawable import android.view.MotionEvent -import org.suyu.suyu_emu.features.input.NativeInput.ButtonState -import org.suyu.suyu_emu.features.input.model.NativeButton +import dev.suyu.suyu_emu.features.input.NativeInput.ButtonState +import dev.suyu.suyu_emu.features.input.model.NativeButton /** * Custom [BitmapDrawable] that is capable diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt index e6f8b5d21a..8afa134ae4 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/InputOverlayDrawableJoystick.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.overlay +package dev.suyu.suyu_emu.overlay import android.content.res.Resources import android.graphics.Bitmap @@ -13,10 +13,10 @@ import kotlin.math.atan2 import kotlin.math.cos import kotlin.math.sin import kotlin.math.sqrt -import org.suyu.suyu_emu.features.input.NativeInput.ButtonState -import org.suyu.suyu_emu.features.input.model.NativeAnalog -import org.suyu.suyu_emu.features.input.model.NativeButton -import org.suyu.suyu_emu.features.settings.model.BooleanSetting +import dev.suyu.suyu_emu.features.input.NativeInput.ButtonState +import dev.suyu.suyu_emu.features.input.model.NativeAnalog +import dev.suyu.suyu_emu.features.input.model.NativeButton +import dev.suyu.suyu_emu.features.settings.model.BooleanSetting /** * Custom [BitmapDrawable] that is capable diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControl.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayControl.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControl.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayControl.kt index 605f63ff79..a9e32675e8 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControl.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayControl.kt @@ -1,11 +1,11 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.overlay.model +package dev.suyu.suyu_emu.overlay.model import androidx.annotation.IntegerRes -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication enum class OverlayControl( val id: String, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlData.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayControlData.kt similarity index 93% rename from src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlData.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayControlData.kt index 7559bcfe2d..2a4267da2e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlData.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayControlData.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.overlay.model +package dev.suyu.suyu_emu.overlay.model data class OverlayControlData( val id: String, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt similarity index 90% rename from src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt index 0df2e4ff8b..74ca6edec4 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayControlDefault.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.overlay.model +package dev.suyu.suyu_emu.overlay.model import androidx.annotation.IntegerRes diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayLayout.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayLayout.kt similarity index 84% rename from src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayLayout.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayLayout.kt index 1eb0105352..f8595593d9 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/overlay/model/OverlayLayout.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/overlay/model/OverlayLayout.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.overlay.model +package dev.suyu.suyu_emu.overlay.model enum class OverlayLayout(val id: String) { Landscape("Landscape"), diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/GamesFragment.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/ui/GamesFragment.kt similarity index 92% rename from src/android/app/src/main/java/org/suyu/suyu_emu/ui/GamesFragment.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/ui/GamesFragment.kt index b37aa23850..39b1ef8b77 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/GamesFragment.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/ui/GamesFragment.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.ui +package dev.suyu.suyu_emu.ui import android.os.Bundle import android.view.LayoutInflater @@ -14,15 +14,15 @@ import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import com.google.android.material.color.MaterialColors -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.adapters.GameAdapter -import org.suyu.suyu_emu.databinding.FragmentGamesBinding -import org.suyu.suyu_emu.layout.AutofitGridLayoutManager -import org.suyu.suyu_emu.model.GamesViewModel -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.utils.ViewUtils.setVisible -import org.suyu.suyu_emu.utils.ViewUtils.updateMargins -import org.suyu.suyu_emu.utils.collect +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.adapters.GameAdapter +import dev.suyu.suyu_emu.databinding.FragmentGamesBinding +import dev.suyu.suyu_emu.layout.AutofitGridLayoutManager +import dev.suyu.suyu_emu.model.GamesViewModel +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.utils.ViewUtils.updateMargins +import dev.suyu.suyu_emu.utils.collect class GamesFragment : Fragment() { private var _binding: FragmentGamesBinding? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/MainActivity.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/ui/main/MainActivity.kt similarity index 96% rename from src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/MainActivity.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/ui/main/MainActivity.kt index ea5ba39a32..c994a3510d 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/MainActivity.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/ui/main/MainActivity.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.ui.main +package dev.suyu.suyu_emu.ui.main import android.content.Intent import android.net.Uri @@ -27,23 +27,23 @@ import com.google.android.material.color.MaterialColors import com.google.android.material.navigation.NavigationBarView import java.io.File import java.io.FilenameFilter -import org.suyu.suyu_emu.HomeNavigationDirections -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.databinding.ActivityMainBinding -import org.suyu.suyu_emu.features.settings.model.Settings -import org.suyu.suyu_emu.fragments.AddGameFolderDialogFragment -import org.suyu.suyu_emu.fragments.ProgressDialogFragment -import org.suyu.suyu_emu.fragments.MessageDialogFragment -import org.suyu.suyu_emu.model.AddonViewModel -import org.suyu.suyu_emu.model.DriverViewModel -import org.suyu.suyu_emu.model.GamesViewModel -import org.suyu.suyu_emu.model.HomeViewModel -import org.suyu.suyu_emu.model.InstallResult -import org.suyu.suyu_emu.model.TaskState -import org.suyu.suyu_emu.model.TaskViewModel -import org.suyu.suyu_emu.utils.* -import org.suyu.suyu_emu.utils.ViewUtils.setVisible +import dev.suyu.suyu_emu.HomeNavigationDirections +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.databinding.ActivityMainBinding +import dev.suyu.suyu_emu.features.settings.model.Settings +import dev.suyu.suyu_emu.fragments.AddGameFolderDialogFragment +import dev.suyu.suyu_emu.fragments.ProgressDialogFragment +import dev.suyu.suyu_emu.fragments.MessageDialogFragment +import dev.suyu.suyu_emu.model.AddonViewModel +import dev.suyu.suyu_emu.model.DriverViewModel +import dev.suyu.suyu_emu.model.GamesViewModel +import dev.suyu.suyu_emu.model.HomeViewModel +import dev.suyu.suyu_emu.model.InstallResult +import dev.suyu.suyu_emu.model.TaskState +import dev.suyu.suyu_emu.model.TaskViewModel +import dev.suyu.suyu_emu.utils.* +import dev.suyu.suyu_emu.utils.ViewUtils.setVisible import java.io.BufferedInputStream import java.io.BufferedOutputStream import java.util.zip.ZipEntry diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/ThemeProvider.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/ui/main/ThemeProvider.kt similarity index 88% rename from src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/ThemeProvider.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/ui/main/ThemeProvider.kt index 3ba6c5cd16..c9c7f87636 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/ui/main/ThemeProvider.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/ui/main/ThemeProvider.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.ui.main +package dev.suyu.suyu_emu.ui.main interface ThemeProvider { /** diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/AddonUtil.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/AddonUtil.kt similarity index 85% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/AddonUtil.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/AddonUtil.kt index adc4228bc0..c1d93ba585 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/AddonUtil.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/AddonUtil.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils object AddonUtil { val validAddonDirectories = listOf("cheats", "exefs", "romfs") diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DirectoryInitialization.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/DirectoryInitialization.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/DirectoryInitialization.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/DirectoryInitialization.kt index 451757fea3..dd0257a0e5 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DirectoryInitialization.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/DirectoryInitialization.kt @@ -1,19 +1,19 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import androidx.preference.PreferenceManager import java.io.IOException -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.features.settings.model.BooleanSetting -import org.suyu.suyu_emu.features.settings.model.IntSetting -import org.suyu.suyu_emu.features.settings.model.Settings -import org.suyu.suyu_emu.overlay.model.OverlayControlData -import org.suyu.suyu_emu.overlay.model.OverlayControl -import org.suyu.suyu_emu.overlay.model.OverlayLayout -import org.suyu.suyu_emu.utils.PreferenceUtil.migratePreference +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.features.settings.model.BooleanSetting +import dev.suyu.suyu_emu.features.settings.model.IntSetting +import dev.suyu.suyu_emu.features.settings.model.Settings +import dev.suyu.suyu_emu.overlay.model.OverlayControlData +import dev.suyu.suyu_emu.overlay.model.OverlayControl +import dev.suyu.suyu_emu.overlay.model.OverlayLayout +import dev.suyu.suyu_emu.utils.PreferenceUtil.migratePreference object DirectoryInitialization { private var userPath: String? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DocumentsTree.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/DocumentsTree.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/DocumentsTree.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/DocumentsTree.kt index 8269cbc238..fab217f538 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/DocumentsTree.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/DocumentsTree.kt @@ -1,13 +1,13 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.net.Uri import androidx.documentfile.provider.DocumentFile import java.io.File import java.util.* -import org.suyu.suyu_emu.model.MinimalDocumentFile +import dev.suyu.suyu_emu.model.MinimalDocumentFile class DocumentsTree { private var root: DocumentsNode? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/FileUtil.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/FileUtil.kt similarity index 99% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/FileUtil.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/FileUtil.kt index 61a40992a8..8f10ab6711 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/FileUtil.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/FileUtil.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.database.Cursor import android.net.Uri @@ -14,9 +14,9 @@ import java.io.InputStream import java.net.URLDecoder import java.util.zip.ZipEntry import java.util.zip.ZipInputStream -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.model.MinimalDocumentFile -import org.suyu.suyu_emu.model.TaskState +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.model.MinimalDocumentFile +import dev.suyu.suyu_emu.model.TaskState import java.io.BufferedOutputStream import java.io.OutputStream import java.lang.NullPointerException diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameHelper.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GameHelper.kt similarity index 95% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameHelper.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GameHelper.kt index 4800c5cb4e..a413a44cd8 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameHelper.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GameHelper.kt @@ -1,18 +1,18 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.content.SharedPreferences import android.net.Uri import androidx.preference.PreferenceManager import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.model.Game -import org.suyu.suyu_emu.model.GameDir -import org.suyu.suyu_emu.model.MinimalDocumentFile +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.model.Game +import dev.suyu.suyu_emu.model.GameDir +import dev.suyu.suyu_emu.model.MinimalDocumentFile object GameHelper { private const val KEY_OLD_GAME_PATH = "game_path" diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameIconUtils.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GameIconUtils.kt similarity index 96% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameIconUtils.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GameIconUtils.kt index 692030c218..f941e9eb60 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameIconUtils.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GameIconUtils.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.graphics.Bitmap import android.graphics.BitmapFactory @@ -21,9 +21,9 @@ import coil.key.Keyer import coil.memory.MemoryCache import coil.request.ImageRequest import coil.request.Options -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.model.Game +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.model.Game class GameIconFetcher( private val game: Game, diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameMetadata.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GameMetadata.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameMetadata.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GameMetadata.kt index d8f278e902..9847f81cc1 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GameMetadata.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GameMetadata.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils object GameMetadata { external fun getIsValid(path: String): Boolean diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverHelper.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GpuDriverHelper.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverHelper.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GpuDriverHelper.kt index 28486d32de..2d7bc81553 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverHelper.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GpuDriverHelper.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.graphics.SurfaceTexture import android.net.Uri @@ -9,9 +9,9 @@ import android.os.Build import android.view.Surface import java.io.File import java.io.IOException -import org.suyu.suyu_emu.NativeLibrary -import org.suyu.suyu_emu.SuyuApplication -import org.suyu.suyu_emu.features.settings.model.StringSetting +import dev.suyu.suyu_emu.NativeLibrary +import dev.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.features.settings.model.StringSetting import java.io.FileNotFoundException import java.util.zip.ZipException import java.util.zip.ZipFile diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverMetadata.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GpuDriverMetadata.kt similarity index 99% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverMetadata.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GpuDriverMetadata.kt index c12e49d2cd..5b992ef1ce 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/GpuDriverMetadata.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/GpuDriverMetadata.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import java.io.IOException import org.json.JSONException diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InputHandler.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/InputHandler.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/InputHandler.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/InputHandler.kt index 90afcea9aa..394f6b8e24 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InputHandler.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/InputHandler.kt @@ -1,14 +1,14 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.view.InputDevice import android.view.KeyEvent import android.view.MotionEvent -import org.suyu.suyu_emu.features.input.NativeInput -import org.suyu.suyu_emu.features.input.SuyuInputOverlayDevice -import org.suyu.suyu_emu.features.input.SuyuPhysicalDevice +import dev.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.SuyuInputOverlayDevice +import dev.suyu.suyu_emu.features.input.SuyuPhysicalDevice object InputHandler { var androidControllers = mapOf() diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InsetsHelper.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/InsetsHelper.kt similarity index 95% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/InsetsHelper.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/InsetsHelper.kt index d5621f42cc..e2eb325742 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/InsetsHelper.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/InsetsHelper.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.annotation.SuppressLint import android.content.Context diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/LifecycleUtils.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/LifecycleUtils.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/LifecycleUtils.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/LifecycleUtils.kt index e1b73c11d6..4cb1910f67 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/LifecycleUtils.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/LifecycleUtils.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/Log.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/Log.kt similarity index 96% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/Log.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/Log.kt index 794f03629d..703f17361e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/Log.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/Log.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.os.Build diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/MemoryUtil.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/MemoryUtil.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/MemoryUtil.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/MemoryUtil.kt index 3617b0dc54..abc08c7d4e 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/MemoryUtil.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/MemoryUtil.kt @@ -1,13 +1,13 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.app.ActivityManager import android.content.Context import android.os.Build -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.SuyuApplication +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.SuyuApplication import java.util.Locale import kotlin.math.ceil diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NativeConfig.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/NativeConfig.kt similarity index 96% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/NativeConfig.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/NativeConfig.kt index 248b02515c..fac09e9e16 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NativeConfig.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/NativeConfig.kt @@ -1,12 +1,12 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils -import org.suyu.suyu_emu.model.GameDir -import org.suyu.suyu_emu.overlay.model.OverlayControlData +import dev.suyu.suyu_emu.model.GameDir +import dev.suyu.suyu_emu.overlay.model.OverlayControlData -import org.suyu.suyu_emu.features.input.model.PlayerInput +import dev.suyu.suyu_emu.features.input.model.PlayerInput object NativeConfig { /** diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NfcReader.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/NfcReader.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/NfcReader.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/NfcReader.kt index 2a8045202c..b32f246498 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/NfcReader.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/NfcReader.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.app.Activity import android.app.PendingIntent @@ -14,7 +14,7 @@ import android.os.Build import android.os.Handler import android.os.Looper import java.io.IOException -import org.suyu.suyu_emu.features.input.NativeInput +import dev.suyu.suyu_emu.features.input.NativeInput class NfcReader(private val activity: Activity) { private var nfcAdapter: NfcAdapter? = null diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ParamPackage.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/ParamPackage.kt similarity index 99% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/ParamPackage.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/ParamPackage.kt index 98a906c8e3..30ff051910 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ParamPackage.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/ParamPackage.kt @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils // Kotlin version of src/common/param_package.h class ParamPackage(serialized: String = "") { diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/PreferenceUtil.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/PreferenceUtil.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/PreferenceUtil.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/PreferenceUtil.kt index ad8fd59211..1c16b3b401 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/PreferenceUtil.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/PreferenceUtil.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.content.SharedPreferences diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/SerializableHelper.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/SerializableHelper.kt similarity index 97% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/SerializableHelper.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/SerializableHelper.kt index 71438c2866..d75a47beea 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/SerializableHelper.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/SerializableHelper.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.content.Intent import android.os.Build diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ThemeHelper.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/ThemeHelper.kt similarity index 94% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/ThemeHelper.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/ThemeHelper.kt index 2c0b3ea2ed..eaff5893c5 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ThemeHelper.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/ThemeHelper.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.content.res.Configuration import android.graphics.Color @@ -12,10 +12,10 @@ import androidx.appcompat.app.AppCompatDelegate import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsControllerCompat import kotlin.math.roundToInt -import org.suyu.suyu_emu.R -import org.suyu.suyu_emu.features.settings.model.BooleanSetting -import org.suyu.suyu_emu.features.settings.model.IntSetting -import org.suyu.suyu_emu.ui.main.ThemeProvider +import dev.suyu.suyu_emu.R +import dev.suyu.suyu_emu.features.settings.model.BooleanSetting +import dev.suyu.suyu_emu.features.settings.model.IntSetting +import dev.suyu.suyu_emu.ui.main.ThemeProvider object ThemeHelper { const val SYSTEM_BAR_ALPHA = 0.9f diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ViewUtils.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/ViewUtils.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/utils/ViewUtils.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/utils/ViewUtils.kt index b81e146673..94bf0d890f 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/utils/ViewUtils.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/utils/ViewUtils.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.utils +package dev.suyu.suyu_emu.utils import android.text.TextUtils import android.view.View diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/viewholder/AbstractViewHolder.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/viewholder/AbstractViewHolder.kt similarity index 80% rename from src/android/app/src/main/java/org/suyu/suyu_emu/viewholder/AbstractViewHolder.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/viewholder/AbstractViewHolder.kt index ee149eae7d..c1991d609a 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/viewholder/AbstractViewHolder.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/viewholder/AbstractViewHolder.kt @@ -2,12 +2,12 @@ // SPDX-FileCopyrightText: 2024 suyu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.viewholder +package dev.suyu.suyu_emu.viewholder import androidx.recyclerview.widget.RecyclerView import androidx.viewbinding.ViewBinding -import org.suyu.suyu_emu.adapters.AbstractDiffAdapter -import org.suyu.suyu_emu.adapters.AbstractListAdapter +import dev.suyu.suyu_emu.adapters.AbstractDiffAdapter +import dev.suyu.suyu_emu.adapters.AbstractListAdapter /** * [RecyclerView.ViewHolder] meant to work together with a [AbstractDiffAdapter] or a diff --git a/src/android/app/src/main/java/org/suyu/suyu_emu/views/FixedRatioSurfaceView.kt b/src/android/app/src/main/java/dev/suyu/suyu_emu/views/FixedRatioSurfaceView.kt similarity index 98% rename from src/android/app/src/main/java/org/suyu/suyu_emu/views/FixedRatioSurfaceView.kt rename to src/android/app/src/main/java/dev/suyu/suyu_emu/views/FixedRatioSurfaceView.kt index 7d4708ce12..181ddca032 100644 --- a/src/android/app/src/main/java/org/suyu/suyu_emu/views/FixedRatioSurfaceView.kt +++ b/src/android/app/src/main/java/dev/suyu/suyu_emu/views/FixedRatioSurfaceView.kt @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -package org.suyu.suyu_emu.views +package dev.suyu.suyu_emu.views import android.content.Context import android.util.AttributeSet diff --git a/src/android/app/src/main/jni/game_metadata.cpp b/src/android/app/src/main/jni/game_metadata.cpp index 489f862978..52d29ce3ff 100644 --- a/src/android/app/src/main/jni/game_metadata.cpp +++ b/src/android/app/src/main/jni/game_metadata.cpp @@ -75,7 +75,7 @@ RomMetadata GetRomMetadata(const std::string& path, bool reload = false) { extern "C" { -jboolean Java_org_suyu_suyu_1emu_utils_GameMetadata_getIsValid(JNIEnv* env, jobject obj, +jboolean Java_dev_suyu_suyu_1emu_utils_GameMetadata_getIsValid(JNIEnv* env, jobject obj, jstring jpath) { const auto file = EmulationSession::GetInstance().System().GetFilesystem()->OpenFile( Common::Android::GetJString(env, jpath), FileSys::OpenMode::Read); @@ -101,31 +101,31 @@ jboolean Java_org_suyu_suyu_1emu_utils_GameMetadata_getIsValid(JNIEnv* env, jobj return true; } -jstring Java_org_suyu_suyu_1emu_utils_GameMetadata_getTitle(JNIEnv* env, jobject obj, +jstring Java_dev_suyu_suyu_1emu_utils_GameMetadata_getTitle(JNIEnv* env, jobject obj, jstring jpath) { return Common::Android::ToJString( env, GetRomMetadata(Common::Android::GetJString(env, jpath)).title); } -jstring Java_org_suyu_suyu_1emu_utils_GameMetadata_getProgramId(JNIEnv* env, jobject obj, +jstring Java_dev_suyu_suyu_1emu_utils_GameMetadata_getProgramId(JNIEnv* env, jobject obj, jstring jpath) { return Common::Android::ToJString( env, std::to_string(GetRomMetadata(Common::Android::GetJString(env, jpath)).programId)); } -jstring Java_org_suyu_suyu_1emu_utils_GameMetadata_getDeveloper(JNIEnv* env, jobject obj, +jstring Java_dev_suyu_suyu_1emu_utils_GameMetadata_getDeveloper(JNIEnv* env, jobject obj, jstring jpath) { return Common::Android::ToJString( env, GetRomMetadata(Common::Android::GetJString(env, jpath)).developer); } -jstring Java_org_suyu_suyu_1emu_utils_GameMetadata_getVersion(JNIEnv* env, jobject obj, +jstring Java_dev_suyu_suyu_1emu_utils_GameMetadata_getVersion(JNIEnv* env, jobject obj, jstring jpath, jboolean jreload) { return Common::Android::ToJString( env, GetRomMetadata(Common::Android::GetJString(env, jpath), jreload).version); } -jbyteArray Java_org_suyu_suyu_1emu_utils_GameMetadata_getIcon(JNIEnv* env, jobject obj, +jbyteArray Java_dev_suyu_suyu_1emu_utils_GameMetadata_getIcon(JNIEnv* env, jobject obj, jstring jpath) { auto icon_data = GetRomMetadata(Common::Android::GetJString(env, jpath)).icon; jbyteArray icon = env->NewByteArray(static_cast(icon_data.size())); @@ -134,13 +134,13 @@ jbyteArray Java_org_suyu_suyu_1emu_utils_GameMetadata_getIcon(JNIEnv* env, jobje return icon; } -jboolean Java_org_suyu_suyu_1emu_utils_GameMetadata_getIsHomebrew(JNIEnv* env, jobject obj, +jboolean Java_dev_suyu_suyu_1emu_utils_GameMetadata_getIsHomebrew(JNIEnv* env, jobject obj, jstring jpath) { return static_cast( GetRomMetadata(Common::Android::GetJString(env, jpath)).isHomebrew); } -void Java_org_suyu_suyu_1emu_utils_GameMetadata_resetMetadata(JNIEnv* env, jobject obj) { +void Java_dev_suyu_suyu_1emu_utils_GameMetadata_resetMetadata(JNIEnv* env, jobject obj) { m_rom_metadata_cache.clear(); } diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index 35ca93a78d..be8e36dbe3 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -435,24 +435,24 @@ static Core::SystemResultStatus RunEmulation(const std::string& filepath, extern "C" { -void Java_org_suyu_suyu_1emu_NativeLibrary_surfaceChanged(JNIEnv* env, jobject instance, +void Java_dev_suyu_suyu_1emu_NativeLibrary_surfaceChanged(JNIEnv* env, jobject instance, [[maybe_unused]] jobject surf) { EmulationSession::GetInstance().SetNativeWindow(ANativeWindow_fromSurface(env, surf)); EmulationSession::GetInstance().SurfaceChanged(); } -void Java_org_suyu_suyu_1emu_NativeLibrary_surfaceDestroyed(JNIEnv* env, jobject instance) { +void Java_dev_suyu_suyu_1emu_NativeLibrary_surfaceDestroyed(JNIEnv* env, jobject instance) { ANativeWindow_release(EmulationSession::GetInstance().NativeWindow()); EmulationSession::GetInstance().SetNativeWindow(nullptr); EmulationSession::GetInstance().SurfaceChanged(); } -void Java_org_suyu_suyu_1emu_NativeLibrary_setAppDirectory(JNIEnv* env, jobject instance, +void Java_dev_suyu_suyu_1emu_NativeLibrary_setAppDirectory(JNIEnv* env, jobject instance, [[maybe_unused]] jstring j_directory) { Common::FS::SetAppDirectory(Common::Android::GetJString(env, j_directory)); } -int Java_org_suyu_suyu_1emu_NativeLibrary_installFileToNand(JNIEnv* env, jobject instance, +int Java_dev_suyu_suyu_1emu_NativeLibrary_installFileToNand(JNIEnv* env, jobject instance, jstring j_file, jobject jcallback) { auto jlambdaClass = env->GetObjectClass(jcallback); auto jlambdaInvokeMethod = env->GetMethodID( @@ -470,7 +470,7 @@ int Java_org_suyu_suyu_1emu_NativeLibrary_installFileToNand(JNIEnv* env, jobject Common::Android::GetJString(env, j_file), callback)); } -jboolean Java_org_suyu_suyu_1emu_NativeLibrary_doesUpdateMatchProgram(JNIEnv* env, jobject jobj, +jboolean Java_dev_suyu_suyu_1emu_NativeLibrary_doesUpdateMatchProgram(JNIEnv* env, jobject jobj, jstring jprogramId, jstring jupdatePath) { u64 program_id = EmulationSession::GetProgramId(env, jprogramId); @@ -491,7 +491,7 @@ jboolean Java_org_suyu_suyu_1emu_NativeLibrary_doesUpdateMatchProgram(JNIEnv* en return false; } -void JNICALL Java_org_suyu_suyu_1emu_NativeLibrary_initializeGpuDriver(JNIEnv* env, jclass clazz, +void JNICALL Java_dev_suyu_suyu_1emu_NativeLibrary_initializeGpuDriver(JNIEnv* env, jclass clazz, jstring hook_lib_dir, jstring custom_driver_dir, jstring custom_driver_name, @@ -513,7 +513,7 @@ void JNICALL Java_org_suyu_suyu_1emu_NativeLibrary_initializeGpuDriver(JNIEnv* e return android_get_device_api_level() >= 28 && CheckKgslPresent(); } -jboolean JNICALL Java_org_suyu_suyu_1emu_utils_GpuDriverHelper_supportsCustomDriverLoading( +jboolean JNICALL Java_dev_suyu_suyu_1emu_utils_GpuDriverHelper_supportsCustomDriverLoading( JNIEnv* env, jobject instance) { #ifdef ARCHITECTURE_arm64 // If the KGSL device exists custom drivers can be loaded using adrenotools @@ -523,7 +523,7 @@ jboolean JNICALL Java_org_suyu_suyu_1emu_utils_GpuDriverHelper_supportsCustomDri #endif } -jobjectArray Java_org_suyu_suyu_1emu_utils_GpuDriverHelper_getSystemDriverInfo( +jobjectArray Java_dev_suyu_suyu_1emu_utils_GpuDriverHelper_getSystemDriverInfo( JNIEnv* env, jobject j_obj, jobject j_surf, jstring j_hook_lib_dir) { const char* file_redirect_dir_{}; int featureFlags{}; @@ -555,32 +555,32 @@ jobjectArray Java_org_suyu_suyu_1emu_utils_GpuDriverHelper_getSystemDriverInfo( return j_driver_info; } -jboolean Java_org_suyu_suyu_1emu_NativeLibrary_reloadKeys(JNIEnv* env, jclass clazz) { +jboolean Java_dev_suyu_suyu_1emu_NativeLibrary_reloadKeys(JNIEnv* env, jclass clazz) { Core::Crypto::KeyManager::Instance().ReloadKeys(); return static_cast(Core::Crypto::KeyManager::Instance().AreKeysLoaded()); } -void Java_org_suyu_suyu_1emu_NativeLibrary_unpauseEmulation(JNIEnv* env, jclass clazz) { +void Java_dev_suyu_suyu_1emu_NativeLibrary_unpauseEmulation(JNIEnv* env, jclass clazz) { EmulationSession::GetInstance().UnPauseEmulation(); } -void Java_org_suyu_suyu_1emu_NativeLibrary_pauseEmulation(JNIEnv* env, jclass clazz) { +void Java_dev_suyu_suyu_1emu_NativeLibrary_pauseEmulation(JNIEnv* env, jclass clazz) { EmulationSession::GetInstance().PauseEmulation(); } -void Java_org_suyu_suyu_1emu_NativeLibrary_stopEmulation(JNIEnv* env, jclass clazz) { +void Java_dev_suyu_suyu_1emu_NativeLibrary_stopEmulation(JNIEnv* env, jclass clazz) { EmulationSession::GetInstance().HaltEmulation(); } -jboolean Java_org_suyu_suyu_1emu_NativeLibrary_isRunning(JNIEnv* env, jclass clazz) { +jboolean Java_dev_suyu_suyu_1emu_NativeLibrary_isRunning(JNIEnv* env, jclass clazz) { return static_cast(EmulationSession::GetInstance().IsRunning()); } -jboolean Java_org_suyu_suyu_1emu_NativeLibrary_isPaused(JNIEnv* env, jclass clazz) { +jboolean Java_dev_suyu_suyu_1emu_NativeLibrary_isPaused(JNIEnv* env, jclass clazz) { return static_cast(EmulationSession::GetInstance().IsPaused()); } -void Java_org_suyu_suyu_1emu_NativeLibrary_initializeSystem(JNIEnv* env, jclass clazz, +void Java_dev_suyu_suyu_1emu_NativeLibrary_initializeSystem(JNIEnv* env, jclass clazz, jboolean reload) { // Initialize the emulated system. if (!reload) { @@ -589,7 +589,7 @@ void Java_org_suyu_suyu_1emu_NativeLibrary_initializeSystem(JNIEnv* env, jclass EmulationSession::GetInstance().InitializeSystem(reload); } -jdoubleArray Java_org_suyu_suyu_1emu_NativeLibrary_getPerfStats(JNIEnv* env, jclass clazz) { +jdoubleArray Java_dev_suyu_suyu_1emu_NativeLibrary_getPerfStats(JNIEnv* env, jclass clazz) { jdoubleArray j_stats = env->NewDoubleArray(4); if (EmulationSession::GetInstance().IsRunning()) { @@ -605,7 +605,7 @@ jdoubleArray Java_org_suyu_suyu_1emu_NativeLibrary_getPerfStats(JNIEnv* env, jcl return j_stats; } -jstring Java_org_suyu_suyu_1emu_NativeLibrary_getCpuBackend(JNIEnv* env, jclass clazz) { +jstring Java_dev_suyu_suyu_1emu_NativeLibrary_getCpuBackend(JNIEnv* env, jclass clazz) { if (Settings::IsNceEnabled()) { return Common::Android::ToJString(env, "NCE"); } @@ -613,21 +613,21 @@ jstring Java_org_suyu_suyu_1emu_NativeLibrary_getCpuBackend(JNIEnv* env, jclass return Common::Android::ToJString(env, "JIT"); } -jstring Java_org_suyu_suyu_1emu_NativeLibrary_getGpuDriver(JNIEnv* env, jobject jobj) { +jstring Java_dev_suyu_suyu_1emu_NativeLibrary_getGpuDriver(JNIEnv* env, jobject jobj) { return Common::Android::ToJString( env, EmulationSession::GetInstance().System().GPU().Renderer().GetDeviceVendor()); } -void Java_org_suyu_suyu_1emu_NativeLibrary_applySettings(JNIEnv* env, jobject jobj) { +void Java_dev_suyu_suyu_1emu_NativeLibrary_applySettings(JNIEnv* env, jobject jobj) { EmulationSession::GetInstance().System().ApplySettings(); EmulationSession::GetInstance().System().HIDCore().ReloadInputDevices(); } -void Java_org_suyu_suyu_1emu_NativeLibrary_logSettings(JNIEnv* env, jobject jobj) { +void Java_dev_suyu_suyu_1emu_NativeLibrary_logSettings(JNIEnv* env, jobject jobj) { Settings::LogSettings(); } -void Java_org_suyu_suyu_1emu_NativeLibrary_run(JNIEnv* env, jobject jobj, jstring j_path, +void Java_dev_suyu_suyu_1emu_NativeLibrary_run(JNIEnv* env, jobject jobj, jstring j_path, jint j_program_index, jboolean j_frontend_initiated) { const std::string path = Common::Android::GetJString(env, j_path); @@ -641,23 +641,23 @@ void Java_org_suyu_suyu_1emu_NativeLibrary_run(JNIEnv* env, jobject jobj, jstrin } } -void Java_org_suyu_suyu_1emu_NativeLibrary_logDeviceInfo(JNIEnv* env, jclass clazz) { +void Java_dev_suyu_suyu_1emu_NativeLibrary_logDeviceInfo(JNIEnv* env, jclass clazz) { LOG_INFO(Frontend, "suyu Version: {}-{}", Common::g_scm_branch, Common::g_scm_desc); LOG_INFO(Frontend, "Host OS: Android API level {}", android_get_device_api_level()); } -void Java_org_suyu_suyu_1emu_NativeLibrary_submitInlineKeyboardText(JNIEnv* env, jclass clazz, +void Java_dev_suyu_suyu_1emu_NativeLibrary_submitInlineKeyboardText(JNIEnv* env, jclass clazz, jstring j_text) { const std::u16string input = Common::UTF8ToUTF16(Common::Android::GetJString(env, j_text)); EmulationSession::GetInstance().SoftwareKeyboard()->SubmitInlineKeyboardText(input); } -void Java_org_suyu_suyu_1emu_NativeLibrary_submitInlineKeyboardInput(JNIEnv* env, jclass clazz, +void Java_dev_suyu_suyu_1emu_NativeLibrary_submitInlineKeyboardInput(JNIEnv* env, jclass clazz, jint j_key_code) { EmulationSession::GetInstance().SoftwareKeyboard()->SubmitInlineKeyboardInput(j_key_code); } -void Java_org_suyu_suyu_1emu_NativeLibrary_initializeEmptyUserDirectory(JNIEnv* env, +void Java_dev_suyu_suyu_1emu_NativeLibrary_initializeEmptyUserDirectory(JNIEnv* env, jobject instance) { const auto nand_dir = Common::FS::GetSuyuPath(Common::FS::SuyuPath::NANDDir); auto vfs_nand_dir = EmulationSession::GetInstance().System().GetFilesystem()->OpenDirectory( @@ -677,7 +677,7 @@ void Java_org_suyu_suyu_1emu_NativeLibrary_initializeEmptyUserDirectory(JNIEnv* } } -jstring Java_org_suyu_suyu_1emu_NativeLibrary_getAppletLaunchPath(JNIEnv* env, jclass clazz, +jstring Java_dev_suyu_suyu_1emu_NativeLibrary_getAppletLaunchPath(JNIEnv* env, jclass clazz, jlong jid) { auto bis_system = EmulationSession::GetInstance().System().GetFileSystemController().GetSystemNANDContents(); @@ -694,18 +694,18 @@ jstring Java_org_suyu_suyu_1emu_NativeLibrary_getAppletLaunchPath(JNIEnv* env, j return Common::Android::ToJString(env, applet_nca->GetFullPath()); } -void Java_org_suyu_suyu_1emu_NativeLibrary_setCurrentAppletId(JNIEnv* env, jclass clazz, +void Java_dev_suyu_suyu_1emu_NativeLibrary_setCurrentAppletId(JNIEnv* env, jclass clazz, jint jappletId) { EmulationSession::GetInstance().SetAppletId(jappletId); } -void Java_org_suyu_suyu_1emu_NativeLibrary_setCabinetMode(JNIEnv* env, jclass clazz, +void Java_dev_suyu_suyu_1emu_NativeLibrary_setCabinetMode(JNIEnv* env, jclass clazz, jint jcabinetMode) { EmulationSession::GetInstance().System().GetFrontendAppletHolder().SetCabinetMode( static_cast(jcabinetMode)); } -jboolean Java_org_suyu_suyu_1emu_NativeLibrary_isFirmwareAvailable(JNIEnv* env, jclass clazz) { +jboolean Java_dev_suyu_suyu_1emu_NativeLibrary_isFirmwareAvailable(JNIEnv* env, jclass clazz) { auto bis_system = EmulationSession::GetInstance().System().GetFileSystemController().GetSystemNANDContents(); if (!bis_system) { @@ -721,7 +721,7 @@ jboolean Java_org_suyu_suyu_1emu_NativeLibrary_isFirmwareAvailable(JNIEnv* env, return true; } -jobjectArray Java_org_suyu_suyu_1emu_NativeLibrary_getPatchesForFile(JNIEnv* env, jobject jobj, +jobjectArray Java_dev_suyu_suyu_1emu_NativeLibrary_getPatchesForFile(JNIEnv* env, jobject jobj, jstring jpath, jstring jprogramId) { const auto path = Common::Android::GetJString(env, jpath); @@ -757,27 +757,27 @@ jobjectArray Java_org_suyu_suyu_1emu_NativeLibrary_getPatchesForFile(JNIEnv* env return jpatchArray; } -void Java_org_suyu_suyu_1emu_NativeLibrary_removeUpdate(JNIEnv* env, jobject jobj, +void Java_dev_suyu_suyu_1emu_NativeLibrary_removeUpdate(JNIEnv* env, jobject jobj, jstring jprogramId) { auto program_id = EmulationSession::GetProgramId(env, jprogramId); ContentManager::RemoveUpdate(EmulationSession::GetInstance().System().GetFileSystemController(), program_id); } -void Java_org_suyu_suyu_1emu_NativeLibrary_removeDLC(JNIEnv* env, jobject jobj, +void Java_dev_suyu_suyu_1emu_NativeLibrary_removeDLC(JNIEnv* env, jobject jobj, jstring jprogramId) { auto program_id = EmulationSession::GetProgramId(env, jprogramId); ContentManager::RemoveAllDLC(EmulationSession::GetInstance().System(), program_id); } -void Java_org_suyu_suyu_1emu_NativeLibrary_removeMod(JNIEnv* env, jobject jobj, jstring jprogramId, +void Java_dev_suyu_suyu_1emu_NativeLibrary_removeMod(JNIEnv* env, jobject jobj, jstring jprogramId, jstring jname) { auto program_id = EmulationSession::GetProgramId(env, jprogramId); ContentManager::RemoveMod(EmulationSession::GetInstance().System().GetFileSystemController(), program_id, Common::Android::GetJString(env, jname)); } -jobjectArray Java_org_suyu_suyu_1emu_NativeLibrary_verifyInstalledContents(JNIEnv* env, +jobjectArray Java_dev_suyu_suyu_1emu_NativeLibrary_verifyInstalledContents(JNIEnv* env, jobject jobj, jobject jcallback) { auto jlambdaClass = env->GetObjectClass(jcallback); @@ -801,7 +801,7 @@ jobjectArray Java_org_suyu_suyu_1emu_NativeLibrary_verifyInstalledContents(JNIEn return jresult; } -jint Java_org_suyu_suyu_1emu_NativeLibrary_verifyGameContents(JNIEnv* env, jobject jobj, +jint Java_dev_suyu_suyu_1emu_NativeLibrary_verifyGameContents(JNIEnv* env, jobject jobj, jstring jpath, jobject jcallback) { auto jlambdaClass = env->GetObjectClass(jcallback); auto jlambdaInvokeMethod = env->GetMethodID( @@ -817,7 +817,7 @@ jint Java_org_suyu_suyu_1emu_NativeLibrary_verifyGameContents(JNIEnv* env, jobje session.System(), Common::Android::GetJString(env, jpath), callback)); } -jstring Java_org_suyu_suyu_1emu_NativeLibrary_getSavePath(JNIEnv* env, jobject jobj, +jstring Java_dev_suyu_suyu_1emu_NativeLibrary_getSavePath(JNIEnv* env, jobject jobj, jstring jprogramId) { auto program_id = EmulationSession::GetProgramId(env, jprogramId); if (program_id == 0) { @@ -841,7 +841,7 @@ jstring Java_org_suyu_suyu_1emu_NativeLibrary_getSavePath(JNIEnv* env, jobject j return Common::Android::ToJString(env, user_save_data_path); } -jstring Java_org_suyu_suyu_1emu_NativeLibrary_getDefaultProfileSaveDataRoot(JNIEnv* env, +jstring Java_dev_suyu_suyu_1emu_NativeLibrary_getDefaultProfileSaveDataRoot(JNIEnv* env, jobject jobj, jboolean jfuture) { Service::Account::ProfileManager manager; @@ -854,17 +854,17 @@ jstring Java_org_suyu_suyu_1emu_NativeLibrary_getDefaultProfileSaveDataRoot(JNIE return Common::Android::ToJString(env, user_save_data_root); } -void Java_org_suyu_suyu_1emu_NativeLibrary_addFileToFilesystemProvider(JNIEnv* env, jobject jobj, +void Java_dev_suyu_suyu_1emu_NativeLibrary_addFileToFilesystemProvider(JNIEnv* env, jobject jobj, jstring jpath) { EmulationSession::GetInstance().ConfigureFilesystemProvider( Common::Android::GetJString(env, jpath)); } -void Java_org_suyu_suyu_1emu_NativeLibrary_clearFilesystemProvider(JNIEnv* env, jobject jobj) { +void Java_dev_suyu_suyu_1emu_NativeLibrary_clearFilesystemProvider(JNIEnv* env, jobject jobj) { EmulationSession::GetInstance().GetContentProvider()->ClearAllEntries(); } -jboolean Java_org_suyu_suyu_1emu_NativeLibrary_areKeysPresent(JNIEnv* env, jobject jobj) { +jboolean Java_dev_suyu_suyu_1emu_NativeLibrary_areKeysPresent(JNIEnv* env, jobject jobj) { auto& system = EmulationSession::GetInstance().System(); system.GetFileSystemController().CreateFactories(*system.GetFilesystem()); return ContentManager::AreKeysPresent(); diff --git a/src/android/app/src/main/jni/native_config.cpp b/src/android/app/src/main/jni/native_config.cpp index 88282657f1..cad322297b 100644 --- a/src/android/app/src/main/jni/native_config.cpp +++ b/src/android/app/src/main/jni/native_config.cpp @@ -34,23 +34,23 @@ Settings::Setting* getSetting(JNIEnv* env, jstring jkey) { extern "C" { -void Java_org_suyu_suyu_1emu_utils_NativeConfig_initializeGlobalConfig(JNIEnv* env, jobject obj) { +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_initializeGlobalConfig(JNIEnv* env, jobject obj) { global_config = std::make_unique(); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_unloadGlobalConfig(JNIEnv* env, jobject obj) { +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_unloadGlobalConfig(JNIEnv* env, jobject obj) { global_config.reset(); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_reloadGlobalConfig(JNIEnv* env, jobject obj) { +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_reloadGlobalConfig(JNIEnv* env, jobject obj) { global_config->AndroidConfig::ReloadAllValues(); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_saveGlobalConfig(JNIEnv* env, jobject obj) { +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_saveGlobalConfig(JNIEnv* env, jobject obj) { global_config->AndroidConfig::SaveAllValues(); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_initializePerGameConfig(JNIEnv* env, jobject obj, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_initializePerGameConfig(JNIEnv* env, jobject obj, jstring jprogramId, jstring jfileName) { auto program_id = EmulationSession::GetProgramId(env, jprogramId); @@ -60,20 +60,20 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_initializePerGameConfig(JNIEnv* std::make_unique(config_file_name, Config::ConfigType::PerGameConfig); } -jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_isPerGameConfigLoaded(JNIEnv* env, +jboolean Java_dev_suyu_suyu_1emu_utils_NativeConfig_isPerGameConfigLoaded(JNIEnv* env, jobject obj) { return per_game_config != nullptr; } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_savePerGameConfig(JNIEnv* env, jobject obj) { +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_savePerGameConfig(JNIEnv* env, jobject obj) { per_game_config->AndroidConfig::SaveAllValues(); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_unloadPerGameConfig(JNIEnv* env, jobject obj) { +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_unloadPerGameConfig(JNIEnv* env, jobject obj) { per_game_config.reset(); } -jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_getBoolean(JNIEnv* env, jobject obj, +jboolean Java_dev_suyu_suyu_1emu_utils_NativeConfig_getBoolean(JNIEnv* env, jobject obj, jstring jkey, jboolean needGlobal) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -82,7 +82,7 @@ jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_getBoolean(JNIEnv* env, jobj return setting->GetValue(static_cast(needGlobal)); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setBoolean(JNIEnv* env, jobject obj, jstring jkey, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setBoolean(JNIEnv* env, jobject obj, jstring jkey, jboolean value) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -91,7 +91,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setBoolean(JNIEnv* env, jobject setting->SetValue(static_cast(value)); } -jbyte Java_org_suyu_suyu_1emu_utils_NativeConfig_getByte(JNIEnv* env, jobject obj, jstring jkey, +jbyte Java_dev_suyu_suyu_1emu_utils_NativeConfig_getByte(JNIEnv* env, jobject obj, jstring jkey, jboolean needGlobal) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -100,7 +100,7 @@ jbyte Java_org_suyu_suyu_1emu_utils_NativeConfig_getByte(JNIEnv* env, jobject ob return setting->GetValue(static_cast(needGlobal)); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setByte(JNIEnv* env, jobject obj, jstring jkey, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setByte(JNIEnv* env, jobject obj, jstring jkey, jbyte value) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -109,7 +109,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setByte(JNIEnv* env, jobject obj setting->SetValue(value); } -jshort Java_org_suyu_suyu_1emu_utils_NativeConfig_getShort(JNIEnv* env, jobject obj, jstring jkey, +jshort Java_dev_suyu_suyu_1emu_utils_NativeConfig_getShort(JNIEnv* env, jobject obj, jstring jkey, jboolean needGlobal) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -118,7 +118,7 @@ jshort Java_org_suyu_suyu_1emu_utils_NativeConfig_getShort(JNIEnv* env, jobject return setting->GetValue(static_cast(needGlobal)); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setShort(JNIEnv* env, jobject obj, jstring jkey, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setShort(JNIEnv* env, jobject obj, jstring jkey, jshort value) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -127,7 +127,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setShort(JNIEnv* env, jobject ob setting->SetValue(value); } -jint Java_org_suyu_suyu_1emu_utils_NativeConfig_getInt(JNIEnv* env, jobject obj, jstring jkey, +jint Java_dev_suyu_suyu_1emu_utils_NativeConfig_getInt(JNIEnv* env, jobject obj, jstring jkey, jboolean needGlobal) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -136,7 +136,7 @@ jint Java_org_suyu_suyu_1emu_utils_NativeConfig_getInt(JNIEnv* env, jobject obj, return setting->GetValue(needGlobal); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setInt(JNIEnv* env, jobject obj, jstring jkey, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setInt(JNIEnv* env, jobject obj, jstring jkey, jint value) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -145,7 +145,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setInt(JNIEnv* env, jobject obj, setting->SetValue(value); } -jfloat Java_org_suyu_suyu_1emu_utils_NativeConfig_getFloat(JNIEnv* env, jobject obj, jstring jkey, +jfloat Java_dev_suyu_suyu_1emu_utils_NativeConfig_getFloat(JNIEnv* env, jobject obj, jstring jkey, jboolean needGlobal) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -154,7 +154,7 @@ jfloat Java_org_suyu_suyu_1emu_utils_NativeConfig_getFloat(JNIEnv* env, jobject return setting->GetValue(static_cast(needGlobal)); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setFloat(JNIEnv* env, jobject obj, jstring jkey, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setFloat(JNIEnv* env, jobject obj, jstring jkey, jfloat value) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -163,7 +163,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setFloat(JNIEnv* env, jobject ob setting->SetValue(value); } -jlong Java_org_suyu_suyu_1emu_utils_NativeConfig_getLong(JNIEnv* env, jobject obj, jstring jkey, +jlong Java_dev_suyu_suyu_1emu_utils_NativeConfig_getLong(JNIEnv* env, jobject obj, jstring jkey, jboolean needGlobal) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -172,7 +172,7 @@ jlong Java_org_suyu_suyu_1emu_utils_NativeConfig_getLong(JNIEnv* env, jobject ob return setting->GetValue(static_cast(needGlobal)); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setLong(JNIEnv* env, jobject obj, jstring jkey, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setLong(JNIEnv* env, jobject obj, jstring jkey, jlong value) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -181,7 +181,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setLong(JNIEnv* env, jobject obj setting->SetValue(value); } -jstring Java_org_suyu_suyu_1emu_utils_NativeConfig_getString(JNIEnv* env, jobject obj, jstring jkey, +jstring Java_dev_suyu_suyu_1emu_utils_NativeConfig_getString(JNIEnv* env, jobject obj, jstring jkey, jboolean needGlobal) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -190,7 +190,7 @@ jstring Java_org_suyu_suyu_1emu_utils_NativeConfig_getString(JNIEnv* env, jobjec return Common::Android::ToJString(env, setting->GetValue(static_cast(needGlobal))); } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setString(JNIEnv* env, jobject obj, jstring jkey, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setString(JNIEnv* env, jobject obj, jstring jkey, jstring value) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -200,7 +200,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setString(JNIEnv* env, jobject o setting->SetValue(Common::Android::GetJString(env, value)); } -jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_getIsRuntimeModifiable(JNIEnv* env, jobject obj, +jboolean Java_dev_suyu_suyu_1emu_utils_NativeConfig_getIsRuntimeModifiable(JNIEnv* env, jobject obj, jstring jkey) { auto setting = getSetting(env, jkey); if (setting != nullptr) { @@ -209,7 +209,7 @@ jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_getIsRuntimeModifiable(JNIEn return true; } -jstring Java_org_suyu_suyu_1emu_utils_NativeConfig_getPairedSettingKey(JNIEnv* env, jobject obj, +jstring Java_dev_suyu_suyu_1emu_utils_NativeConfig_getPairedSettingKey(JNIEnv* env, jobject obj, jstring jkey) { auto setting = getSetting(env, jkey); if (setting == nullptr) { @@ -222,7 +222,7 @@ jstring Java_org_suyu_suyu_1emu_utils_NativeConfig_getPairedSettingKey(JNIEnv* e return Common::Android::ToJString(env, setting->PairedSetting()->GetLabel()); } -jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_getIsSwitchable(JNIEnv* env, jobject obj, +jboolean Java_dev_suyu_suyu_1emu_utils_NativeConfig_getIsSwitchable(JNIEnv* env, jobject obj, jstring jkey) { auto setting = getSetting(env, jkey); if (setting != nullptr) { @@ -231,7 +231,7 @@ jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_getIsSwitchable(JNIEnv* env, return false; } -jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_usingGlobal(JNIEnv* env, jobject obj, +jboolean Java_dev_suyu_suyu_1emu_utils_NativeConfig_usingGlobal(JNIEnv* env, jobject obj, jstring jkey) { auto setting = getSetting(env, jkey); if (setting != nullptr) { @@ -240,7 +240,7 @@ jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_usingGlobal(JNIEnv* env, job return true; } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setGlobal(JNIEnv* env, jobject obj, jstring jkey, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setGlobal(JNIEnv* env, jobject obj, jstring jkey, jboolean global) { auto setting = getSetting(env, jkey); if (setting != nullptr) { @@ -248,7 +248,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setGlobal(JNIEnv* env, jobject o } } -jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_getIsSaveable(JNIEnv* env, jobject obj, +jboolean Java_dev_suyu_suyu_1emu_utils_NativeConfig_getIsSaveable(JNIEnv* env, jobject obj, jstring jkey) { auto setting = getSetting(env, jkey); if (setting != nullptr) { @@ -257,7 +257,7 @@ jboolean Java_org_suyu_suyu_1emu_utils_NativeConfig_getIsSaveable(JNIEnv* env, j return false; } -jstring Java_org_suyu_suyu_1emu_utils_NativeConfig_getDefaultToString(JNIEnv* env, jobject obj, +jstring Java_dev_suyu_suyu_1emu_utils_NativeConfig_getDefaultToString(JNIEnv* env, jobject obj, jstring jkey) { auto setting = getSetting(env, jkey); if (setting != nullptr) { @@ -266,7 +266,7 @@ jstring Java_org_suyu_suyu_1emu_utils_NativeConfig_getDefaultToString(JNIEnv* en return Common::Android::ToJString(env, ""); } -jobjectArray Java_org_suyu_suyu_1emu_utils_NativeConfig_getGameDirs(JNIEnv* env, jobject obj) { +jobjectArray Java_dev_suyu_suyu_1emu_utils_NativeConfig_getGameDirs(JNIEnv* env, jobject obj) { jclass gameDirClass = Common::Android::GetGameDirClass(); jmethodID gameDirConstructor = Common::Android::GetGameDirConstructor(); jobjectArray jgameDirArray = @@ -281,7 +281,7 @@ jobjectArray Java_org_suyu_suyu_1emu_utils_NativeConfig_getGameDirs(JNIEnv* env, return jgameDirArray; } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setGameDirs(JNIEnv* env, jobject obj, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setGameDirs(JNIEnv* env, jobject obj, jobjectArray gameDirs) { AndroidSettings::values.game_dirs.clear(); int size = env->GetArrayLength(gameDirs); @@ -304,7 +304,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setGameDirs(JNIEnv* env, jobject } } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_addGameDir(JNIEnv* env, jobject obj, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_addGameDir(JNIEnv* env, jobject obj, jobject gameDir) { jclass gameDirClass = Common::Android::GetGameDirClass(); jfieldID uriStringField = env->GetFieldID(gameDirClass, "uriString", "Ljava/lang/String;"); @@ -317,7 +317,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_addGameDir(JNIEnv* env, jobject AndroidSettings::GameDir{uriString, static_cast(jdeepScanBoolean)}); } -jobjectArray Java_org_suyu_suyu_1emu_utils_NativeConfig_getDisabledAddons(JNIEnv* env, jobject obj, +jobjectArray Java_dev_suyu_suyu_1emu_utils_NativeConfig_getDisabledAddons(JNIEnv* env, jobject obj, jstring jprogramId) { auto program_id = EmulationSession::GetProgramId(env, jprogramId); auto& disabledAddons = Settings::values.disabled_addons[program_id]; @@ -331,7 +331,7 @@ jobjectArray Java_org_suyu_suyu_1emu_utils_NativeConfig_getDisabledAddons(JNIEnv return jdisabledAddonsArray; } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setDisabledAddons(JNIEnv* env, jobject obj, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setDisabledAddons(JNIEnv* env, jobject obj, jstring jprogramId, jobjectArray jdisabledAddons) { auto program_id = EmulationSession::GetProgramId(env, jprogramId); @@ -345,7 +345,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setDisabledAddons(JNIEnv* env, j Settings::values.disabled_addons[program_id] = disabled_addons; } -jobjectArray Java_org_suyu_suyu_1emu_utils_NativeConfig_getOverlayControlData(JNIEnv* env, +jobjectArray Java_dev_suyu_suyu_1emu_utils_NativeConfig_getOverlayControlData(JNIEnv* env, jobject obj) { jobjectArray joverlayControlDataArray = env->NewObjectArray(AndroidSettings::values.overlay_control_data.size(), @@ -375,7 +375,7 @@ jobjectArray Java_org_suyu_suyu_1emu_utils_NativeConfig_getOverlayControlData(JN return joverlayControlDataArray; } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setOverlayControlData( +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setOverlayControlData( JNIEnv* env, jobject obj, jobjectArray joverlayControlDataArray) { AndroidSettings::values.overlay_control_data.clear(); int size = env->GetArrayLength(joverlayControlDataArray); @@ -424,7 +424,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setOverlayControlData( } } -jobjectArray Java_org_suyu_suyu_1emu_utils_NativeConfig_getInputSettings(JNIEnv* env, jobject obj, +jobjectArray Java_dev_suyu_suyu_1emu_utils_NativeConfig_getInputSettings(JNIEnv* env, jobject obj, jboolean j_global) { Settings::values.players.SetGlobal(static_cast(j_global)); auto& players = Settings::values.players.GetValue(); @@ -474,7 +474,7 @@ jobjectArray Java_org_suyu_suyu_1emu_utils_NativeConfig_getInputSettings(JNIEnv* return j_input_settings; } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_setInputSettings(JNIEnv* env, jobject obj, +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_setInputSettings(JNIEnv* env, jobject obj, jobjectArray j_value, jboolean j_global) { auto& players = Settings::values.players.GetValue(static_cast(j_global)); @@ -530,7 +530,7 @@ void Java_org_suyu_suyu_1emu_utils_NativeConfig_setInputSettings(JNIEnv* env, jo } } -void Java_org_suyu_suyu_1emu_utils_NativeConfig_saveControlPlayerValues(JNIEnv* env, jobject obj) { +void Java_dev_suyu_suyu_1emu_utils_NativeConfig_saveControlPlayerValues(JNIEnv* env, jobject obj) { Settings::values.players.SetGlobal(false); // Clear all controls from the config in case the user reverted back to globals diff --git a/src/android/app/src/main/jni/native_input.cpp b/src/android/app/src/main/jni/native_input.cpp index 5f83c3fe1b..d3523eb30d 100644 --- a/src/android/app/src/main/jni/native_input.cpp +++ b/src/android/app/src/main/jni/native_input.cpp @@ -186,24 +186,24 @@ void ConnectController(size_t player_index, bool connected) { extern "C" { -jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_isHandheldOnly(JNIEnv* env, +jboolean Java_dev_suyu_suyu_1emu_features_input_NativeInput_isHandheldOnly(JNIEnv* env, jobject j_obj) { return IsHandheldOnly(); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onGamePadButtonEvent( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onGamePadButtonEvent( JNIEnv* env, jobject j_obj, jstring j_guid, jint j_port, jint j_button_id, jint j_action) { EmulationSession::GetInstance().GetInputSubsystem().GetAndroid()->SetButtonState( Common::Android::GetJString(env, j_guid), j_port, j_button_id, j_action != 0); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onGamePadAxisEvent( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onGamePadAxisEvent( JNIEnv* env, jobject j_obj, jstring j_guid, jint j_port, jint j_stick_id, jfloat j_value) { EmulationSession::GetInstance().GetInputSubsystem().GetAndroid()->SetAxisPosition( Common::Android::GetJString(env, j_guid), j_port, j_stick_id, j_value); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onGamePadMotionEvent( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onGamePadMotionEvent( JNIEnv* env, jobject j_obj, jstring j_guid, jint j_port, jlong j_delta_timestamp, jfloat j_x_gyro, jfloat j_y_gyro, jfloat j_z_gyro, jfloat j_x_accel, jfloat j_y_accel, jfloat j_z_accel) { @@ -212,7 +212,7 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_onGamePadMotionEvent( j_z_gyro, j_x_accel, j_y_accel, j_z_accel); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onReadNfcTag(JNIEnv* env, jobject j_obj, +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onReadNfcTag(JNIEnv* env, jobject j_obj, jbyteArray j_data) { jboolean isCopy{false}; std::span data(reinterpret_cast(env->GetByteArrayElements(j_data, &isCopy)), @@ -223,13 +223,13 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_onReadNfcTag(JNIEnv* env } } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onRemoveNfcTag(JNIEnv* env, jobject j_obj) { +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onRemoveNfcTag(JNIEnv* env, jobject j_obj) { if (EmulationSession::GetInstance().IsRunning()) { EmulationSession::GetInstance().GetInputSubsystem().GetVirtualAmiibo()->CloseAmiibo(); } } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onTouchPressed(JNIEnv* env, jobject j_obj, +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onTouchPressed(JNIEnv* env, jobject j_obj, jint j_id, jfloat j_x_axis, jfloat j_y_axis) { if (EmulationSession::GetInstance().IsRunning()) { @@ -237,7 +237,7 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_onTouchPressed(JNIEnv* e } } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onTouchMoved(JNIEnv* env, jobject j_obj, +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onTouchMoved(JNIEnv* env, jobject j_obj, jint j_id, jfloat j_x_axis, jfloat j_y_axis) { if (EmulationSession::GetInstance().IsRunning()) { @@ -245,14 +245,14 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_onTouchMoved(JNIEnv* env } } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onTouchReleased(JNIEnv* env, jobject j_obj, +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onTouchReleased(JNIEnv* env, jobject j_obj, jint j_id) { if (EmulationSession::GetInstance().IsRunning()) { EmulationSession::GetInstance().Window().OnTouchReleased(j_id); } } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onOverlayButtonEventImpl( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onOverlayButtonEventImpl( JNIEnv* env, jobject j_obj, jint j_port, jint j_button_id, jint j_action) { if (EmulationSession::GetInstance().IsRunning()) { EmulationSession::GetInstance().GetInputSubsystem().GetVirtualGamepad()->SetButtonState( @@ -260,7 +260,7 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_onOverlayButtonEventImpl } } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onOverlayJoystickEventImpl( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onOverlayJoystickEventImpl( JNIEnv* env, jobject j_obj, jint j_port, jint j_stick_id, jfloat j_x_axis, jfloat j_y_axis) { if (EmulationSession::GetInstance().IsRunning()) { EmulationSession::GetInstance().GetInputSubsystem().GetVirtualGamepad()->SetStickPosition( @@ -268,7 +268,7 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_onOverlayJoystickEventIm } } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_onDeviceMotionEvent( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_onDeviceMotionEvent( JNIEnv* env, jobject j_obj, jint j_port, jlong j_delta_timestamp, jfloat j_x_gyro, jfloat j_y_gyro, jfloat j_z_gyro, jfloat j_x_accel, jfloat j_y_accel, jfloat j_z_accel) { if (EmulationSession::GetInstance().IsRunning()) { @@ -278,18 +278,18 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_onDeviceMotionEvent( } } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_reloadInputDevices(JNIEnv* env, +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_reloadInputDevices(JNIEnv* env, jobject j_obj) { EmulationSession::GetInstance().System().HIDCore().ReloadInputDevices(); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_registerController(JNIEnv* env, +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_registerController(JNIEnv* env, jobject j_obj, jobject j_device) { EmulationSession::GetInstance().GetInputSubsystem().GetAndroid()->RegisterController(j_device); } -jobjectArray Java_org_suyu_suyu_1emu_features_input_NativeInput_getInputDevices(JNIEnv* env, +jobjectArray Java_dev_suyu_suyu_1emu_features_input_NativeInput_getInputDevices(JNIEnv* env, jobject j_obj) { auto devices = EmulationSession::GetInstance().GetInputSubsystem().GetInputDevices(); jobjectArray jdevices = env->NewObjectArray(devices.size(), Common::Android::GetStringClass(), @@ -301,7 +301,7 @@ jobjectArray Java_org_suyu_suyu_1emu_features_input_NativeInput_getInputDevices( return jdevices; } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_loadInputProfiles(JNIEnv* env, +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_loadInputProfiles(JNIEnv* env, jobject j_obj) { map_profiles.clear(); const auto input_profile_loc = @@ -327,7 +327,7 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_loadInputProfiles(JNIEnv } } -jobjectArray Java_org_suyu_suyu_1emu_features_input_NativeInput_getInputProfileNames( +jobjectArray Java_dev_suyu_suyu_1emu_features_input_NativeInput_getInputProfileNames( JNIEnv* env, jobject j_obj) { std::vector profile_names; profile_names.reserve(map_profiles.size()); @@ -357,14 +357,14 @@ jobjectArray Java_org_suyu_suyu_1emu_features_input_NativeInput_getInputProfileN return j_profile_names; } -jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_isProfileNameValid(JNIEnv* env, +jboolean Java_dev_suyu_suyu_1emu_features_input_NativeInput_isProfileNameValid(JNIEnv* env, jobject j_obj, jstring j_name) { return Common::Android::GetJString(env, j_name).find_first_of("<>:;\"/\\|,.!?*") == std::string::npos; } -jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_createProfile(JNIEnv* env, +jboolean Java_dev_suyu_suyu_1emu_features_input_NativeInput_createProfile(JNIEnv* env, jobject j_obj, jstring j_name, jint j_player_index) { @@ -380,7 +380,7 @@ jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_createProfile(JNIEnv return SaveProfile(profile_name, j_player_index); } -jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_deleteProfile(JNIEnv* env, +jboolean Java_dev_suyu_suyu_1emu_features_input_NativeInput_deleteProfile(JNIEnv* env, jobject j_obj, jstring j_name, jint j_player_index) { @@ -398,21 +398,21 @@ jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_deleteProfile(JNIEnv return !ProfileExistsInMap(profile_name) && !ProfileExistsInFilesystem(profile_name); } -jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_loadProfile(JNIEnv* env, jobject j_obj, +jboolean Java_dev_suyu_suyu_1emu_features_input_NativeInput_loadProfile(JNIEnv* env, jobject j_obj, jstring j_name, jint j_player_index) { auto profile_name = Common::Android::GetJString(env, j_name); return LoadProfile(profile_name, j_player_index); } -jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_saveProfile(JNIEnv* env, jobject j_obj, +jboolean Java_dev_suyu_suyu_1emu_features_input_NativeInput_saveProfile(JNIEnv* env, jobject j_obj, jstring j_name, jint j_player_index) { auto profile_name = Common::Android::GetJString(env, j_name); return SaveProfile(profile_name, j_player_index); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_loadPerGameConfiguration( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_loadPerGameConfiguration( JNIEnv* env, jobject j_obj, jint j_player_index, jint j_selected_index, jstring j_selected_profile_name) { static constexpr size_t HANDHELD_INDEX = 8; @@ -460,23 +460,23 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_loadPerGameConfiguration handheld_controller->ReloadFromSettings(); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_beginMapping(JNIEnv* env, jobject j_obj, +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_beginMapping(JNIEnv* env, jobject j_obj, jint jtype) { EmulationSession::GetInstance().GetInputSubsystem().BeginMapping( static_cast(jtype)); } -jstring Java_org_suyu_suyu_1emu_features_input_NativeInput_getNextInput(JNIEnv* env, +jstring Java_dev_suyu_suyu_1emu_features_input_NativeInput_getNextInput(JNIEnv* env, jobject j_obj) { return Common::Android::ToJString( env, EmulationSession::GetInstance().GetInputSubsystem().GetNextInput().Serialize()); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_stopMapping(JNIEnv* env, jobject j_obj) { +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_stopMapping(JNIEnv* env, jobject j_obj) { EmulationSession::GetInstance().GetInputSubsystem().StopMapping(); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_updateMappingsWithDefaultImpl( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_updateMappingsWithDefaultImpl( JNIEnv* env, jobject j_obj, jint j_player_index, jstring j_device_params, jstring j_display_name) { auto& input_subsystem = EmulationSession::GetInstance().GetInputSubsystem(); @@ -516,7 +516,7 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_updateMappingsWithDefaul } } -jstring Java_org_suyu_suyu_1emu_features_input_NativeInput_getButtonParamImpl(JNIEnv* env, +jstring Java_dev_suyu_suyu_1emu_features_input_NativeInput_getButtonParamImpl(JNIEnv* env, jobject j_obj, jint j_player_index, jint j_button) { @@ -528,7 +528,7 @@ jstring Java_org_suyu_suyu_1emu_features_input_NativeInput_getButtonParamImpl(JN .Serialize()); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_setButtonParamImpl( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_setButtonParamImpl( JNIEnv* env, jobject j_obj, jint j_player_index, jint j_button_id, jstring j_param) { ApplyControllerConfig(j_player_index, [&](Core::HID::EmulatedController* controller) { controller->SetButtonParam(j_button_id, @@ -536,7 +536,7 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_setButtonParamImpl( }); } -jstring Java_org_suyu_suyu_1emu_features_input_NativeInput_getStickParamImpl(JNIEnv* env, +jstring Java_dev_suyu_suyu_1emu_features_input_NativeInput_getStickParamImpl(JNIEnv* env, jobject j_obj, jint j_player_index, jint j_stick) { @@ -548,7 +548,7 @@ jstring Java_org_suyu_suyu_1emu_features_input_NativeInput_getStickParamImpl(JNI .Serialize()); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_setStickParamImpl( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_setStickParamImpl( JNIEnv* env, jobject j_obj, jint j_player_index, jint j_stick_id, jstring j_param) { ApplyControllerConfig(j_player_index, [&](Core::HID::EmulatedController* controller) { controller->SetStickParam(j_stick_id, @@ -556,14 +556,14 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_setStickParamImpl( }); } -jint Java_org_suyu_suyu_1emu_features_input_NativeInput_getButtonNameImpl(JNIEnv* env, +jint Java_dev_suyu_suyu_1emu_features_input_NativeInput_getButtonNameImpl(JNIEnv* env, jobject j_obj, jstring j_param) { return static_cast(EmulationSession::GetInstance().GetInputSubsystem().GetButtonName( Common::ParamPackage(Common::Android::GetJString(env, j_param)))); } -jintArray Java_org_suyu_suyu_1emu_features_input_NativeInput_getSupportedStyleTagsImpl( +jintArray Java_dev_suyu_suyu_1emu_features_input_NativeInput_getSupportedStyleTagsImpl( JNIEnv* env, jobject j_obj, jint j_player_index) { auto supported_styles = GetSupportedStyles(j_player_index); jintArray j_supported_indexes = env->NewIntArray(supported_styles.size()); @@ -572,7 +572,7 @@ jintArray Java_org_suyu_suyu_1emu_features_input_NativeInput_getSupportedStyleTa return j_supported_indexes; } -jint Java_org_suyu_suyu_1emu_features_input_NativeInput_getStyleIndexImpl(JNIEnv* env, +jint Java_dev_suyu_suyu_1emu_features_input_NativeInput_getStyleIndexImpl(JNIEnv* env, jobject j_obj, jint j_player_index) { return static_cast(EmulationSession::GetInstance() @@ -582,7 +582,7 @@ jint Java_org_suyu_suyu_1emu_features_input_NativeInput_getStyleIndexImpl(JNIEnv ->GetNpadStyleIndex(true)); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_setStyleIndexImpl(JNIEnv* env, +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_setStyleIndexImpl(JNIEnv* env, jobject j_obj, jint j_player_index, jint j_style_index) { @@ -599,14 +599,14 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_setStyleIndexImpl(JNIEnv } } -jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_isControllerImpl(JNIEnv* env, +jboolean Java_dev_suyu_suyu_1emu_features_input_NativeInput_isControllerImpl(JNIEnv* env, jobject j_obj, jstring jparams) { return static_cast(EmulationSession::GetInstance().GetInputSubsystem().IsController( Common::ParamPackage(Common::Android::GetJString(env, jparams)))); } -jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_getIsConnected(JNIEnv* env, +jboolean Java_dev_suyu_suyu_1emu_features_input_NativeInput_getIsConnected(JNIEnv* env, jobject j_obj, jint j_player_index) { auto& hid_core = EmulationSession::GetInstance().System().HIDCore(); @@ -618,7 +618,7 @@ jboolean Java_org_suyu_suyu_1emu_features_input_NativeInput_getIsConnected(JNIEn return controller->IsConnected(true); } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_connectControllersImpl( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_connectControllersImpl( JNIEnv* env, jobject j_obj, jbooleanArray j_connected) { jboolean isCopy = false; auto j_connected_array_size = env->GetArrayLength(j_connected); @@ -628,7 +628,7 @@ void Java_org_suyu_suyu_1emu_features_input_NativeInput_connectControllersImpl( } } -void Java_org_suyu_suyu_1emu_features_input_NativeInput_resetControllerMappings( +void Java_dev_suyu_suyu_1emu_features_input_NativeInput_resetControllerMappings( JNIEnv* env, jobject j_obj, jint j_player_index) { // Clear all previous mappings for (int button_id = 0; button_id < Settings::NativeButton::NumButtons; ++button_id) { diff --git a/src/android/app/src/main/jni/native_log.cpp b/src/android/app/src/main/jni/native_log.cpp index e1f74d4701..29a33119e6 100644 --- a/src/android/app/src/main/jni/native_log.cpp +++ b/src/android/app/src/main/jni/native_log.cpp @@ -7,23 +7,23 @@ extern "C" { -void Java_org_suyu_suyu_1emu_utils_Log_debug(JNIEnv* env, jobject obj, jstring jmessage) { +void Java_dev_suyu_suyu_1emu_utils_Log_debug(JNIEnv* env, jobject obj, jstring jmessage) { LOG_DEBUG(Frontend, "{}", Common::Android::GetJString(env, jmessage)); } -void Java_org_suyu_suyu_1emu_utils_Log_warning(JNIEnv* env, jobject obj, jstring jmessage) { +void Java_dev_suyu_suyu_1emu_utils_Log_warning(JNIEnv* env, jobject obj, jstring jmessage) { LOG_WARNING(Frontend, "{}", Common::Android::GetJString(env, jmessage)); } -void Java_org_suyu_suyu_1emu_utils_Log_info(JNIEnv* env, jobject obj, jstring jmessage) { +void Java_dev_suyu_suyu_1emu_utils_Log_info(JNIEnv* env, jobject obj, jstring jmessage) { LOG_INFO(Frontend, "{}", Common::Android::GetJString(env, jmessage)); } -void Java_org_suyu_suyu_1emu_utils_Log_error(JNIEnv* env, jobject obj, jstring jmessage) { +void Java_dev_suyu_suyu_1emu_utils_Log_error(JNIEnv* env, jobject obj, jstring jmessage) { LOG_ERROR(Frontend, "{}", Common::Android::GetJString(env, jmessage)); } -void Java_org_suyu_suyu_1emu_utils_Log_critical(JNIEnv* env, jobject obj, jstring jmessage) { +void Java_dev_suyu_suyu_1emu_utils_Log_critical(JNIEnv* env, jobject obj, jstring jmessage) { LOG_CRITICAL(Frontend, "{}", Common::Android::GetJString(env, jmessage)); } diff --git a/src/android/app/src/main/res/layout/fragment_emulation.xml b/src/android/app/src/main/res/layout/fragment_emulation.xml index fb56b3c9d8..e43e9fe208 100644 --- a/src/android/app/src/main/res/layout/fragment_emulation.xml +++ b/src/android/app/src/main/res/layout/fragment_emulation.xml @@ -6,7 +6,7 @@ android:layout_height="match_parent" android:keepScreenOn="true" android:defaultFocusHighlightEnabled="false" - tools:context="org.suyu.suyu_emu.fragments.EmulationFragment" + tools:context="dev.suyu.suyu_emu.fragments.EmulationFragment" tools:openDrawer="start"> - - + app:argType="dev.suyu.suyu_emu.features.settings.model.Settings$MenuTag" /> + app:argType="dev.suyu.suyu_emu.features.settings.model.Settings$MenuTag" /> + app:argType="dev.suyu.suyu_emu.model.Game" /> @@ -157,19 +157,19 @@ app:destination="@id/perGamePropertiesFragment" /> + app:argType="dev.suyu.suyu_emu.model.Game" /> + app:argType="dev.suyu.suyu_emu.model.Game" /> diff --git a/src/android/app/src/main/res/navigation/settings_navigation.xml b/src/android/app/src/main/res/navigation/settings_navigation.xml index 94ba7b61a6..31993fb171 100644 --- a/src/android/app/src/main/res/navigation/settings_navigation.xml +++ b/src/android/app/src/main/res/navigation/settings_navigation.xml @@ -6,14 +6,14 @@ + app:argType="dev.suyu.suyu_emu.features.settings.model.Settings$MenuTag" /> diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml index 2eacae1d5c..6717a3527a 100644 --- a/src/android/app/src/main/res/values-ar/strings.xml +++ b/src/android/app/src/main/res/values-ar/strings.xml @@ -34,7 +34,7 @@ يسمح لـ يوزو بملء قائمة الألعاب تخطي تحديد مجلد الألعاب؟ لن يتم عرض الألعاب في قائمة الألعاب إذا لم يتم تحديد مجلد - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games البحث عن ألعاب إعدادات البحث تم تحديد مجلد الألعاب @@ -42,7 +42,7 @@ مطلوب لفك تشفير ألعاب البيع بالتجزئة تخطي إضافة المفاتيح؟ مطلوب مفاتيح صالحة لمحاكاة ألعاب البيع بالتجزئة. ستعمل تطبيقات البيرة المنزلية فقط إذا تابعت - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction الإشعارات امنح إذن الإشعار باستخدام الزر أدناه منح الإذن @@ -63,7 +63,7 @@ وحاول مرة أخر keys تحقق من أن ملف المفاتيح له امتداد وحاول مرة أخر bin تحقق من أن ملف المفاتيح له امتداد مفاتيح التشفير غير صالحة - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys الملف المحدد غير صحيح أو تالف. يرجى إعادة المفاتيح الخاصة بك GPU مدير برنامج تشغيل GPU تثبيت برنامج تشغيل @@ -107,7 +107,7 @@ لا يُسمح بتثبيت الألعاب الأساسية لتجنب التعارضات المحتملة. %1$d تم التثبيت بنجاح %1$d تمت الكتابة فوقه بنجاح - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates برامج التشغيل المخصصة غير مدعومة تحميل برنامج التشغيل المخصص غير معتمد حاليًا لهذا الجهاز.\nحدد هذا الخيار مرة أخرى في المستقبل لمعرفة ما إذا تمت إضافة الدعم! إدارة بيانات يوزو @@ -150,7 +150,7 @@ تم استيراد بيانات المستخدم بنجاح تم إلغاء التصدير https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu diff --git a/src/android/app/src/main/res/values-ckb/strings.xml b/src/android/app/src/main/res/values-ckb/strings.xml index bb630f934a..510b33bcad 100644 --- a/src/android/app/src/main/res/values-ckb/strings.xml +++ b/src/android/app/src/main/res/values-ckb/strings.xml @@ -1,7 +1,7 @@ - ئەم نەرمەکاڵایە یارییەکانی کۆنسۆلی نینتێندۆ سویچ کارپێدەکات. هیچ ناونیشانێکی یاری و کلیلی تێدا نییە..<br /><br />پێش ئەوەی دەست پێ بکەیت، تکایە شوێنی فایلی prod.keys ]]> دیاریبکە لە نێو کۆگای ئامێرەکەت.<br /><br />زیاتر فێربە]]> + ئەم نەرمەکاڵایە یارییەکانی کۆنسۆلی نینتێندۆ سویچ کارپێدەکات. هیچ ناونیشانێکی یاری و کلیلی تێدا نییە..<br /><br />پێش ئەوەی دەست پێ بکەیت، تکایە شوێنی فایلی prod.keys ]]> دیاریبکە لە نێو کۆگای ئامێرەکەت.<br /><br />زیاتر فێربە]]> ئاگاداری و هەڵەکان ئاگادارکردنەوەکان پیشان دەدات کاتێک شتێک بە هەڵەدا دەچێت. مۆڵەتی ئاگادارکردنەوە نەدراوە! @@ -32,14 +32,14 @@ ڕێگە بە یوزو دەدات بۆ پڕکردنەوەی لیستی یارییەکان هەڵبژاردنی فۆڵدەری یارییەکان تێپەڕدەکەیت؟ یارییەکان لە لیستی یارییەکاندا پیشان نادرێن ئەگەر فۆڵدەرێک هەڵنەبژێردرێت. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games گەڕان بەدوای یارییەکاندا ناونیشانی یارییەکان هەڵبژێردرا دابمەزرێنە prod.keys پێویستە بۆ کۆدکردنەوەى یارییە تاکەکەسییەکان زیادکردنی کلیلەکان تێپەڕدەکەیت؟ کلیلی دروست پێویستە بۆ وەرگرتنی یارییەکانی تاکەکەسی. تەنها ئەپەکانی homebrew کاردەکەن ئەگەر بەردەوام بیت. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction ئاگادارکردنەوەکان بە دوگمەی خوارەوە مۆڵەتی ئاگادارکردنەوەکە بدە. مۆڵەت بدە @@ -60,7 +60,7 @@ دڵنیابەوە کە فایلی کلیلەکانت درێژکراوەی .keys ی هەیە و دووبارە هەوڵبدەرەوە. دڵنیابە کە فایلی کلیلەکانت درێژکراوەی .bin ی هەیە و دووبارە هەوڵبدەرەوە. کلیلی کۆدکردنی نادروستە - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys فایلە هەڵبژێردراوەکە هەڵەیە یان تێکچووە. تکایە دووبارە کلیلەکانت دەربێنەوە. دامەزراندنی وەگەڕخەری GPU دامەزراندنی وەگەڕخەری بەدیل بۆ ئەوەی بە ئەگەرێکی زۆرەوە کارایی باشتر یان وردبینی هەبێت @@ -94,8 +94,8 @@ هیچ فایلێکی لۆگ نەدۆزراوە دامەزراندنی ناوەڕۆکی یاری دامەزراندنی نوێکاری یارییەکان یان DLC - https://suyu-emu.org/help/quickstart/#dumping-installed-updates - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-decryption-keys گایا ڕاستەقینە نییە @@ -107,7 +107,7 @@ ئەو پڕۆژانەی کە یوزوی بۆ ئەندرۆید ڕەخساند بونیات https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -246,7 +246,7 @@ وەشان ڕۆمەکەت کۆدکراوە - prod.keys فایلەکەت بۆ ئەوەی بتوانرێت یارییەکان کۆد بکرێنەوە.]]> + prod.keys فایلەکەت بۆ ئەوەی بتوانرێت یارییەکان کۆد بکرێنەوە.]]> هەڵەیەک لە دەستپێکردنی ناوەکی ڤیدیۆکەدا ڕوویدا ئەمەش بەزۆری بەهۆی وەگەڕخەرێکی ناتەبای GPU ەوەیە. دامەزراندنی وەگەڕخەری GPU ی تایبەتمەندکراو لەوانەیە ئەم کێشەیە چارەسەر بکات. ناتوانرێت ڕۆم باربکرێت diff --git a/src/android/app/src/main/res/values-cs/strings.xml b/src/android/app/src/main/res/values-cs/strings.xml index 6d09b552cd..4318d89afd 100644 --- a/src/android/app/src/main/res/values-cs/strings.xml +++ b/src/android/app/src/main/res/values-cs/strings.xml @@ -26,10 +26,10 @@ Hledat a filtrovat hry Vybrat složku s hrami Spravovat složky s hrami - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Instalovat prod.keys Přeskočit přidávání klíčů? - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Oznámení Udělit oprávnění Přeskočit udělení oprávnění k oznámení? @@ -47,7 +47,7 @@ Klíče úspěšně nainstalovány Chyba při čtení šifrovacích klíčů Neplatné šifrovací klíče - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Správce ovladače GPU Instalovat GPU ovladač Pokročilé nastavení @@ -97,7 +97,7 @@ Uživatelská data byla úspěšně importována. Export zrušen https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu https://play.google.com/store/apps/details?id=org.suyu.suyu_emu.ea diff --git a/src/android/app/src/main/res/values-de/strings.xml b/src/android/app/src/main/res/values-de/strings.xml index 8a69115433..b74c08c6ce 100644 --- a/src/android/app/src/main/res/values-de/strings.xml +++ b/src/android/app/src/main/res/values-de/strings.xml @@ -1,7 +1,7 @@ - Diese Software kann Spiele für die Nintendo Switch abspielen. Keine Spiele oder Spielekeys sind enthalten.<br /><br />Bevor du beginnst, bitte halte deine prod.keys ]]> auf deinem Gerät bereit. .<br /><br />Mehr Infos]]> + Diese Software kann Spiele für die Nintendo Switch abspielen. Keine Spiele oder Spielekeys sind enthalten.<br /><br />Bevor du beginnst, bitte halte deine prod.keys ]]> auf deinem Gerät bereit. .<br /><br />Mehr Infos]]> Hinweise und Fehler Zeigt Benachrichtigungen an, wenn etwas schief läuft. Berechtigung für Benachrichtigungen nicht erlaubt! @@ -35,7 +35,7 @@ Erlaubt suyu die Spieleliste zu füllen Auswahl des Spieleverzeichnisses überspringen? Spiele werden in der Spieleliste nicht angezeigt, wenn kein Ordner ausgewählt ist. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Spiele suchen Einstellungen suchen Spieleverzeichnis ausgewählt @@ -43,7 +43,7 @@ Zum Entschlüsseln von Spielen benötigt Hinzufügen der Schlüssel überspringen? Für die Emulation von Spielen sind gültige Schlüssel erforderlich. Wenn du fortfährst, funktionieren nur Homebrew-Anwendungen. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Benachrichtigungen Erteile mit dem Knopf unten die Berechtigung, Benachrichtigungen zu senden. Berechtigung erteilen @@ -63,7 +63,7 @@ Überprüfen Sie, ob Ihre Schlüsseldatei die Erweiterung \".keys\" hat, und versuchen Sie es erneut. Überprüfen Sie, ob Ihre Schlüsseldatei die Erweiterung \".bin\" hat, und versuchen Sie es erneut. Ungültige Schlüssel - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Die ausgewählte Datei ist falsch oder beschädigt. Bitte kopieren Sie Ihre Schlüssel erneut. GPU-Treiber Verwaltung GPU-Treiber installieren @@ -108,12 +108,12 @@ Wirklich fortfahren? %1$d Installationsfehler %1$d erfolgreich installiert %1$d erfolgreich überschrieben - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates suyu-Daten Verwalten Speicherdaten teilen Spiele-Ordner Spiele-Ordner hinzufügen - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Firmware nicht installiert @@ -132,7 +132,7 @@ Wirklich fortfahren? Nutzerdaten erfolgreich importiert Export abgebrochen https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -319,7 +319,7 @@ Wirklich fortfahren? Integritätsüberprüfung konnte nicht durchgeführt werden Das ROM ist verschlüsselt - prod.keys Datei installiert ist, damit Spiele entschlüsselt werden können.]]> + prod.keys Datei installiert ist, damit Spiele entschlüsselt werden können.]]> Bei der Initialisierung des Videokerns ist ein Fehler aufgetreten Dies wird normalerweise durch einen inkompatiblen GPU-Treiber verursacht. Die Installation eines passenden GPU-Treibers kann dieses Problem beheben. ROM konnte nicht geladen werden diff --git a/src/android/app/src/main/res/values-es/strings.xml b/src/android/app/src/main/res/values-es/strings.xml index ebe05df24a..7262bff489 100644 --- a/src/android/app/src/main/res/values-es/strings.xml +++ b/src/android/app/src/main/res/values-es/strings.xml @@ -1,7 +1,7 @@ - Este software ejecuta juegos para la videoconsola Nintendo Switch. Los videojuegos o claves no vienen incluidos.<br /><br />Antes de empezar, por favor, localice el archivo prod.keys ]]>en el almacenamiento de su dispositivo..<br /><br />Saber más]]> + Este software ejecuta juegos para la videoconsola Nintendo Switch. Los videojuegos o claves no vienen incluidos.<br /><br />Antes de empezar, por favor, localice el archivo prod.keys ]]>en el almacenamiento de su dispositivo..<br /><br />Saber más]]> Avisos y errores Mostrar notificaciones cuándo algo vaya mal. ¡Permisos de notificación no concedidos! @@ -35,7 +35,7 @@ Permite que suyu llene la lista de juegos ¿Omitir la selección de la carpeta de juegos? No se mostrará ningún juego si no se ha seleccionado una carpeta de juegos. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Buscar juegos Buscar configuración Directorio de juegos seleccionado @@ -43,7 +43,7 @@ Requerido para descifrar juegos ¿Omitir agregar claves? Se requieren claves válidas para emular juegos. Solo las aplicaciones homebrew funcionarán si continúas. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Notificaciones Otorga el permiso de notificación con el botón de abajo. Conceder permiso @@ -64,7 +64,7 @@ Compruebe que el archivo de claves tenga una extensión .keys y pruebe otra vez. Compruebe que el archivo de claves tenga una extensión .bin y pruebe otra vez. Claves de cifrado no válidas - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys El archivo seleccionado es incorrecto o está corrupto. Vuelva a redumpear sus claves. Explorador de drivers de GPU Instalar driver de GPU @@ -114,7 +114,7 @@ Contenido(s) de juego instalado/s con éxito %1$d instalado con éxito %1$d sobreescrito con éxito - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates Drivers personalizados no soportados En estos momentos, la carga de drivers personalizados no está disponible para este dispositivo..\n¡Comprueba esta opción en el futuro para ver si ya está añadido el soporte a ese dispositivo! Administrar datos de suyu @@ -141,14 +141,14 @@ Comprueba todo el contenido instalado por si hubiese alguno corrupto Faltan las claves de encriptación El firmware y los juegos no se pueden desencriptar - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Ejecutador de applet Ejecutar applets de sistema usando el firmware instalado Firmware no instalado Applet no disponible - prod.keys y el firmware estén instalados e inténtelo de nuevo.]]> + prod.keys y el firmware estén instalados e inténtelo de nuevo.]]> Álbum Ver las imágenes que están en la carpeta \"screenshots\" del usuario con el visor de fotos del sistema Editor de Mii @@ -181,7 +181,7 @@ Exportación cancelada Asegúrese de que las carpetas de datos de usuario estén en la raíz de la carpeta del zip y contengan un archivo config en config/config.ini e inténtelo de nuevo. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -410,8 +410,8 @@ Su ROM está encriptada - cartuchos de juegos o títulos instalados.]]> - prod.keys está instalado, para que los juegos sean descifrados.]]> + cartuchos de juegos o títulos instalados.]]> + prod.keys está instalado, para que los juegos sean descifrados.]]> Ocurrió un error al inicializar el núcleo de video, posiblemente debido a una incompatibilidad con el driver seleccionado Esto suele deberse a un driver de GPU incompatible. La instalación de un controlador de GPU personalizado puede resolver este problema. No se pudo cargar la ROM diff --git a/src/android/app/src/main/res/values-fa/strings.xml b/src/android/app/src/main/res/values-fa/strings.xml index 8112b8a853..884e9e4334 100644 --- a/src/android/app/src/main/res/values-fa/strings.xml +++ b/src/android/app/src/main/res/values-fa/strings.xml @@ -35,7 +35,7 @@ به suyu اجازه می دهد تا لیست باز‌ی‌ها را پر کند از انتخاب پوشه بازی رد می‌شوید؟ اگر پوشه‌ای انتخاب نشده باشد، بازی‌ها در لیست بازی‌ها نمایش داده نمی‌شوند. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games جستجو در بازی‌ها جستجو در تنظیمات پوشه بازی‌ها انتخاب شد @@ -43,7 +43,7 @@ برای رمزگشایی بازی‌های فروشگاهی مورد نیاز است افزودن کلیدها را رد می‌کنید؟ کلیدهای معتبر برای شبیه‌سازی بازی‌های فروشگاهی مورد نیاز است. اگر ادامه دهید، فقط برنامه‌های سیستم ریزکامپیوتری کار خواهند کرد. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction اعلان‌ها مجوز اعلان را با دکمه زیر اعطا کنید. اجازه بدهید @@ -64,7 +64,7 @@ بررسی کنید که فایل کلیدهای شما دارای پسوند keys. باشد و دوباره امتحان کنید. بررسی کنید که فایل کلیدهای شما دارای پسوند bin. باشد و دوباره امتحان کنید. کلیدهای رمزگذاری نامعتبر - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys فایل انتخابی نادرست یا خراب است. لطفا کلیدهای خود را دوباره استخراج کنید. مدیریت درایور پردازنده گرافیکی نصب درایور پردازنده گرافیکی @@ -114,7 +114,7 @@ محتوا(های) بازی با موفقیت نصب شد %1$dبا موفقیت نصب شد %1$dبا موفقیت بازنویسی شد - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates درایورهای سفارشی پشتیبانی نمی‌شوند بارگیری درایور سفارشی در حال حاضر برای این دستگاه پشتیبانی نمی‌شود.\nاین گزینه را دوباره در آینده بررسی کنید تا ببینید آیا پشتیبانی اضافه شده است یا خیر! مدیریت داده‌های suyu @@ -139,14 +139,14 @@ تمام محتوای نصب شده را از نظر خرابی بررسی می‌کند کلیدهای رمزگذاری وجود ندارند ثابت‌افزار و بازی‌های فروشگاهی قابل رمزگشایی نیستند - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys اجراکننده برنامک برنامک‌های سیستم را با استفاده از ثابت‌افزار نصب شده راه اندازی کنید ثابت‌افزار نصب نیست برنامک در دسترس نیست - prod.keys و ثابت‌افزار شما نصب شده است و دوباره امتحان کنید.]]> + prod.keys و ثابت‌افزار شما نصب شده است و دوباره امتحان کنید.]]> آلبوم تصاویر ذخیره شده در پوشه اسکرین شات‌های کاربر را با نمایشگر عکس سیستم مشاهده کنید ویرایش Mii @@ -179,7 +179,7 @@ صدور لغو شد مطمئن شوید که پوشه‌های داده کاربر در ریشه پوشه zip و حاوی یک فایل پیکربندی در config/config.ini هستند سپس دوباره امتحان کنید. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -410,7 +410,7 @@ رام شما رمزگذاری شده است - کارتیج‌های بازی یا عناوین نصب شده خود را استخراج کنید.]]> + کارتیج‌های بازی یا عناوین نصب شده خود را استخراج کنید.]]> در راه‌اندازی اولیه هسته ویدیو خطایی رخ داد این مورد معمولاً توسط یک درایور گرافیکی ناسازگار ایجاد می‌شود. نصب درایور گرافیکی سفارشی ممکن است این مشکل را حل کند. diff --git a/src/android/app/src/main/res/values-fr/strings.xml b/src/android/app/src/main/res/values-fr/strings.xml index f98ea6a35f..34bfd2cb79 100644 --- a/src/android/app/src/main/res/values-fr/strings.xml +++ b/src/android/app/src/main/res/values-fr/strings.xml @@ -1,7 +1,7 @@ - Ce logiciel exécutera des jeux pour la console de jeu Nintendo Switch. Aucun jeux ou clés n\'est inclus.<br /><br />Avant de commencer, veuillez localiser votre fichier prod.keys ]]> sur le stockage de votre appareil.<br /><br />En savoir plus]]> + Ce logiciel exécutera des jeux pour la console de jeu Nintendo Switch. Aucun jeux ou clés n\'est inclus.<br /><br />Avant de commencer, veuillez localiser votre fichier prod.keys ]]> sur le stockage de votre appareil.<br /><br />En savoir plus]]> Avis et erreurs Affiche des notifications en cas de problème. Permission de notification non accordée ! @@ -35,7 +35,7 @@ Permet à suyu de remplir la liste des jeux Ne pas sélectionner le dossier des jeux ? Les jeux ne seront pas affichés dans la liste des jeux si aucun dossier n\'est sélectionné. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Rechercher des jeux Rechercher un paramètre Répertoire de jeux sélectionné @@ -43,7 +43,7 @@ Nécessaire pour décrypter les jeux commerciaux. Sauter l\'ajout des clés ? Des clés valides sont nécessaires pour émuler des jeux commerciaux. Seules les applications homebrew fonctionneront si vous continuez. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Notifications Accorder la permission de notification avec le bouton ci-dessous. Accorder la permission @@ -64,7 +64,7 @@ Vérifiez que votre fichier de clés a une extension .keys et réessayez. Vérifiez que votre fichier de clés a une extension .bin et réessayez. Clés de chiffrement invalides - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Le fichier sélectionné est incorrect ou corrompu. Veuillez dumper à nouveau vos clés. Gestionnaire de pilotes du GPU Installer le pilote du GPU @@ -114,7 +114,7 @@ Contenu du jeu installé avec succès %1$d installé avec succès %1$d écrasé avec succès - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates Pilotes personnalisés non supporté Le chargement des pilotes personnalisés ne sont pas actuellement pris en charge pour ce périphérique. Vérifiez à nouveau cette option à l\'avenir pour voir si la prise en charge a été ajoutée ! Gérer les données de suyu @@ -141,14 +141,14 @@ Vérifie l\'intégrité des contenus installés Les clés de chiffrement sont manquantes. Le firmware et les jeux commerciaux ne peuvent pas être déchiffrés - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Lanceur d\'applets Lancer des applets système en utilisant le firmware installé Firmware non installé Applet non disponible - prod.keys et le firmware sont installés et essayez à nouveau.]]> + prod.keys et le firmware sont installés et essayez à nouveau.]]> Album Afficher les images stockées dans le dossier de captures d\'écran de l\'utilisateur avec le visualiseur de photos système. Éditeur Mii @@ -181,7 +181,7 @@ Exportation annulée Assurez-vous que les dossiers de données utilisateur se trouvent à la racine du dossier ZIP et contiennent un fichier de configuration à config/config.ini, puis réessayez. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -460,8 +460,8 @@ Votre ROM est cryptée - cartouches de jeu ou de vos titres installés.]]> - prod.keys est installé pour que les jeux puissent être déchiffrés.]]> + cartouches de jeu ou de vos titres installés.]]> + prod.keys est installé pour que les jeux puissent être déchiffrés.]]> Une erreur s\'est produite lors de l\'initialisation du noyau vidéo Cela est généralement dû à un pilote GPU incompatible. L\'installation d\'un pilote GPU personnalisé peut résoudre ce problème. Impossible de charger la ROM diff --git a/src/android/app/src/main/res/values-he/strings.xml b/src/android/app/src/main/res/values-he/strings.xml index f1087d6131..ee8be05463 100644 --- a/src/android/app/src/main/res/values-he/strings.xml +++ b/src/android/app/src/main/res/values-he/strings.xml @@ -1,7 +1,7 @@ - התוכנה תריץ משחקים לקונסולת ה Nintendo Switch. אף משחק או קבצים בעלי זכויות יוצרים נכללים.<br /><br /> לפני שאת/ה מתחיל בבקשה מצא את קובץ prod.keys]]> על המכשיר.<br /><br />קרא עוד]]> + התוכנה תריץ משחקים לקונסולת ה Nintendo Switch. אף משחק או קבצים בעלי זכויות יוצרים נכללים.<br /><br /> לפני שאת/ה מתחיל בבקשה מצא את קובץ prod.keys]]> על המכשיר.<br /><br />קרא עוד]]> התראות ותקלות מציג התראות כאשר משהו הולך לא כשורה. הרשאות התראות לא ניתנה! @@ -35,7 +35,7 @@ אפשר ל suyu לאכלס את רשימת המשחקים לדלג על בחירת תיקיית המשחקים? משחקים לא יוצגו ברשימת המשחקים אם לנבחרה תיקיית משחקים. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games חפש משחקים חפש בהגדרות ספריית משחקים נבחרה @@ -43,7 +43,7 @@ הכרחי בכדי לפענח משחקים לדלג על הוספת מפתחות? מפתחות חוקיים הכרחיים כדי לשחק במשחקים. רק אפליקציות פירטיות יפעלו אם תמשיך. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction התראות תן גישה להתראות עם הכפתור למטה. תן הרשאה @@ -64,7 +64,7 @@ ודא שלקובץ המפתחות שלך יש סיומת של key. ונסה/י שוב. ודא/י שלקובץ המפתחות שלך יש סיומת של bin. ונסה/י שוב. מפתחות הצפנה לא חוקיים - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys קבוץ שנבחר מושחת או לא נכון. בבקשה הוצא מחדש את המפתחות שלך. מנהל הדרייברים של המעבד הגרפי התקן דרייבר למעבד הגרפי @@ -114,7 +114,7 @@ תוכן (או תכני) המשחק הותקנו בהצלחה %1$d הותקן בהצלחה %1$d נדרס/נכתב מעל בהצלחה - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates דרייברים מותאמים אישית לא נתמכים הטענת דרייבים מותאמים אישית לא נתמך כרגע על מכשיר זה. \nבבקשה בדוק אופציה זו בעתיד בכדי לראות אם נוספה תמיכה! נהל את המידע של suyu @@ -126,14 +126,14 @@ הוסף תיקיית משחקים התיקייה הזו נוספה כבר! מאפייני תיקיית משחקים - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys משגר Applet מערכת שיגור Applet משתמשת בתוכנה המותקנת ה Firmware לא מותקן Applet לא זמין - prod.keysו firmwareשלך מותקנים ונסה שוב.]]> + prod.keysו firmwareשלך מותקנים ונסה שוב.]]> אלבום צפה בתמונות השמורות בתיקיית צילומי המסך של המשתמש בעזרת מציג התמונות של המערכת עורך Mii @@ -166,7 +166,7 @@ ייצוא בוטל ודא שנתוני המשתמש נמצאים בשורש קובץ ה zip ושהוא מכיל קובץ סידור ב config/config.ini ונסה שוב. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -325,8 +325,8 @@ אימות התקינות הצליח! המשחק שלך מוצפן - כרטיסי המשחקאו הכותרות המותקנות שלך.]]> - prod.keys מותקן כך שניתן יהיה לפענח משחקים.]]> + כרטיסי המשחקאו הכותרות המותקנות שלך.]]> + prod.keys מותקן כך שניתן יהיה לפענח משחקים.]]> התרחשה בעיה באתחול של ליבת הווידאו זה בדרך כלל נגרם על ידי דרייבר לא מתאים עבור המעבד הגרפי. התקנת דרייבר אשר מתאים למעבד הגרפי יכול לפתור את הבעיה הזו. אין אפשרות לטעון את המשחק diff --git a/src/android/app/src/main/res/values-hu/strings.xml b/src/android/app/src/main/res/values-hu/strings.xml index 098d65f9fa..61d44a91fe 100644 --- a/src/android/app/src/main/res/values-hu/strings.xml +++ b/src/android/app/src/main/res/values-hu/strings.xml @@ -1,7 +1,7 @@ - Ez a szoftver Nintendo Switch játékkonzolhoz készült játékokat futtat. Nem tartalmaz játékokat vagy kulcsokat. .<br /><br />Mielőtt hozzákezdenél, kérjük, válaszd ki a prod.keys]]> fájl helyét a készülék tárhelyén<br /><br />Tudj meg többet]]> + Ez a szoftver Nintendo Switch játékkonzolhoz készült játékokat futtat. Nem tartalmaz játékokat vagy kulcsokat. .<br /><br />Mielőtt hozzákezdenél, kérjük, válaszd ki a prod.keys]]> fájl helyét a készülék tárhelyén<br /><br />Tudj meg többet]]> Megjegyzések és hibák Értesítések megjelenítése, ha valami rosszul sül el. Nincs engedély az értesítés megjelenítéséhez! @@ -34,7 +34,7 @@ Játékmappák kezelése Kihagyod a játékok mappa kiválasztását? A játékok nem jelennek meg a Játékok listában, ha egy mappa nincs kijelölve. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Játékok keresése Beállítások keresése Játékok könyvtár kiválasztva @@ -42,7 +42,7 @@ Kiskereskedelmi játékok dekódolásához szükséges Kihagyod a kulcsok hozzáadását? A kiskereskedelmi játékok emulálásához érvényes kulcsokra van szükség. Csak a homebrew alkalmazások fognak működni, ha folytatod. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Értesítések Értesítési engedélyek megadása az alábbi gombbal. Engedély megadása @@ -63,7 +63,7 @@ Győződj meg róla, hogy a titkosító fájlod .keys kiterjesztéssel rendelkezik, majd próbáld újra. Győződj meg róla, hogy a titkosító fájlod .bin kiterjesztéssel rendelkezik, majd próbáld újra. Érvénytelen titkosítókulcsok - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys A kiválasztott fájl helytelen, vagy sérült. Állíts össze egy új kulcsot. GPU illesztőprogram-kezelő GPU illesztőprogram telepítése @@ -112,7 +112,7 @@ Játéktartalom sikeresen telepítve %1$d sikeresen telepítve %1$d sikeresen felülírva - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates Egyéni illesztőprogramok nem támogatottak Egyéni illesztőprogram telepítése jelenleg nem támogatott ezen az eszközön.\nNézz vissza később, hátha hozzáadtuk a támogatását! suyu adatok kezelése @@ -137,14 +137,14 @@ A telepített tartalom épségét ellenőrzi Hiányzó titkosítókulcsok A Firmware és a kiskereskedelmi (retail) játékok nem dekódolhatók - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Applet indító Rendszer appletek indítása a telepített firmware-rel Firmware nincs telepítve Applet nem elérhető - prod.keys fájl és a firmware telepítve van, majd próbáld újra.]]> + prod.keys fájl és a firmware telepítve van, majd próbáld újra.]]> Album Képernyőképek megtekintése a rendszer fényképnézegetőjével Mii szerkesztés @@ -176,7 +176,7 @@ Exportálás megszakítva Ellenőrizd, hogy a felhasználói adatok mappái a zip mappa gyökerében vannak, és tartalmaznak egy konfig fájlt a config/config.ini címen, majd próbáld meg újra. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -448,7 +448,7 @@ ROM titkosítva - prod.keys fájl telepítve van, hogy a játékok visszafejthetők legyenek.]]> + prod.keys fájl telepítve van, hogy a játékok visszafejthetők legyenek.]]> Hiba lépett fel a videómag inicializása során Ezt általában egy nem kompatibilis GPU illesztő okozza. Egyéni GPU illesztőprogram telepítése megoldhatja a problémát. Nem sikerült betölteni a ROM-ot diff --git a/src/android/app/src/main/res/values-id/strings.xml b/src/android/app/src/main/res/values-id/strings.xml index c8437b45c1..b80ceb837b 100644 --- a/src/android/app/src/main/res/values-id/strings.xml +++ b/src/android/app/src/main/res/values-id/strings.xml @@ -1,7 +1,7 @@ - Perangkat lunak ini akan menjalankan game untuk konsol game Nintendo Switch. Tidak ada judul game atau kunci yang disertakan.<br /><br />Sebelum memulai, harap cari file prod.keys ]]> di penyimpanan perangkat anda. <br /><br /> Selengkapnya ]]> + Perangkat lunak ini akan menjalankan game untuk konsol game Nintendo Switch. Tidak ada judul game atau kunci yang disertakan.<br /><br />Sebelum memulai, harap cari file prod.keys ]]> di penyimpanan perangkat anda. <br /><br /> Selengkapnya ]]> Pemberitahuan dan error Menampilkan pemberitahuan ketika terjadi kesalahan. Izin notifikasi tidak diberikan! @@ -35,7 +35,7 @@ Izinkan suyu mengisi daftar game Lewati pemilihan folder game? Game tidak akan muncul di list jika tidak ada folder yang dipilih. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Cari permainan Cari pengaturan Direktori game sudah terpilih @@ -43,7 +43,7 @@ Diperlukan untuk mendekripsi game retail Lewati penginstalan keys? Perlu keys yang valid untuk meng-emulate game retail. Hanya homebrew apps yang akan berfungsi jika kamu melanjutkan. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Notifikasi Berikan izin notifikasi dengan tombol di bawah ini. Berikan izin @@ -64,7 +64,7 @@ Pastikan file keys anda memiliki format .keys dan coba lagi. Pastikan file keys anda memiliki format .bin dan coba lagi. Keys enkripsi tidak valid - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys File yang dipilih salah atau rusak. Silakan masukkan kembali kunci Anda. Manajer driver GPU Install driver GPU @@ -114,7 +114,7 @@ Konten(-konten) game sudah berhasil terinstal. %1$d telah berhasil terinstal %1$d telah berhasil ditimpa. - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates Driver kustom tidak didukung Driver kustom saat ini tidak dapat digunakan pada perangkat ini. \nCek opsi ini lain waktu untuk mengetahui apakah dapat digunakan! Kelola data Suyu. @@ -137,7 +137,7 @@ Memeriksa semua konten yang terinstal dari kerusakan Kunci enkripsi hilang Firmware dan game retail tidak dapat didekripsi - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Luncurkan applet @@ -177,7 +177,7 @@ Ekspor Dibatalkan Pastikan folder data pengguna berada di akar folder zip dan berisi file konfigurasi di config/config.ini dan coba lagi. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -402,8 +402,8 @@ ROM-mu ter-enkripsi - kartu permainan atau judul yang terinstal.]]> - prod.keys diinstal sehingga game dapat didekripsi.]]> + kartu permainan atau judul yang terinstal.]]> + prod.keys diinstal sehingga game dapat didekripsi.]]> Terjadi kesalahan ketika menginisialisasi inti video. Hal ini biasanya disebabkan oleh driver GPU yang tidak kompatibel. Menginstal driver GPU khusus dapat mengatasi masalah ini Tidak Dapat Memuat ROM diff --git a/src/android/app/src/main/res/values-it/strings.xml b/src/android/app/src/main/res/values-it/strings.xml index 10552f1504..7a923d2fc3 100644 --- a/src/android/app/src/main/res/values-it/strings.xml +++ b/src/android/app/src/main/res/values-it/strings.xml @@ -1,7 +1,7 @@ - Questo software permette di giocare ai giochi della console Nintendo Switch. Nessun gioco o chiave è inclusa.<br /><br />Prima di iniziare, perfavore individua il file prod.keys ]]> nella memoria del tuo dispositivo.<br /><br />Scopri di più]]> + Questo software permette di giocare ai giochi della console Nintendo Switch. Nessun gioco o chiave è inclusa.<br /><br />Prima di iniziare, perfavore individua il file prod.keys ]]> nella memoria del tuo dispositivo.<br /><br />Scopri di più]]> Avvisi ed errori Mostra le notifiche quando qualcosa va storto. Autorizzazione di notifica non concessa! @@ -35,7 +35,7 @@ Consente a suyu di popolare l\'elenco dei giochi Saltare la selezione della cartella dei giochi? I giochi non saranno mostrati nella lista dei giochi se una cartella non è selezionata. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Cerca giochi Cerca impostazione Cartella dei giochi selezionata @@ -43,7 +43,7 @@ Necessario per decrittografare i giochi Saltare l\'aggiunta delle chiavi? Sono necessarie delle chiavi valide per emulare i giochi. Se continui, funzioneranno solo le app homebrew. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Notifiche Concedi l\'autorizzazione alle notifiche con il pulsante in basso. Concedere l\'autorizzazione @@ -64,7 +64,7 @@ Controlla che le tue chiavi abbiano l\'estensione .keys e prova di nuovo. Controlla che le tue chiavi abbiano l\'estensione .bin e prova di nuovo Chiavi di crittografia non valide - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Il file selezionato è incorretto o corrotto. Per favore riesegui il dump delle tue chiavi. Gestore driver GPU Installa i driver GPU @@ -114,7 +114,7 @@ Contenuto/i di gioco installato/i con successo. %1$dinstallato con successo. %1$dsovrascritto con successo - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates I driver personalizzati non sono supportati. I driver personalizzati non sono attualmente supportati su questo dispositivo.\n Ricontrolla in futuro. Gestisci i dati di Suyu @@ -129,14 +129,14 @@ Nessun salvataggio trovato Verifica i contenuti installati Verifica l\'integrità di tutti i contenuti installati. - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Avvia applet Avvia applet di sistema usando il firmware installato Firmware non installato Applet non disponibile - prod.keys e il firmware siano installati e riprova.]]> + prod.keys e il firmware siano installati e riprova.]]> Album Visualizza le immagini salvate nella cartella screenshots dell\'utente con il visualizzatore immagini di sistema Modifica Mii @@ -169,7 +169,7 @@ Esportazione annullata Assicurati che la cartella dei Dati dell\'utente stiano nella radice del file.zip e che sia presente una cartella config in config/config.ini, poi, riprova. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -364,8 +364,8 @@ L\'integrità dei contenuti non è stata validata La tua ROM è criptata - dump delle tue cartucce di giocooppure dei titoli già installati.]]> - prod.keys sia installato in modo che i giochi possano essere decrittati.]]> + dump delle tue cartucce di giocooppure dei titoli già installati.]]> + prod.keys sia installato in modo che i giochi possano essere decrittati.]]> È stato riscontrato un errore nell\'inizializzazione del core video Questo è causato solitamente dal driver incompatibile di una GPU. L\'installazione di driver GPU personalizzati potrebbe risolvere questo problema. Impossibile caricare la ROM diff --git a/src/android/app/src/main/res/values-ja/strings.xml b/src/android/app/src/main/res/values-ja/strings.xml index 21e2070e31..5294298faa 100644 --- a/src/android/app/src/main/res/values-ja/strings.xml +++ b/src/android/app/src/main/res/values-ja/strings.xml @@ -1,7 +1,7 @@ - このソフトウェアでは、Nintendo Switchのゲームを実行できます。 ゲームソフトやキーは含まれません。<br /><br />事前に、 prod.keys ]]> ファイルをストレージに配置しておいてください。<br /><br />詳細]]> + このソフトウェアでは、Nintendo Switchのゲームを実行できます。 ゲームソフトやキーは含まれません。<br /><br />事前に、 prod.keys ]]> ファイルをストレージに配置しておいてください。<br /><br />詳細]]> 通知とエラー 問題の発生時に通知を表示します。 通知が許可されていません! @@ -34,7 +34,7 @@ ゲームをsuyuのゲームリストに追加します ゲームフォルダの選択をスキップしますか? フォルダを選択しないと、ゲームがリストに表示されません。 - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games ゲームを検索 設定を検索 フォルダを選択しました @@ -42,7 +42,7 @@ 製品版ゲームの復号化に必要です キーの追加をスキップしますか? 製品版ゲームのエミュレーションには、有効なキーが必要です。続行すると自作アプリしか機能しません。 - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction 通知 下のボタンで通知を許可してください。 許可 @@ -63,7 +63,7 @@ キーの拡張子が.keysであることを確認し、再度お試しください。 キーの拡張子が.binであることを確認し、再度お試しください。 暗号化キーが無効 - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys ファイルが間違っているか破損しています。キーを再ダンプしてください。 GPUドライバーの管理 GPUドライバー @@ -107,11 +107,11 @@ ゲームコンテンツのインストールに成功しました %1$d のインストールに成功しました %1$d の上書きに成功しました - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates カスタムドライバはサポートされていません suyu データを管理 セーブファイルを共有 - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys ファームウェア未インストール アルバム @@ -133,7 +133,7 @@ ユーザデータのインポートに成功しました エクスポートをキャンセルしました https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -299,7 +299,7 @@ 整合性の確認に失敗しました! ROMが暗号化されています - prod.keys ファイルがインストールされていることを確認してください。]]> + prod.keys ファイルがインストールされていることを確認してください。]]> ビデオコアの初期化中にエラーが発生しました これは通常、互換性のないGPUドライバーが原因で発生します。 カスタムGPUドライバーをインストールすると、問題が解決する可能性があります。 ROMの読み込みに失敗しました diff --git a/src/android/app/src/main/res/values-ko/strings.xml b/src/android/app/src/main/res/values-ko/strings.xml index a2d2bb9511..4a32020520 100644 --- a/src/android/app/src/main/res/values-ko/strings.xml +++ b/src/android/app/src/main/res/values-ko/strings.xml @@ -1,7 +1,7 @@ - 이 소프트웨어는 Nintendo Switch 게임을 실행합니다. 게임 타이틀이나 키는 포함되어 있지 않습니다.<br /><br />시작하기 전에 장치 저장소에서 prod.keys ]]> 파일을 찾아주세요.<br /><br />자세히 알아보기]]> + 이 소프트웨어는 Nintendo Switch 게임을 실행합니다. 게임 타이틀이나 키는 포함되어 있지 않습니다.<br /><br />시작하기 전에 장치 저장소에서 prod.keys ]]> 파일을 찾아주세요.<br /><br />자세히 알아보기]]> 알림 및 오류 문제가 발생하면 알림을 표시합니다. 알림 권한이 부여되지 않았습니다! @@ -35,7 +35,7 @@ suyu에 게임 목록 추가하기 게임 폴더 선택을 건너뛰겠습니까? 폴더를 선택하지 않으면 게임 목록에 게임이 표시되지 않습니다. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games 게임 검색 검색 설정 게임 디렉터리를 설정했습니다. @@ -43,7 +43,7 @@ 패키지 게임 암호 해독에 필요 키 추가를 건너뛰겠습니까? 패키지 게임을 에뮬레이트하려면 유효한 키 값이 필요합니다. 이 단계를 건너뛰면 홈브류 게임만 실행할 수 있습니다. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction 알림 아래 버튼으로 알림 권한을 부여합니다. 알림 켜기 @@ -64,7 +64,7 @@ 키 파일의 확장자가 .keys인지 확인하고 다시 시도하세요. 키 파일의 확장자가 .bin인지 확인하고 다시 시도하세요. 암호화 키가 올바르지 않음 - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys 선택한 파일이 잘못되었거나 손상되었습니다. 키를 다시 덤프하세요. GPU 드라이버 관리자 GPU 드라이버 설치 @@ -114,7 +114,7 @@ 게임 콘텐츠 설치됨 %1$d개를 설치했습니다. %1$d개를 덮어씌웠습니다. - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates 사용자 지정 드라이버는 지원하지 않습니다. 이 장치의 사용자 지정 드라이버 로딩은 현재 지원하지 않습니다.\n나중에 이 옵션을 확인하면 지원이 추가되었는지 확인할 수 있습니다. suyu 데이터 관리 @@ -137,14 +137,14 @@ 전체 설치된 콘텐츠의 손상을 확인합니다. 암호화 키를 찾을 수 없음 펌웨어 및 패키지 게임을 해독할 수 없음 - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys 애플릿 런처 설치된 펌웨어를 사용해 시스템 애플릿을 실행합니다. 펌웨어가 설치되지 않았습니다. 애플릿을 사용할 수 없음 - prod.keys 파일과 펌웨어가 설치되었는지 확인하고 다시 시도하세요.]]> + prod.keys 파일과 펌웨어가 설치되었는지 확인하고 다시 시도하세요.]]> 앨범 시스템 사진 뷰어로 유저 스크린샷 폴더에 저장된 이미지를 확인합니다. Mii 편집 @@ -177,7 +177,7 @@ 내보내기 취소됨 유저 데이터 폴더가 ZIP 폴더의 루트 디렉토리에 위치하고 config/config.ini 구성 파일이 있는지 확인하고 다시 시도하세요. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -403,8 +403,8 @@ 롬 파일이 암호화되어있음 - 게임 카트리지 또는 설치된 타이틀을 다시 덤프하세요.]]> - prod.keys 파일이 설치되어 있는지 확인하세요.]]> + 게임 카트리지 또는 설치된 타이틀을 다시 덤프하세요.]]> + prod.keys 파일이 설치되어 있는지 확인하세요.]]> 비디오 코어를 초기화하는 동안 오류 발생 일반적으로 이 문제는 호환되지 않는 GPU 드라이버로 인해 발생합니다. 사용자 지정 GPU 드라이버를 설치하면 이 문제가 해결될 수 있습니다. 롬 파일을 불러올 수 없음 diff --git a/src/android/app/src/main/res/values-nb/strings.xml b/src/android/app/src/main/res/values-nb/strings.xml index 9ce92d899f..c9ba29339b 100644 --- a/src/android/app/src/main/res/values-nb/strings.xml +++ b/src/android/app/src/main/res/values-nb/strings.xml @@ -1,7 +1,7 @@ - Denne programvaren vil kjøre spill for Nintendo Switch-spillkonsollen. Ingen spilltitler eller nøkler er inkludert.<br /><br />Før du begynner, må du finne prod.keys ]]> filen din på enhetslagringen.<br /><br />Lær mer]]> + Denne programvaren vil kjøre spill for Nintendo Switch-spillkonsollen. Ingen spilltitler eller nøkler er inkludert.<br /><br />Før du begynner, må du finne prod.keys ]]> filen din på enhetslagringen.<br /><br />Lær mer]]> Merknader og feil Viser varsler når noe går galt. Varslingstillatelse ikke gitt! @@ -32,14 +32,14 @@ Gjør det mulig for suyu å fylle ut spillelisten. Hoppe over valg av spillmappe? Spill vises ikke i Spill-listen hvis en mappe ikke er valgt. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Søk i spill| Spillkatalogen er valgt Installer prod.keys Nødvendig for å dekryptere spill Hoppe over å legge til nøkler? Gyldige nøkler er påkrevd for å emulere spill. Bare hjemmebryggede apper vil fungere hvis du fortsetter. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Varsler Gi varslingstillatelse med knappen nedenfor. Gi tillatelse @@ -60,7 +60,7 @@ Kontroller at nøkkelfilen har filtypen .keys, og prøv igjen. Kontroller at nøkkelfilen har filtypen .bin, og prøv igjen. Ugyldige krypteringsnøkler - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Den valgte filen er feil eller ødelagt. Vennligst dump nøklene på nytt. Installer GPU-driver Installer alternative drivere for potensielt bedre ytelse eller nøyaktighet. @@ -94,8 +94,8 @@ Ingen loggfil funnet Installer spillinnhold Installer spilloppdateringer eller DLC - https://suyu-emu.org/help/quickstart/#dumping-installed-updates - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-decryption-keys Gaia er ikke ekte @@ -107,7 +107,7 @@ Prosjekter som gjør suyu for Android mulig Bygg https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -257,7 +257,7 @@ Integritetsverifisering mislyktes! ROM-en din er kryptert - prod.keys filen er installert slik at spillene kan dekrypteres.]]> + prod.keys filen er installert slik at spillene kan dekrypteres.]]> Det oppstod en feil ved initialisering av videokjernen Dette skyldes vanligvis en inkompatibel GPU-driver. Installering av en tilpasset GPU-driver kan løse problemet. Kunne ikke laste inn ROM diff --git a/src/android/app/src/main/res/values-pl/strings.xml b/src/android/app/src/main/res/values-pl/strings.xml index 02587fd8b1..fedb52c0da 100644 --- a/src/android/app/src/main/res/values-pl/strings.xml +++ b/src/android/app/src/main/res/values-pl/strings.xml @@ -1,7 +1,7 @@ - To oprogramowanie umożliwia uruchomienie gier z konsoli Nintendo Switch. Nie zawiera gier ani wymaganych kluczy.<br /><br />Zanim zaczniesz, wybierz plik kluczy prod.keys ]]> z katalogu w pamięci masowej.<br /><br />Dowiedz się więcej]]> + To oprogramowanie umożliwia uruchomienie gier z konsoli Nintendo Switch. Nie zawiera gier ani wymaganych kluczy.<br /><br />Zanim zaczniesz, wybierz plik kluczy prod.keys ]]> z katalogu w pamięci masowej.<br /><br />Dowiedz się więcej]]> Powiadomienia błędy Pokaż powiadomienie gdy coś pójdzie źle Nie zezwolono na powiadomienia! @@ -32,14 +32,14 @@ Pozwala suyu wygenerować listę gier Pominąć wybór folderu z grami? Aby pokazać listę gier wybierz katalog zawierający gry. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Szukaj gier Wybrano katalog gier Instaluj klucze prod.keys Wymagane aby poprawnie odczytać sklepowe gry Pominąć dodawanie kluczy? Poprawne klucze są wymagane aby emulować sklepowe gry. Jeśli przejdziesz dalej, jedynie homebrew będą działać. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Powiadomienia Nadaj uprawnienia dostępu do powiadomień. Nadaj uprawnienia @@ -60,7 +60,7 @@ Upewnij się że twoje klucze mają rozszerzenie .keys i spróbuj ponownie. Upewnij się że twoje klucze mają rozszerzenie .bin i spróbuj ponownie. Niepoprawne klucze - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Wybrany plik jest niepoprawny lub uszkodzony. Zrzuć ponownie swoje klucze. Zainstaluj sterownik GPU Użyj alternatywnych sterowników aby potencjalnie zwiększyć wydajność i naprawić błędy @@ -94,8 +94,8 @@ Nie znaleziono plików logów Zainstaluj zawartość gry Zainstaluj aktualizację gry lub dodatek DLC - https://suyu-emu.org/help/quickstart/#dumping-installed-updates - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-decryption-keys Gaia isn\'t real @@ -107,7 +107,7 @@ Projekty dzięki którym suyu mógł zostać stworzony Wersja https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -255,7 +255,7 @@ Dodatki Twój ROM jest zakodowany - prod.keys jest zainstalowany aby gry mogły zostać odczytane.]]> + prod.keys jest zainstalowany aby gry mogły zostać odczytane.]]> Błąd inicjacji podsystemu graficznego Zazwyczaj spowodowane niekompatybilnym sterownikiem GPU, instalacja niestandardowego sterownika może rozwiązać ten problem. Nie można wczytać pliku ROM diff --git a/src/android/app/src/main/res/values-pt-rBR/strings.xml b/src/android/app/src/main/res/values-pt-rBR/strings.xml index 3b3bf806b7..2abc99fb9f 100644 --- a/src/android/app/src/main/res/values-pt-rBR/strings.xml +++ b/src/android/app/src/main/res/values-pt-rBR/strings.xml @@ -1,7 +1,7 @@ - Este software executa jogos do console Nintendo Switch. Não estão inclusos nem jogos ou chaves.<br /><br />Antes de começar, por favor localize o arquivo prod.keys ]]> no armazenamento de seu dispositivo.<br /><br />Saiba mais]]> + Este software executa jogos do console Nintendo Switch. Não estão inclusos nem jogos ou chaves.<br /><br />Antes de começar, por favor localize o arquivo prod.keys ]]> no armazenamento de seu dispositivo.<br /><br />Saiba mais]]> Notificações e erros Mostra notificações quando algo dá errado. Acesso às notificações não concedido! @@ -35,7 +35,7 @@ Permite que o Suyu preencha a lista de jogos Ignorar a seleção da pasta de jogos? Os jogos não serão exibidos na lista de jogos se uma pasta não estiver selecionada. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Procurar jogos Procurar nas configurações Pasta de jogos selecionada @@ -43,7 +43,7 @@ Necessárias para desencriptar jogos comerciais Ignorar a adição de chaves? São necessárias chaves válidas para emular jogos comerciais. Somente aplicativos homebrew funcionarão se você continuar. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Notificações Conceda a permissão de notificação com o botão abaixo. Conceder permissão @@ -64,7 +64,7 @@ Verifique se seu arquivo de chaves possui a extensão .keys e tente novamente. Verifique se seu arquivo de chaves possui a extensão .bin e tente novamente. Chaves de encriptação inválidas - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys O arquivo selecionado está incorreto ou corrompido. Por favor extraia suas chaves novamente. Gerenciador de driver de GPU Instalar driver para GPU @@ -114,7 +114,7 @@ Conteúdo(s) de jogo instalado(s) com sucesso %1$d instalado com sucesso %1$d substituído com sucesso - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates Drivers personalizados não suportados Carregamento de drivers personalizados não suportado para este dispositivo no momento.\nVerifique essa opção novamente no futuro para ver se o suporte foi adicionado! Administrar dados do suyu @@ -141,14 +141,14 @@ Verifica todo o conteúdo instalado em busca de dados corrompidos Faltando chaves de encriptação O firmware e jogos comerciais não poderão ser decriptados - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Launcher de miniaplicativos Execute miniaplicativos do sistema usando o firmware instalado Firmware não instalado Miniaplicativo não disponível - prod.keys e o firmware estão instalados e tente novamente.]]> + prod.keys e o firmware estão instalados e tente novamente.]]> Álbum Visualize imagens armazenadas na pasta de capturas de telas do usuário com o visualizador de imagens do sistema Editor de Mii @@ -181,7 +181,7 @@ Exportação cancelada Verifique se as pastas de dados do usuário estão na raiz da pasta zip, se possuem um arquivo de configuração em config/config.ini e tente novamente. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -461,8 +461,8 @@ uma tentativa de mapeamento automático Sua ROM está encriptada - cartuchos de jogos ou títulos instalados.]]> - prod.keys está instalado para que os jogos possam ser decriptados.]]> + cartuchos de jogos ou títulos instalados.]]> + prod.keys está instalado para que os jogos possam ser decriptados.]]> Ocorreu um erro ao iniciar o núcleo de vídeo. Isto é normalmente causado por um driver de GPU incompatível. Instalar um driver de GPU personalizado pode resolver este problema. Impossível carregar a ROM diff --git a/src/android/app/src/main/res/values-pt-rPT/strings.xml b/src/android/app/src/main/res/values-pt-rPT/strings.xml index 75ca1330cc..e326cdd400 100644 --- a/src/android/app/src/main/res/values-pt-rPT/strings.xml +++ b/src/android/app/src/main/res/values-pt-rPT/strings.xml @@ -35,7 +35,7 @@ Permite que o Suyu preencha a lista de jogos Ignorar a seleção da pasta de jogos? Os jogos não serão exibidos na lista de jogos se uma pasta não estiver selecionada. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Procurar jogos Procurar nas definições Pasta de Jogos selecionada @@ -43,7 +43,7 @@ Necessário para desencriptar jogos comerciais Ignorar a adição de chaves? São necessárias chaves válidas para emular jogos comerciais. Somente aplicativos homebrew funcionarão se você continuar. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Notificações Conceda a permissão de notificação com o botão abaixo. Conceda permissão @@ -64,7 +64,7 @@ Verifique se seu arquivo keys possui a extensão .keys e tente novamente. Verifique se seu arquivo keys possui a extensão .bin e tente novamente. Chaves de encriptação inválidas - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys O ficheiro selecionado está corrompido. Por favor recarrega as tuas chaves. Gerenciador de driver de GPU Instala driver para GPU @@ -114,7 +114,7 @@ Conteúdo(s) de jogo instalados com sucesso %1$d instalado com sucesso %1$d substituída com êxito - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates Drivers personalizados não suportados Carrea«gamento de drivers personalizados não é suportado pr este dispositivo. \nCheck verifica esta opção de futuro para confirmar se o suporte foi adicionado! Administrar dados suyu @@ -141,7 +141,7 @@ Verifica todo o conteúdo instalado em busca de dados corrompidos Faltando chaves de encriptação O firmware e jogos comerciais não poderão ser decriptados - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Launcher de miniaplicativos @@ -181,7 +181,7 @@ Exportação cancelada Verifiqua se as pastas de dados do utilizados estão na raiz da pasta zip e contêm um arquivo de configuração em config/config.ini e tenta novamente. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -461,8 +461,8 @@ uma tentativa de mapeamento automático A tua ROM está encriptada - cartucho de jogo or títulos instalados.]]> - prod.keys está instalado para que os jogos possam ser desencriptados.]]> + cartucho de jogo or títulos instalados.]]> + prod.keys está instalado para que os jogos possam ser desencriptados.]]> Ocorreu um erro ao iniciar o núcleo de vídeo. Isto é normalmente causado por um driver de GPU incompatível. Instalar um driver GPU pode resolver este problema. Impossível carregar a tua ROM diff --git a/src/android/app/src/main/res/values-ru/strings.xml b/src/android/app/src/main/res/values-ru/strings.xml index 0190726def..c78667db11 100644 --- a/src/android/app/src/main/res/values-ru/strings.xml +++ b/src/android/app/src/main/res/values-ru/strings.xml @@ -1,7 +1,7 @@ - Это программное обеспечение позволяет запускать игры для игровой консоли Nintendo Switch. Мы не предоставляем сами игры или ключи.<br /><br />Перед началом работы найдите файл prod.keys ]]> в хранилище устройства..<br /><br />Узнать больше]]> + Это программное обеспечение позволяет запускать игры для игровой консоли Nintendo Switch. Мы не предоставляем сами игры или ключи.<br /><br />Перед началом работы найдите файл prod.keys ]]> в хранилище устройства..<br /><br />Узнать больше]]> Уведомления и ошибки Показывать уведомления, когда что-то пошло не так Вы не предоставили разрешение на уведомления! @@ -35,7 +35,7 @@ Позволяет suyu заполнить список игр Пропустить выбор папки с играми? Игры не будут отображаться в списке Игры, если папка не выбрана. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Найти игры Настройки поиска Выбрана папка с играми @@ -43,7 +43,7 @@ Требуется для расшифровки розничных игр Пропустить добавление ключей? Для эмуляции розничных игр требуются действительные ключи. Если вы продолжите, будут работать только homebrew приложения. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Уведомления Предоставьте разрешение уведомлений с помощью кнопки ниже. Предоставить разрешение @@ -64,7 +64,7 @@ Убедитесь, что файл ключей имеет расширение .keys, и повторите попытку. Убедитесь, что файл ключей имеет расширение .bin, и повторите попытку. Неверные ключи шифрования - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Выбранный файл неверен или поврежден. Пожалуйста, пере-дампите ваши ключи. Менеджер драйверов ГП Установить драйвер ГП @@ -114,7 +114,7 @@ Игровой контент успешно установлен %1$d Успешно установлено %1$d Успешно перезаписано - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates Пользовательские драйверы не поддерживаются Загрузка пользовательского драйвера в настоящее время не поддерживается для этого устройства.\nПроверьте этот параметр еще раз в будущем чтобы узнать была ли добавлена ​​поддержка!   @@ -144,14 +144,14 @@ Проверяет весь установленный контент на наличие повреждений Отсутствуют ключи шифрования Прошивка и розничные игры не могут быть расшифрованы - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Запуск апплета Запуск системных апплетов на установленной прошивке Прошивка не установлена Апплет недоступен - prod.keys и firmware установлены и попробуйте еще раз.]]> + prod.keys и firmware установлены и попробуйте еще раз.]]> Альбом Просмотрите изображения, сохраненные в папке скриншотов пользователя, с помощью системного просмотрщика фотографий. Mii редактор @@ -184,7 +184,7 @@ Экспорт отменен Убедитесь что папки пользовательских данных находятся в корне zip-папки и содержат файл конфигурации config/config.ini и повторите попытку. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -463,8 +463,8 @@ Ваш ROM зашифрованный - или установленные игры.]]> - prod.keys установлен, чтобы игры можно было расшифровать.]]> + или установленные игры.]]> + prod.keys установлен, чтобы игры можно было расшифровать.]]> Произошла ошибка при инициализации видеоядра. Обычно это вызвано несовместимым драйвером ГП. Установка пользовательского драйвера ГП может решить эту проблему. Не удалось запустить ROM diff --git a/src/android/app/src/main/res/values-uk/strings.xml b/src/android/app/src/main/res/values-uk/strings.xml index 4b212d8bc0..9b8c71ccfd 100644 --- a/src/android/app/src/main/res/values-uk/strings.xml +++ b/src/android/app/src/main/res/values-uk/strings.xml @@ -1,7 +1,7 @@ - Це програмне забезпечення дозволяє запускати ігри для ігрової консолі Nintendo Switch. Ми не надаємо самі ігри або ключі.<br /><br />Перед початком роботи знайдіть ваш файл prod.keys ]]> у сховищі пристрою.<br /><br />Дізнатися більше]]> + Це програмне забезпечення дозволяє запускати ігри для ігрової консолі Nintendo Switch. Ми не надаємо самі ігри або ключі.<br /><br />Перед початком роботи знайдіть ваш файл prod.keys ]]> у сховищі пристрою.<br /><br />Дізнатися більше]]> Сповіщення та помилки Показувати сповіщення, коли щось пішло не так Ви не надали дозвіл сповіщень! @@ -32,14 +32,14 @@ Дозволяє suyu заповнити список ігор Пропустити вибір папки з іграми? Ігри не відображатимуться у списку Ігри, якщо папку не вибрано. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Знайти ігри Вибрано папку з іграми Встановити prod.keys Потрібно для розшифровки роздрібних ігор Пропустити додавання ключів? Для емуляції роздрібних ігор потрібні дійсні ключі. Якщо ви продовжите, працюватимуть тільки homebrew додатки. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Сповіщення Надайте дозвіл сповіщень за допомогою кнопки нижче. Надати дозвіл @@ -59,7 +59,7 @@ Помилка під час зчитування ключів шифрування Переконайтеся, що файл ключів має розширення .keys, і повторіть спробу. Невірні ключі шифрування - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Обраний файл невірний або пошкоджений. Будь ласка, пере-дампіть ваші ключі. Встановити драйвер ГП Встановіть альтернативні драйвери для потенційно кращої продуктивності та/або точності @@ -81,7 +81,7 @@ Назва першої вкладеної папки має бути ідентифікатором гри. Імпорт Експорт - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Gaia не існує @@ -92,7 +92,7 @@ https://github.com/suyu-emu/suyu/graphs/contributors Збірка https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -214,7 +214,7 @@ Доповнення Ваш ROM зашифрований - prod.keys встановлено, щоб ігри можна було розшифрувати.]]> + prod.keys встановлено, щоб ігри можна було розшифрувати.]]> Сталася помилка під час ініціалізації відеоядра. Зазвичай це спричинено несумісним драйвером ГП. Встановлення користувацького драйвера ГП може вирішити цю проблему. Не вдалося запустити ROM diff --git a/src/android/app/src/main/res/values-vi/strings.xml b/src/android/app/src/main/res/values-vi/strings.xml index 6355582cb0..4c0446fc96 100644 --- a/src/android/app/src/main/res/values-vi/strings.xml +++ b/src/android/app/src/main/res/values-vi/strings.xml @@ -1,7 +1,7 @@ - Phần mềm này sẽ chạy trò chơi cho máy chơi game Nintendo Switch. Không có game titles hoặc keys được bao gồm.<br /><br />Trước khi bạn bắt đầu, hãy tìm file prod.keys ]]> trên bộ nhớ thiết bị của bạn.<br /><br />Tìm hiểu thêm]]> + Phần mềm này sẽ chạy trò chơi cho máy chơi game Nintendo Switch. Không có game titles hoặc keys được bao gồm.<br /><br />Trước khi bạn bắt đầu, hãy tìm file prod.keys ]]> trên bộ nhớ thiết bị của bạn.<br /><br />Tìm hiểu thêm]]> Thông báo và lỗi Hiển thị thông báo khi có sự cố xảy ra Ứng dụng không được cấp quyền thông báo! @@ -32,14 +32,14 @@ Cho phép suyu thêm các trò chơi vào danh sách Bỏ qua lựa chọn thư mục trò chơi? Trò chơi sẽ không hiển thị trong danh sách nếu một thư mục không được chọn - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Tìm kiếm games Thư mục trò chơi đã được chọn Cài prod.keys Yêu cầu để giải mã các game bán lẻ Bỏ qua thêm chìa khóa? Cần có chìa khóa hợp lệ để giả lập trò chơi. Chỉ có các ứng dụng homebrew có thể vận hành nếu bạn tiếp tục - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Thông báo Ấn vào nút bên dưới để cấp quyền ứng dụng gửi thông báo Cấp quyền @@ -60,7 +60,7 @@ Xác minh rằng tệp keys của bạn có đuôi .keys và thử lại. Xác minh rằng tệp keys của bạn có đuôi .bin và thử lại. Keys mã hoá không hợp lệ - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Chọn file sai hoặc bị hỏng. Hãy xuất chìa khóa khác Cài đặt driver GPU Cài đặt driver thay thế để có thể có hiệu suất tốt và chính xác hơn @@ -94,8 +94,8 @@ Không tìm thấy tệp log Cài đặt nội dung game Cài đặt cập nhật game hoặc DLC - https://suyu-emu.org/help/quickstart/#dumping-installed-updates - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-decryption-keys Gaia không có thật @@ -107,7 +107,7 @@ Các dự án làm cho suyu trên Android trở thành điều có thể Dựng https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -259,7 +259,7 @@ Kiểm tra tính toàn vẹn thất bại! ROM của bạn đã bị mã hoá - prod.keys đã được cài đặt để game có thể được giải mã.]]> + prod.keys đã được cài đặt để game có thể được giải mã.]]> Đã xảy ra lỗi khi khởi tạo lõi video Việc này thường do driver GPU không tương thích. Cài đặt một driver GPU tùy chỉnh có thể giải quyết vấn đề này. Không thể tải ROM diff --git a/src/android/app/src/main/res/values-zh-rCN/strings.xml b/src/android/app/src/main/res/values-zh-rCN/strings.xml index 3ad450e1c9..1cecb2bbf8 100644 --- a/src/android/app/src/main/res/values-zh-rCN/strings.xml +++ b/src/android/app/src/main/res/values-zh-rCN/strings.xml @@ -1,7 +1,7 @@ - 此软件可以运行 Nintendo Switch 游戏,但不包含任何游戏和密钥文件。<br /><br />在开始前,请找到放置于设备存储中的 prod.keys ]]> 文件。<br /><br />了解更多]]> + 此软件可以运行 Nintendo Switch 游戏,但不包含任何游戏和密钥文件。<br /><br />在开始前,请找到放置于设备存储中的 prod.keys ]]> 文件。<br /><br />了解更多]]> 通知及错误提醒 当发生错误时显示通知。 未授予通知权限! @@ -35,7 +35,7 @@ 允许 suyu 更新游戏列表 跳过选择游戏文件夹? 如果未选择游戏文件夹,游戏将不会显示在游戏列表中。 - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games 搜索游戏 搜索设置 已选择游戏文件夹 @@ -43,7 +43,7 @@ 需要密钥文件来解密游戏 跳过添加密钥文件? 对于商业游戏,需要有效的密钥文件才能运行。如果没有密钥文件,将只能运行自制软件。 - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction 通知 使用下方的按钮授予通知权限。 授予权限 @@ -64,7 +64,7 @@ 请确保您的密钥文件扩展名为 .keys 并重试。 请确保您的密钥文件扩展名为 .bin 并重试。 无效的加密密钥 - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys 选择的密钥文件不正确或已损坏。请重新转储密钥文件。 GPU 驱动管理器 安装 GPU 驱动 @@ -114,7 +114,7 @@ 游戏附加内容已成功安装 %1$d 个包安装成功 %1$d 个包覆盖安装成功 - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates 不支持自定义驱动 此设备不支持自定义驱动。\n请之后再访问此项,查看是否已为此设备添加支持。 管理 suyu 数据 @@ -137,14 +137,14 @@ 检查所有安装的内容是否有损坏 密钥缺失 无法解密固件和商业游戏 - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys 小程序启动器 使用已安装的固件启动系统小程序 未安装固件 小程序不可用 - prod.keys 文件和固件已安装,然后再试一次。]]> + prod.keys 文件和固件已安装,然后再试一次。]]> 相册 查看存储在用户屏幕截图文件夹中的图像 Mii edit @@ -177,7 +177,7 @@ 已取消导出数据 请确保用户数据文件夹位于 zip 压缩包的根目录,并在 config/config.ini 路径中包含配置文件,然后重试。 https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -456,8 +456,8 @@ 您的 ROM 已加密 - 游戏卡带或已安装的游戏。]]> - prod.keys 文件已安装,使得游戏可以被解密。]]> + 游戏卡带或已安装的游戏。]]> + prod.keys 文件已安装,使得游戏可以被解密。]]> 初始化视频核心时发生错误 这通常由不兼容的 GPU 驱动程序造成,安装自定义 GPU 驱动程序可能解决此问题。 无法载入 ROM diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml index 06e23d4c4e..4b2926a95f 100644 --- a/src/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml @@ -1,7 +1,7 @@ - 此軟體可以執行 Nintendo Switch 主機遊戲,但不包含任何遊戲和金鑰。<br /><br />在您開始前,請找到放置於您的裝置儲存空間的 prod.keys ]]> 檔案。<br /><br />深入瞭解]]> + 此軟體可以執行 Nintendo Switch 主機遊戲,但不包含任何遊戲和金鑰。<br /><br />在您開始前,請找到放置於您的裝置儲存空間的 prod.keys ]]> 檔案。<br /><br />深入瞭解]]> 通知和錯誤 發生錯誤時顯示通知。 未授予通知權限! @@ -35,7 +35,7 @@ 允許 suyu 填入遊戲清單 跳過選取遊戲資料夾? 如果資料夾未選取,遊戲將不會顯示在遊戲清單。 - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games 搜尋遊戲 搜尋設定 遊戲目錄已選取 @@ -43,7 +43,7 @@ 需要解密零售遊戲 跳過新增金鑰? 模擬零售遊戲需要有效的金鑰,若要繼續,將僅有自製遊戲應用程式可以運作。 - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction 通知 使用下方的按鈕授予通知權限。 授予權限 @@ -64,7 +64,7 @@ 驗證您的金鑰檔案是否具有 .keys 副檔名並再試一次。 驗證您的金鑰檔案是否具有 .bin 副檔名並再試一次。 無效的加密金鑰 - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys 選取的檔案不正確或已損毀,請重新傾印您的金鑰。 GPU 驅動程式管理員 安裝 GPU 驅動程式 @@ -114,7 +114,7 @@ 遊戲內容已成功安裝 %1$d 安裝成功 %1$d 覆寫成功 - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates 不支援自訂的驅動程式 此裝置不支援自訂的驅動程式。\n請以後再來查看是否已新增支援! 管理 suyu 資料 @@ -137,14 +137,14 @@ 检查所有安装的内容是否有损坏 密钥缺失 无法解密固件和商业游戏 - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys 小程式啟動器 使用已安裝的韌體啟動系統小程式 未安裝韌體 無法使用小程式 - prod.keys 檔案和韌體已安裝,然後再試一次。]]> + prod.keys 檔案和韌體已安裝,然後再試一次。]]> 相簿 使用系統相片檢視器查看儲存在使用者螢幕截圖資料夾中的影像 Mii 編輯 @@ -177,7 +177,7 @@ 匯出已取消 請確保使用者資料夾位於 zip 壓縮檔的根目錄,並在 config/config.ini 路徑中包含組態檔案,並再試一次。 https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -456,8 +456,8 @@ 您的 ROM 已加密 - 遊戲卡匣或已安裝的遊戲。]]> - prod.keys 檔案已安裝,讓遊戲可以解密。]]> + 遊戲卡匣或已安裝的遊戲。]]> + prod.keys 檔案已安裝,讓遊戲可以解密。]]> 初始化視訊核心時發生錯誤 這經常由不相容的 GPU 驅動程式造成,安裝自訂 GPU 驅動程式可能會解決此問題。 無法載入 ROM diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 5331f2b419..da9c9d2cf8 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -3,7 +3,7 @@ suyu - This software will run games for the Nintendo Switch game console. No game titles or keys are included.<br /><br />Before you begin, please locate your prod.keys ]]> file on your device storage.<br /><br />Learn more]]> + This software will run games for the Nintendo Switch game console. No game titles or keys are included.<br /><br />Before you begin, please locate your prod.keys ]]> file on your device storage.<br /><br />Learn more]]> Notices and errors noticesAndErrors Shows notifications when something goes wrong. @@ -38,7 +38,7 @@ Allows suyu to populate the games list Skip selecting games folder? Games won\'t be displayed in the Games list if a folder isn\'t selected. - https://suyu-emu.org/help/quickstart/#dumping-games + https://suyu.dev/help/quickstart/#dumping-games Search games Search settings Games directory selected @@ -46,7 +46,7 @@ Required to decrypt retail games Skip adding keys? Valid keys are required to emulate retail games. Only homebrew apps will function if you continue. - https://suyu-emu.org/help/quickstart/#guide-introduction + https://suyu.dev/help/quickstart/#guide-introduction Notifications Grant the notification permission with the button below. Grant permission @@ -67,7 +67,7 @@ Verify your keys file has a .keys extension and try again. Verify your keys file has a .bin extension and try again. Invalid encryption keys - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys The selected file is incorrect or corrupt. Please redump your keys. GPU driver manager Install GPU driver @@ -117,7 +117,7 @@ Game content(s) installed successfully %1$d installed successfully %1$d overwritten successfully - https://suyu-emu.org/help/quickstart/#dumping-installed-updates + https://suyu.dev/help/quickstart/#dumping-installed-updates Custom drivers not supported Custom driver loading isn\'t currently supported for this device.\nCheck this option again in the future to see if support was added! Manage suyu data @@ -142,7 +142,7 @@ Checks all installed content for corruption Encryption keys are missing Firmware and retail games cannot be decrypted - https://suyu-emu.org/help/quickstart/#dumping-decryption-keys + https://suyu.dev/help/quickstart/#dumping-decryption-keys Qlaunch @@ -151,7 +151,7 @@ Launch system applets using installed firmware Firmware not installed Applet not available - prod.keys file and firmware are installed and try again.]]> + prod.keys file and firmware are installed and try again.]]> Album See images stored in the user screenshots folder with the system photo viewer Mii edit @@ -184,7 +184,7 @@ Export cancelled Make sure the user data folders are at the root of the zip folder and contain a config file at config/config.ini and try again. https://discord.gg/suyu - https://suyu-emu.org/ + https://suyu.dev/ https://github.com/suyu-emu @@ -463,8 +463,8 @@ Your ROM is encrypted - game cartidges or installed titles.]]> - prod.keys file is installed so that games can be decrypted.]]> + game cartidges or installed titles.]]> + prod.keys file is installed so that games can be decrypted.]]> An error occurred initializing the video core This is usually caused by an incompatible GPU driver. Installing a custom GPU driver may resolve this problem. Unable to load ROM diff --git a/src/common/android/applets/software_keyboard.cpp b/src/common/android/applets/software_keyboard.cpp index 2f0c58227a..8a49ff0442 100644 --- a/src/common/android/applets/software_keyboard.cpp +++ b/src/common/android/applets/software_keyboard.cpp @@ -253,19 +253,19 @@ void AndroidKeyboard::SubmitNormalText(const ResultData& data) const { void InitJNI(JNIEnv* env) { s_software_keyboard_class = reinterpret_cast( - env->NewGlobalRef(env->FindClass("org/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard"))); + env->NewGlobalRef(env->FindClass("dev/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard"))); s_keyboard_config_class = reinterpret_cast(env->NewGlobalRef( - env->FindClass("org/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard$KeyboardConfig"))); + env->FindClass("dev/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard$KeyboardConfig"))); s_keyboard_data_class = reinterpret_cast(env->NewGlobalRef( - env->FindClass("org/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard$KeyboardData"))); + env->FindClass("dev/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard$KeyboardData"))); s_swkbd_execute_normal = env->GetStaticMethodID( s_software_keyboard_class, "executeNormal", - "(Lorg/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard$KeyboardConfig;)Lorg/suyu/suyu_emu/" + "(Ldev/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard$KeyboardConfig;)Ldev/suyu/suyu_emu/" "applets/keyboard/SoftwareKeyboard$KeyboardData;"); s_swkbd_execute_inline = env->GetStaticMethodID( s_software_keyboard_class, "executeInline", - "(Lorg/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard$KeyboardConfig;)V"); + "(Ldev/suyu/suyu_emu/applets/keyboard/SoftwareKeyboard$KeyboardConfig;)V"); } void CleanupJNI(JNIEnv* env) { diff --git a/src/common/android/id_cache.cpp b/src/common/android/id_cache.cpp index 40faea9fa0..c4ef648ae5 100644 --- a/src/common/android/id_cache.cpp +++ b/src/common/android/id_cache.cpp @@ -400,14 +400,14 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) { return JNI_ERR; // Initialize Java classes - const jclass native_library_class = env->FindClass("org/suyu/suyu_emu/NativeLibrary"); + const jclass native_library_class = env->FindClass("dev/suyu/suyu_emu/NativeLibrary"); s_native_library_class = reinterpret_cast(env->NewGlobalRef(native_library_class)); s_disk_cache_progress_class = reinterpret_cast(env->NewGlobalRef( - env->FindClass("org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress"))); + env->FindClass("dev/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress"))); s_load_callback_stage_class = reinterpret_cast(env->NewGlobalRef(env->FindClass( - "org/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress$LoadCallbackStage"))); + "dev/suyu/suyu_emu/disk_shader_cache/DiskShaderCacheProgress$LoadCallbackStage"))); - const jclass game_dir_class = env->FindClass("org/suyu/suyu_emu/model/GameDir"); + const jclass game_dir_class = env->FindClass("dev/suyu/suyu_emu/model/GameDir"); s_game_dir_class = reinterpret_cast(env->NewGlobalRef(game_dir_class)); s_game_dir_constructor = env->GetMethodID(game_dir_class, "", "(Ljava/lang/String;Z)V"); env->DeleteLocalRef(game_dir_class); @@ -424,7 +424,7 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) { s_on_program_changed = env->GetStaticMethodID(s_native_library_class, "onProgramChanged", "(I)V"); - const jclass game_class = env->FindClass("org/suyu/suyu_emu/model/Game"); + const jclass game_class = env->FindClass("dev/suyu/suyu_emu/model/Game"); s_game_class = reinterpret_cast(env->NewGlobalRef(game_class)); s_game_constructor = env->GetMethodID(game_class, "", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/" @@ -450,7 +450,7 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) { env->DeleteLocalRef(pair_class); const jclass overlay_control_data_class = - env->FindClass("org/suyu/suyu_emu/overlay/model/OverlayControlData"); + env->FindClass("dev/suyu/suyu_emu/overlay/model/OverlayControlData"); s_overlay_control_data_class = reinterpret_cast(env->NewGlobalRef(overlay_control_data_class)); s_overlay_control_data_constructor = @@ -468,7 +468,7 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) { env->GetFieldID(overlay_control_data_class, "foldablePosition", "Lkotlin/Pair;"); env->DeleteLocalRef(overlay_control_data_class); - const jclass patch_class = env->FindClass("org/suyu/suyu_emu/model/Patch"); + const jclass patch_class = env->FindClass("dev/suyu/suyu_emu/model/Patch"); s_patch_class = reinterpret_cast(env->NewGlobalRef(patch_class)); s_patch_constructor = env->GetMethodID( patch_class, "", @@ -500,7 +500,7 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) { env->DeleteLocalRef(boolean_class); const jclass player_input_class = - env->FindClass("org/suyu/suyu_emu/features/input/model/PlayerInput"); + env->FindClass("dev/suyu/suyu_emu/features/input/model/PlayerInput"); s_player_input_class = reinterpret_cast(env->NewGlobalRef(player_input_class)); s_player_input_constructor = env->GetMethodID( player_input_class, "", @@ -531,7 +531,7 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) { env->DeleteLocalRef(player_input_class); const jclass suyu_input_device_interface = - env->FindClass("org/suyu/suyu_emu/features/input/SuyuInputDevice"); + env->FindClass("dev/suyu/suyu_emu/features/input/SuyuInputDevice"); s_suyu_input_device_interface = reinterpret_cast(env->NewGlobalRef(suyu_input_device_interface)); s_suyu_input_device_get_name = diff --git a/src/suyu/about_dialog.cpp b/src/suyu/about_dialog.cpp index 40c99f91b7..d5f05b4a2a 100644 --- a/src/suyu/about_dialog.cpp +++ b/src/suyu/about_dialog.cpp @@ -20,7 +20,7 @@ AboutDialog::AboutDialog(QWidget* parent) ui->setupUi(this); // Try and request the icon from Qt theme (Linux?) - const QIcon suyu_logo = QIcon::fromTheme(QStringLiteral("org.suyu_emu.suyu")); + const QIcon suyu_logo = QIcon::fromTheme(QStringLiteral("dev.suyu_emu.suyu")); if (!suyu_logo.isNull()) { ui->labelLogo->setPixmap(suyu_logo.pixmap(200)); } diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index 300eb0819a..97c49da134 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -5382,7 +5382,7 @@ int main(int argc, char* argv[]) { // Fix the Wayland appId. This needs to match the name of the .desktop file without the .desktop // suffix. - QGuiApplication::setDesktopFileName(QStringLiteral("org.suyu_emu.suyu")); + QGuiApplication::setDesktopFileName(QStringLiteral("dev.suyu_emu.suyu")); #endif SetHighDPIAttributes(); From 02fc0460315e4014435a22ceaed109c16ef17931 Mon Sep 17 00:00:00 2001 From: Hustler One Date: Mon, 25 Mar 2024 21:12:28 +0100 Subject: [PATCH 110/165] All relevant changes in commit 51862e862dd353e746913c989a6fce87ecbc7a5c have been --- src/common/settings.h | 1 + src/suyu/game_list.cpp | 10 ++ src/suyu/game_list.h | 7 ++ src/suyu/main.cpp | 251 +++++++++++++++++++++++++++++++++++++++++ src/suyu/main.h | 2 + 5 files changed, 271 insertions(+) diff --git a/src/common/settings.h b/src/common/settings.h index 77788befe7..7f61804052 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later // Modified by palfaiate on <2024/03/07> +// Reverted palfaiate's changes on <2024/03/25> -Nine-Ball #pragma once diff --git a/src/suyu/game_list.cpp b/src/suyu/game_list.cpp index bda0d489bf..28a9d9c970 100644 --- a/src/suyu/game_list.cpp +++ b/src/suyu/game_list.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later // Modified by palfaiate on <2024/03/07> +// Reverted palfaiate's changes on <2024/03/25> -Nine-Ball #include #include @@ -580,6 +581,9 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri remove_menu->addSeparator(); QAction* remove_shader_cache = remove_menu->addAction(tr("Remove All Pipeline Caches")); QAction* remove_all_content = remove_menu->addAction(tr("Remove All Installed Contents")); + QAction* dump_romfs_menu = context_menu.addMenu(tr("Dump RomFS")); + QAction* dump_romfs = dump_romfs_menu->addAction(tr("Dump RomFS")); + QAction* dump_romfs_sdmc = dump_romfs_menu->addAction(tr("Dump RomFS to SDMC")); QAction* verify_integrity = context_menu.addAction(tr("Verify Integrity")); QAction* copy_tid = context_menu.addAction(tr("Copy Title ID to Clipboard")); QAction* navigate_to_gamedb_entry = context_menu.addAction(tr("Navigate to GameDB entry")); @@ -647,6 +651,12 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri connect(remove_cache_storage, &QAction::triggered, [this, program_id, path] { emit RemoveFileRequested(program_id, GameListRemoveTarget::CacheStorage, path); }); + connect(dump_romfs, &QAction::triggered, [this, program_id, path]() { + emit DumpRomFSRequested(program_id, path, DumpRomFSTarget::Normal); + }); + connect(dump_romfs_sdmc, &QAction::triggered, [this, program_id, path]() { + emit DumpRomFSRequested(program_id, path, DumpRomFSTarget::SDMC); + }); connect(verify_integrity, &QAction::triggered, [this, path]() { emit VerifyIntegrityRequested(path); }); connect(copy_tid, &QAction::triggered, diff --git a/src/suyu/game_list.h b/src/suyu/game_list.h index 7568e1b6e0..684a7ba2d9 100644 --- a/src/suyu/game_list.h +++ b/src/suyu/game_list.h @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later // Modified by palfaiate on <2024/03/07> +// Reverted palfaiate's changes on <2024/03/25> -Nine-Ball #pragma once @@ -52,6 +53,11 @@ enum class GameListRemoveTarget { CacheStorage, }; +enum class DumpRomFSTarget { + Normal, + SDMC, +}; + enum class GameListShortcutTarget { Desktop, Applications, @@ -113,6 +119,7 @@ signals: void RemoveFileRequested(u64 program_id, GameListRemoveTarget target, const std::string& game_path); void RemovePlayTimeRequested(u64 program_id); + void DumpRomFSRequested(u64 program_id, const std::string& game_path, DumpRomFSTarget target); void VerifyIntegrityRequested(const std::string& game_path); void CopyTIDRequested(u64 program_id); void CreateShortcut(u64 program_id, const std::string& game_path, diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index 97c49da134..9195bd0aae 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later // Modified by palfaiate on <2024/03/07> +// Reverted palfaiate's changes on <2024/03/25> -Nine-Ball #include #include @@ -59,6 +60,18 @@ #include "suyu/multiplayer/state.h" #include "suyu/util/controller_navigation.h" +// These are wrappers to avoid the calls to CreateDirectory and CreateFile because of the Windows +static FileSys::VirtualDir VfsFilesystemCreateDirectoryWrapper( + const FileSys::VirtualFilesystem& vfs, const std::string& path, FileSys::OpenMode mode) { + return vfs->CreateDirectory(path, mode); +} + +// Overloaded function, also removed by palafiate +static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::VirtualDir& dir, const std::string& path) { + return dir->CreateFile(path); +} + + #include #include @@ -1458,6 +1471,7 @@ void GMainWindow::ConnectWidgetEvents() { connect(game_list, &GameList::RemoveFileRequested, this, &GMainWindow::OnGameListRemoveFile); connect(game_list, &GameList::RemovePlayTimeRequested, this, &GMainWindow::OnGameListRemovePlayTimeData); + connect(game_list, &GameList::DumpRomFSRequested, this, &GMainWindow::OnGameListDumpRomFS); connect(game_list, &GameList::VerifyIntegrityRequested, this, &GMainWindow::OnGameListVerifyIntegrity); connect(game_list, &GameList::CopyTIDRequested, this, &GMainWindow::OnGameListCopyTID); @@ -2362,6 +2376,68 @@ void GMainWindow::OnTransferableShaderCacheOpenFile(u64 program_id) { QDesktopServices::openUrl(QUrl::fromLocalFile(qt_shader_cache_path)); } +static bool RomFSRawCopy(size_t total_size, size_t& read_size, QProgressDialog& dialog, + const FileSys::VirtualDir& src, const FileSys::VirtualDir& dest, + bool full) { + if (src == nullptr || dest == nullptr || !src->IsReadable() || !dest->IsWritable()) + return false; + if (dialog.wasCanceled()) + return false; + + std::vector buffer(CopyBufferSize); + auto last_timestamp = std::chrono::steady_clock::now(); + + const auto QtRawCopy = [&](const FileSys::VirtualFile& src_file, + const FileSys::VirtualFile& dest_file) { + if (src_file == nullptr || dest_file == nullptr) { + return false; + } + if (!dest_file->Resize(src_file->GetSize())) { + return false; + } + + for (std::size_t i = 0; i < src_file->GetSize(); i += buffer.size()) { + if (dialog.wasCanceled()) { + dest_file->Resize(0); + return false; + } + + using namespace std::literals::chrono_literals; + const auto new_timestamp = std::chrono::steady_clock::now(); + + if ((new_timestamp - last_timestamp) > 33ms) { + last_timestamp = new_timestamp; + dialog.setValue( + static_cast(std::min(read_size, total_size) * 100 / total_size)); + QCoreApplication::processEvents(); + } + + const auto read = src_file->Read(buffer.data(), buffer.size(), i); + dest_file->Write(buffer.data(), read, i); + + read_size += read; + } + + return true; + }; + + if (full) { + for (const auto& file : src->GetFiles()) { + const auto out = VfsDirectoryCreateFileWrapper(dest, file->GetName()); + if (!QtRawCopy(file, out)) + return false; + } + } + + for (const auto& dir : src->GetSubdirectories()) { + const auto out = dest->CreateSubdirectory(dir->GetName()); + if (!RomFSRawCopy(total_size, read_size, dialog, dir, out, full)) + return false; + } + + return true; +} + QString GMainWindow::GetGameListErrorRemoving(InstalledEntryType type) const { switch (type) { case InstalledEntryType::Game: @@ -2603,6 +2679,121 @@ void GMainWindow::RemoveCacheStorage(u64 program_id) { Common::FS::RemoveDirRecursively(path); } +void GMainWindow::OnGameListDumpRomFS(u64 program_id, const std::string& game_path, + DumpRomFSTarget target) { + const auto failed = [this] { + QMessageBox::warning(this, tr("RomFS Extraction Failed!"), + tr("There was an error copying the RomFS files or the user " + "cancelled the operation.")); + }; + + const auto loader = + Loader::GetLoader(*system, vfs->OpenFile(game_path, FileSys::OpenMode::Read)); + if (loader == nullptr) { + failed(); + return; + } + + FileSys::VirtualFile packed_update_raw{}; + loader->ReadUpdateRaw(packed_update_raw); + + const auto& installed = system->GetContentProvider(); + + u64 title_id{}; + u8 raw_type{}; + if (!SelectRomFSDumpTarget(installed, program_id, &title_id, &raw_type)) { + failed(); + return; + } + + const auto type = static_cast(raw_type); + const auto base_nca = installed.GetEntry(title_id, type); + if (!base_nca) { + failed(); + return; + } + + const FileSys::NCA update_nca{packed_update_raw, nullptr}; + if (type != FileSys::ContentRecordType::Program || + update_nca.GetStatus() != Loader::ResultStatus::ErrorMissingBKTRBaseRomFS || + update_nca.GetTitleId() != FileSys::GetUpdateTitleID(title_id)) { + packed_update_raw = {}; + } + + const auto base_romfs = base_nca->GetRomFS(); + const auto dump_dir = + target == DumpRomFSTarget::Normal + ? Common::FS::GetSuyuPath(Common::FS::SuyuPath::DumpDir) + : Common::FS::GetSuyuPath(Common::FS::SuyuPath::SDMCDir) / "atmosphere" / "contents"; + const auto romfs_dir = fmt::format("{:016X}/romfs", title_id); + + const auto path = Common::FS::PathToUTF8String(dump_dir / romfs_dir); + + const FileSys::PatchManager pm{title_id, system->GetFileSystemController(), installed}; + auto romfs = pm.PatchRomFS(base_nca.get(), base_romfs, type, packed_update_raw, false); + + const auto out = VfsFilesystemCreateDirectoryWrapper(vfs, path, FileSys::OpenMode::ReadWrite); + + if (out == nullptr) { + failed(); + vfs->DeleteDirectory(path); + return; + } + + bool ok = false; + const QStringList selections{tr("Full"), tr("Skeleton")}; + const auto res = QInputDialog::getItem( + this, tr("Select RomFS Dump Mode"), + tr("Please select the how you would like the RomFS dumped.
Full will copy all of the " + "files into the new directory while
skeleton will only create the directory " + "structure."), + selections, 0, false, &ok); + if (!ok) { + failed(); + vfs->DeleteDirectory(path); + return; + } + + const auto extracted = FileSys::ExtractRomFS(romfs); + if (extracted == nullptr) { + failed(); + return; + } + + const auto full = res == selections.constFirst(); + + // The expected required space is the size of the RomFS + 1 GiB + const auto minimum_free_space = romfs->GetSize() + 0x40000000; + + if (full && Common::FS::GetFreeSpaceSize(path) < minimum_free_space) { + QMessageBox::warning(this, tr("RomFS Extraction Failed!"), + tr("There is not enough free space at %1 to extract the RomFS. Please " + "free up space or select a different dump directory at " + "Emulation > Configure > System > Filesystem > Dump Root") + .arg(QString::fromStdString(path))); + return; + } + + QProgressDialog progress(tr("Extracting RomFS..."), tr("Cancel"), 0, 100, this); + progress.setWindowModality(Qt::WindowModal); + progress.setMinimumDuration(100); + progress.setAutoClose(false); + progress.setAutoReset(false); + + size_t read_size = 0; + + if (RomFSRawCopy(romfs->GetSize(), read_size, progress, extracted, out, full)) { + progress.close(); + QMessageBox::information(this, tr("RomFS Extraction Succeeded!"), + tr("The operation completed successfully.")); + QDesktopServices::openUrl(QUrl::fromLocalFile(QString::fromStdString(path))); + } else { + progress.close(); + failed(); + vfs->DeleteDirectory(path); + } +} + void GMainWindow::OnGameListVerifyIntegrity(const std::string& game_path) { const auto NotImplemented = [this] { QMessageBox::warning(this, tr("Integrity verification couldn't be performed!"), @@ -4673,6 +4864,66 @@ void GMainWindow::SetFirmwareVersion() { firmware_label->setToolTip(QString::fromStdString(display_title)); } +bool GMainWindow::SelectRomFSDumpTarget(const FileSys::ContentProvider& installed, u64 program_id, + u64* selected_title_id, u8* selected_content_record_type) { + using ContentInfo = std::tuple; + boost::container::flat_set available_title_ids; + + const auto RetrieveEntries = [&](FileSys::TitleType title_type, + FileSys::ContentRecordType record_type) { + const auto entries = installed.ListEntriesFilter(title_type, record_type); + for (const auto& entry : entries) { + if (FileSys::GetBaseTitleID(entry.title_id) == program_id && + installed.GetEntry(entry)->GetStatus() == Loader::ResultStatus::Success) { + available_title_ids.insert({entry.title_id, title_type, record_type}); + } + } + }; + + RetrieveEntries(FileSys::TitleType::Application, FileSys::ContentRecordType::Program); + RetrieveEntries(FileSys::TitleType::Application, FileSys::ContentRecordType::HtmlDocument); + RetrieveEntries(FileSys::TitleType::Application, FileSys::ContentRecordType::LegalInformation); + RetrieveEntries(FileSys::TitleType::AOC, FileSys::ContentRecordType::Data); + + if (available_title_ids.empty()) { + return false; + } + + size_t title_index = 0; + + if (available_title_ids.size() > 1) { + QStringList list; + for (auto& [title_id, title_type, record_type] : available_title_ids) { + const auto hex_title_id = QString::fromStdString(fmt::format("{:X}", title_id)); + if (record_type == FileSys::ContentRecordType::Program) { + list.push_back(QStringLiteral("Program [%1]").arg(hex_title_id)); + } else if (record_type == FileSys::ContentRecordType::HtmlDocument) { + list.push_back(QStringLiteral("HTML document [%1]").arg(hex_title_id)); + } else if (record_type == FileSys::ContentRecordType::LegalInformation) { + list.push_back(QStringLiteral("Legal information [%1]").arg(hex_title_id)); + } else { + list.push_back( + QStringLiteral("DLC %1 [%2]").arg(title_id & 0x7FF).arg(hex_title_id)); + } + } + + bool ok; + const auto res = QInputDialog::getItem( + this, tr("Select RomFS Dump Target"), + tr("Please select which RomFS you would like to dump."), list, 0, false, &ok); + if (!ok) { + return false; + } + + title_index = list.indexOf(res); + } + + const auto& [title_id, title_type, record_type] = *available_title_ids.nth(title_index); + *selected_title_id = title_id; + *selected_content_record_type = static_cast(record_type); + return true; +} + bool GMainWindow::ConfirmClose() { if (emu_thread == nullptr || UISettings::values.confirm_before_stopping.GetValue() == ConfirmStop::Ask_Never) { diff --git a/src/suyu/main.h b/src/suyu/main.h index f9a5057d83..e17c8c0607 100644 --- a/src/suyu/main.h +++ b/src/suyu/main.h @@ -50,6 +50,7 @@ class WaitTreeWidget; enum class GameListOpenTarget; enum class GameListRemoveTarget; enum class GameListShortcutTarget; +enum class DumpRomFSTarget; enum class InstalledEntryType; class GameListPlaceholder; @@ -378,6 +379,7 @@ private slots: void OnGameListRemoveFile(u64 program_id, GameListRemoveTarget target, const std::string& game_path); void OnGameListRemovePlayTimeData(u64 program_id); + void OnGameListDumpRomFS(u64 program_id, const std::string& game_path, DumpRomFSTarget target); void OnGameListVerifyIntegrity(const std::string& game_path); void OnGameListCopyTID(u64 program_id); void OnGameListNavigateToGamedbEntry(u64 program_id, From e1b77dd8987d30f01e3625ce60c4c6e637b9a5cd Mon Sep 17 00:00:00 2001 From: BoomMicrophone Date: Tue, 26 Mar 2024 15:57:41 +0100 Subject: [PATCH 111/165] nullglob globstar gobble up those nuts shoutout to gpg for not working Signed-off-by: BoomMicrophone --- src/suyu/game_list.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/suyu/game_list.h b/src/suyu/game_list.h index 684a7ba2d9..4adb6403ef 100644 --- a/src/suyu/game_list.h +++ b/src/suyu/game_list.h @@ -56,7 +56,7 @@ enum class GameListRemoveTarget { enum class DumpRomFSTarget { Normal, SDMC, -}; +}; enum class GameListShortcutTarget { Desktop, From f44fafdd88886fc7521a0c02ece5a84c726fe3c0 Mon Sep 17 00:00:00 2001 From: BoomMicrophone Date: Tue, 26 Mar 2024 16:10:33 +0100 Subject: [PATCH 112/165] Woah guys this is so compliant! Signed-off-by: BoomMicrophone --- src/suyu/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index 9195bd0aae..084883caa0 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -67,11 +67,11 @@ static FileSys::VirtualDir VfsFilesystemCreateDirectoryWrapper( } // Overloaded function, also removed by palafiate -static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::VirtualDir& dir, const std::string& path) { +static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::VirtualDir& dir, + const std::string& path) { return dir->CreateFile(path); } - #include #include From 6f26709e42fc535332cbe38c695256a7af1c2db5 Mon Sep 17 00:00:00 2001 From: BoomMicrophone Date: Tue, 26 Mar 2024 16:34:22 +0100 Subject: [PATCH 113/165] fix epic fail (I am relying on actions to do the compiling for me until i get nix) --- src/suyu/game_list.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/suyu/game_list.cpp b/src/suyu/game_list.cpp index 28a9d9c970..132ff30b0c 100644 --- a/src/suyu/game_list.cpp +++ b/src/suyu/game_list.cpp @@ -581,7 +581,7 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri remove_menu->addSeparator(); QAction* remove_shader_cache = remove_menu->addAction(tr("Remove All Pipeline Caches")); QAction* remove_all_content = remove_menu->addAction(tr("Remove All Installed Contents")); - QAction* dump_romfs_menu = context_menu.addMenu(tr("Dump RomFS")); + QMenu* dump_romfs_menu = context_menu.addMenu(tr("Dump RomFS")); QAction* dump_romfs = dump_romfs_menu->addAction(tr("Dump RomFS")); QAction* dump_romfs_sdmc = dump_romfs_menu->addAction(tr("Dump RomFS to SDMC")); QAction* verify_integrity = context_menu.addAction(tr("Verify Integrity")); From dca166ca9c5abccb661d1ab140746f81d142c6e5 Mon Sep 17 00:00:00 2001 From: BoomMicrophone Date: Sun, 31 Mar 2024 21:41:43 +0200 Subject: [PATCH 114/165] remove comment gpg timeout so i gotta coooooommit :D --- src/suyu/main.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index 084883caa0..42a5a6587c 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -1,9 +1,6 @@ // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -// Modified by palfaiate on <2024/03/07> -// Reverted palfaiate's changes on <2024/03/25> -Nine-Ball - #include #include #include From 1f517bbe1eb10bdcfec380a682fc31d15c82921f Mon Sep 17 00:00:00 2001 From: BoomMicrophone Date: Sun, 31 Mar 2024 21:42:11 +0200 Subject: [PATCH 115/165] remove comment gotta coooooommit :D --- src/common/settings.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/common/settings.h b/src/common/settings.h index 7f61804052..4e993ea622 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -1,9 +1,6 @@ // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -// Modified by palfaiate on <2024/03/07> -// Reverted palfaiate's changes on <2024/03/25> -Nine-Ball - #pragma once #include From 806b300969b321d2949b1adf9d7a16bb06997a21 Mon Sep 17 00:00:00 2001 From: zqpvr01 Date: Thu, 11 Apr 2024 03:41:07 +0200 Subject: [PATCH 116/165] Remove discord --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 703b475e78..65d887ed06 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ It is written in C++ with portability in mind, and we're actively working on bui

- Discord | + Matrix | Status | Development | Downloads | @@ -77,7 +77,7 @@ We have official builds [here.](https://git.suyu.dev/suyu/suyu/releases) If any ## Support -If you have any questions, don't hesitate to ask us on [Discord](https://discord.gg/suyu). We don't bite! +If you have any questions, don't hesitate to ask us on [Matrix](https://chat.suyu.dev). We don't bite! ## License From d2c09f531b4fed92b4cf46a4b7d86fce0c8b8c71 Mon Sep 17 00:00:00 2001 From: zqpvr01 Date: Thu, 11 Apr 2024 03:42:30 +0200 Subject: [PATCH 117/165] Remove discord (2) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 65d887ed06..6abd4264d8 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ SPDX-License-Identifier: GPL-3.0-or-later **Note**: We do not support or condone piracy in any form. In order to use suyu, you'll need keys from your real Switch system, and games which you have legally obtained and paid for. We do not intend to make money or profit from this project. -We're in need of developers. Please join our Discord server below if you want to contribute! +We're in need of developers. Please join our Matrix below if you want to contribute! This repo is based on Yuzu EA 4176.


From ba40a4516df6fcdc26d2b3c6055895ce5655068e Mon Sep 17 00:00:00 2001 From: zqpvr01 Date: Thu, 11 Apr 2024 03:44:08 +0200 Subject: [PATCH 118/165] Remove discord (3) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6abd4264d8..fc456c50f5 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ We currently have builds over at the [Releases](https://git.suyu.dev/suyu/suyu/r This project is completely free and open source, and anyone can contribute to help improve suyu. -Most of the development happens on GitLab. For development discussion, please join us on [Discord](https://discord.gg/suyu). +Most of the development happens on GitLab. For development discussion, please join us on [Matrix](https://chat.suyu.dev). If you want to contribute, please take a look at the [Contributor's Guide](https://git.suyu.dev/suyu/suyu/wiki/Contributing) and [Developer Information](https://git.suyu.dev/suyu/suyu/wiki/Developer-Information). You can also contact any of the developers on Discord to learn more about the current state of suyu. From 02465291241c9e03dab02dce255d9de94ccad359 Mon Sep 17 00:00:00 2001 From: administrator Date: Fri, 12 Apr 2024 15:15:29 +0200 Subject: [PATCH 119/165] Change Matrix to chat --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index fc456c50f5..5baba68ea9 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ SPDX-License-Identifier: GPL-3.0-or-later **Note**: We do not support or condone piracy in any form. In order to use suyu, you'll need keys from your real Switch system, and games which you have legally obtained and paid for. We do not intend to make money or profit from this project. -We're in need of developers. Please join our Matrix below if you want to contribute! +We're in need of developers. Please join our chat below if you want to contribute! This repo is based on Yuzu EA 4176.
@@ -25,7 +25,7 @@ It is written in C++ with portability in mind, and we're actively working on bui

- Matrix | + Chat | Status | Development | Downloads | @@ -48,7 +48,7 @@ We currently have builds over at the [Releases](https://git.suyu.dev/suyu/suyu/r This project is completely free and open source, and anyone can contribute to help improve suyu. -Most of the development happens on GitLab. For development discussion, please join us on [Matrix](https://chat.suyu.dev). +Most of the development happens on GitLab. For development discussion, please join us in our [Chat](https://chat.suyu.dev). If you want to contribute, please take a look at the [Contributor's Guide](https://git.suyu.dev/suyu/suyu/wiki/Contributing) and [Developer Information](https://git.suyu.dev/suyu/suyu/wiki/Developer-Information). You can also contact any of the developers on Discord to learn more about the current state of suyu. @@ -77,7 +77,7 @@ We have official builds [here.](https://git.suyu.dev/suyu/suyu/releases) If any ## Support -If you have any questions, don't hesitate to ask us on [Matrix](https://chat.suyu.dev). We don't bite! +If you have any questions, don't hesitate to ask us in our [chat](https://chat.suyu.dev). We don't bite! ## License From 4b1c30ec49af8504bf606c548a42a55735077682 Mon Sep 17 00:00:00 2001 From: administrator Date: Wed, 17 Apr 2024 02:13:24 +0200 Subject: [PATCH 120/165] Replace Discord with suyu chat in issue template Fixes https://git.suyu.dev/suyu/suyu/issues/139 --- .forgejo/ISSUE_TEMPLATE/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.forgejo/ISSUE_TEMPLATE/config.yml b/.forgejo/ISSUE_TEMPLATE/config.yml index 0be63fdb7a..1a365db1a9 100644 --- a/.forgejo/ISSUE_TEMPLATE/config.yml +++ b/.forgejo/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,5 @@ blank_issues_enabled: false contact_links: - - name: suyu Discord - url: https://discord.com/invite/suyu - about: If you are experiencing an issue with suyu, and you need tech support, or if you have a general question, try asking in the official suyu Discord linked here. Piracy is not allowed. + - name: suyu chat + url: https://chat.suyu.dev/ + about: If you are experiencing an issue with suyu, and you need tech support, or if you have a general question, try asking in the official suyu chat linked here. Piracy is not allowed. From 91dd8ba6f0ce4e44c9ddbb7981a887ec7aaa8556 Mon Sep 17 00:00:00 2001 From: administrator Date: Wed, 17 Apr 2024 02:14:41 +0200 Subject: [PATCH 121/165] Replace Discord with suyu chat in issue template --- .gitea/ISSUE_TEMPLATE/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitea/ISSUE_TEMPLATE/config.yml b/.gitea/ISSUE_TEMPLATE/config.yml index 0be63fdb7a..1a365db1a9 100644 --- a/.gitea/ISSUE_TEMPLATE/config.yml +++ b/.gitea/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,5 @@ blank_issues_enabled: false contact_links: - - name: suyu Discord - url: https://discord.com/invite/suyu - about: If you are experiencing an issue with suyu, and you need tech support, or if you have a general question, try asking in the official suyu Discord linked here. Piracy is not allowed. + - name: suyu chat + url: https://chat.suyu.dev/ + about: If you are experiencing an issue with suyu, and you need tech support, or if you have a general question, try asking in the official suyu chat linked here. Piracy is not allowed. From 35afff5c317b2186def271bddceb465f081cf256 Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Wed, 17 Apr 2024 17:50:32 +0200 Subject: [PATCH 122/165] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 5baba68ea9..793e49bedc 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,8 @@ SPDX-License-Identifier: GPL-3.0-or-later We're in need of developers. Please join our chat below if you want to contribute! This repo is based on Yuzu EA 4176. +Support the original suyu developer team [here](https://discord.gg/ajz5hdrZ) +


From 84bd6264ea4b739132aa432e5e0f50c4b7b0fe72 Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Wed, 17 Apr 2024 18:21:27 +0200 Subject: [PATCH 123/165] Added info --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 793e49bedc..f73d68719a 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ SPDX-License-Identifier: GPL-3.0-or-later **Note**: We do not support or condone piracy in any form. In order to use suyu, you'll need keys from your real Switch system, and games which you have legally obtained and paid for. We do not intend to make money or profit from this project. We're in need of developers. Please join our chat below if you want to contribute! -This repo is based on Yuzu EA 4176. +This repo was based on Yuzu EA 4176 but the code is being rewritten from the ground up for legal and performance reasons. Support the original suyu developer team [here](https://discord.gg/ajz5hdrZ) From e795daf66c07d619ca7fa6e974768fbdb54f325b Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Wed, 17 Apr 2024 18:31:46 +0200 Subject: [PATCH 124/165] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f73d68719a..8b9c5880c9 100644 --- a/README.md +++ b/README.md @@ -21,9 +21,9 @@ Support the original suyu developer team [here](https://discord.gg/ajz5hdrZ)

-

suyu is the continuation of the world's most popular, open-source, Nintendo Switch emulator, yuzu. +

suyu was the continuation of the world's most popular, open-source, Nintendo Switch emulator, yuzu.
-It is written in C++ with portability in mind, and we're actively working on builds for Windows, Linux and Android. +It is written in C++ (C# possibly required soon) with portability in mind, and we're actively working on builds for Windows, Linux and Android along with a custom OS called [suyuos](https://git.suyu.dev/suyu/suyu-os).

From 2ac178617c412ab0bf8a14901d940339921e6d7c Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Wed, 17 Apr 2024 23:20:04 +0200 Subject: [PATCH 125/165] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8b9c5880c9..0ca84ac492 100644 --- a/README.md +++ b/README.md @@ -21,9 +21,10 @@ Support the original suyu developer team [here](https://discord.gg/ajz5hdrZ)
-

suyu was the continuation of the world's most popular, open-source, Nintendo Switch emulator, yuzu. +

suyu was the continuation of the world's most popular, open-source, Nintendo Switch emulator, yuzu, but is now something greater.
-It is written in C++ (C# possibly required soon) with portability in mind, and we're actively working on builds for Windows, Linux and Android along with a custom OS called [suyuos](https://git.suyu.dev/suyu/suyu-os). +It is written in C++ (C# possibly required soon) with portability in mind, and we're actively working on builds for Windows, Linux and Android along with a custom OS called suyuos (https://git.suyu.dev/suyu/suyu-os) . +

From 5ebba7bdea4f3a539050e22feaaea8e1e7a1245c Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Wed, 17 Apr 2024 23:27:12 +0200 Subject: [PATCH 126/165] Added Ios release --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0ca84ac492..c50f5dc2eb 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,7 @@ You can also contact any of the developers on Discord to learn more about the cu * __Linux__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __macOS__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __Android__: [Releases](https://git.suyu.dev/suyu/suyu/releases) +*__IOS (Sudachi redirect)__: [Releases](https://github.com/emuPlace/Sudachi/releases) If you want daily builds then [Click here](https://git.suyu.dev/suyu/suyu/actions) If you don't know how to download the daily builds then [Click here](https://git.suyu.dev/suyu/suyu/raw/branch/dev/img/daily-builds.png) From 01e4c367f8d1ba2a44713b9b78b6ec924d42d7d6 Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Wed, 17 Apr 2024 23:28:26 +0200 Subject: [PATCH 127/165] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c50f5dc2eb..3a5c1dd674 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ You can also contact any of the developers on Discord to learn more about the cu * __Linux__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __macOS__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __Android__: [Releases](https://git.suyu.dev/suyu/suyu/releases) -*__IOS (Sudachi redirect)__: [Releases](https://github.com/emuPlace/Sudachi/releases) +* __IOS (Sudachi redirect)__: [Releases](https://github.com/emuPlace/Sudachi/releases) If you want daily builds then [Click here](https://git.suyu.dev/suyu/suyu/actions) If you don't know how to download the daily builds then [Click here](https://git.suyu.dev/suyu/suyu/raw/branch/dev/img/daily-builds.png) From beb4ef9ac7110c9ef43a32df98ced7501c6fc7d1 Mon Sep 17 00:00:00 2001 From: Crimson Hawk Date: Thu, 18 Apr 2024 11:41:41 +0800 Subject: [PATCH 128/165] Undo some changes to readme --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3a5c1dd674..c976ef850a 100644 --- a/README.md +++ b/README.md @@ -21,9 +21,9 @@ Support the original suyu developer team [here](https://discord.gg/ajz5hdrZ)
-

suyu was the continuation of the world's most popular, open-source, Nintendo Switch emulator, yuzu, but is now something greater. +

suyu is the continuation of the world's most popular, open-source, Nintendo Switch emulator.
-It is written in C++ (C# possibly required soon) with portability in mind, and we're actively working on builds for Windows, Linux and Android along with a custom OS called suyuos (https://git.suyu.dev/suyu/suyu-os) . +It is written in C++ (C# possibly required soon) with portability in mind, we actively work on builds for Windows, Linux and Android, along with a WIP custom OS called suyuOS (https://git.suyu.dev/suyu/suyu-os) .

@@ -62,7 +62,6 @@ You can also contact any of the developers on Discord to learn more about the cu * __Linux__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __macOS__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __Android__: [Releases](https://git.suyu.dev/suyu/suyu/releases) -* __IOS (Sudachi redirect)__: [Releases](https://github.com/emuPlace/Sudachi/releases) If you want daily builds then [Click here](https://git.suyu.dev/suyu/suyu/actions) If you don't know how to download the daily builds then [Click here](https://git.suyu.dev/suyu/suyu/raw/branch/dev/img/daily-builds.png) From e4ae2030eced6f7a39e178aa7f767ee155679545 Mon Sep 17 00:00:00 2001 From: Crimson-Hawk Date: Thu, 18 Apr 2024 20:08:32 +0800 Subject: [PATCH 129/165] change builds to work with my runners --- .forgejo/workflows/codespell.yml | 2 +- .forgejo/workflows/reuse.yml | 2 +- .forgejo/workflows/verify.yml | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.forgejo/workflows/codespell.yml b/.forgejo/workflows/codespell.yml index d711137d3a..951e1583ef 100644 --- a/.forgejo/workflows/codespell.yml +++ b/.forgejo/workflows/codespell.yml @@ -20,7 +20,7 @@ permissions: {} jobs: codespell: name: Check for spelling errors - runs-on: verify + runs-on: docker steps: - uses: https://code.forgejo.org/actions/checkout@v3 with: diff --git a/.forgejo/workflows/reuse.yml b/.forgejo/workflows/reuse.yml index 39bbbdf2c6..ba2fe448b5 100644 --- a/.forgejo/workflows/reuse.yml +++ b/.forgejo/workflows/reuse.yml @@ -30,7 +30,7 @@ jobs: reuse: name: Check REUSE Specification - runs-on: verify + runs-on: docker if: ${{ github.repository == 'suyu/suyu' }} steps: - uses: https://code.forgejo.org/actions/checkout@v3 diff --git a/.forgejo/workflows/verify.yml b/.forgejo/workflows/verify.yml index 1292ddcfa9..c858448468 100644 --- a/.forgejo/workflows/verify.yml +++ b/.forgejo/workflows/verify.yml @@ -38,7 +38,7 @@ env: jobs: format: name: 'Verify Format' - runs-on: ubuntu-latest + runs-on: docker container: fijxu/build-environments:linux-clang-format steps: - uses: https://code.forgejo.org/actions/checkout@v3 @@ -54,7 +54,7 @@ jobs: build-linux: name: 'test build' needs: format - runs-on: ubuntu-latest + runs-on: docker strategy: fail-fast: false matrix: @@ -175,7 +175,7 @@ jobs: # name: ${{ env.INDIVIDUAL_EXE }} # path: ${{ env.INDIVIDUAL_EXE }} android: - runs-on: ubuntu-latest + runs-on: docker container: fijxu/build-environments:android needs: format steps: From 2634b68ac5cdac9be8b1afec99b380b18db58996 Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Thu, 18 Apr 2024 17:33:35 +0200 Subject: [PATCH 130/165] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c976ef850a..f96137838c 100644 --- a/README.md +++ b/README.md @@ -21,9 +21,9 @@ Support the original suyu developer team [here](https://discord.gg/ajz5hdrZ)
-

suyu is the continuation of the world's most popular, open-source, Nintendo Switch emulator. +

suyu was the continuation of the world's most popular, open-source Nintendo Switch emulator, yuzu, but is now something more.
-It is written in C++ (C# possibly required soon) with portability in mind, we actively work on builds for Windows, Linux and Android, along with a WIP custom OS called suyuOS (https://git.suyu.dev/suyu/suyu-os) . +It is written in C++ (C# possibly required soon) with portability in mind, we actively work on builds for Windows, Linux and Android and hopefully IOS, along with a WIP custom OS called suyuOS (https://git.suyu.dev/suyu/suyu-os) .

@@ -62,6 +62,7 @@ You can also contact any of the developers on Discord to learn more about the cu * __Linux__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __macOS__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __Android__: [Releases](https://git.suyu.dev/suyu/suyu/releases) +* __For IOS users, we recommend Sudachi__: [Releases](https://github.com/emuPlace/Sudachi/releases) If you want daily builds then [Click here](https://git.suyu.dev/suyu/suyu/actions) If you don't know how to download the daily builds then [Click here](https://git.suyu.dev/suyu/suyu/raw/branch/dev/img/daily-builds.png) From 6e224957ef8940e2817735140b6ac49a3877755d Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Thu, 18 Apr 2024 17:35:38 +0200 Subject: [PATCH 131/165] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f96137838c..54274fa083 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Support the original suyu developer team [here](https://discord.gg/ajz5hdrZ)

suyu was the continuation of the world's most popular, open-source Nintendo Switch emulator, yuzu, but is now something more.
-It is written in C++ (C# possibly required soon) with portability in mind, we actively work on builds for Windows, Linux and Android and hopefully IOS, along with a WIP custom OS called suyuOS (https://git.suyu.dev/suyu/suyu-os) . +It is written in C++ (C# possibly required soon) with portability in mind, we actively work on builds for Windows, Linux, Android and hopefully IOS, along with a WIP custom OS called suyuOS (https://git.suyu.dev/suyu/suyu-os) .

From e78d87419d45532c302f8bc05bc0ffaf177e3a6e Mon Sep 17 00:00:00 2001 From: Rishypeasy Date: Fri, 19 Apr 2024 03:43:13 +0200 Subject: [PATCH 132/165] updated Readme signed Rishy --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 54274fa083..bd95597639 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Right now we only have daily builds for Linux and Android. We have official builds [here.](https://git.suyu.dev/suyu/suyu/releases) If any website or person is claiming to have a build for suyu, take that with a grain of salt. -## Building +## Builds * __Windows__: [Windows Build](https://git.suyu.dev/suyu/suyu/wiki/Building-For-Windows) * __Linux__: [Linux Build](https://git.suyu.dev/suyu/suyu/wiki/Building-For-Linux) From 0ec20143503925c54527baac624c942e75f63a58 Mon Sep 17 00:00:00 2001 From: mctaylors Date: Wed, 17 Apr 2024 15:07:46 +0300 Subject: [PATCH 133/165] update links --- dist/languages/ar.ts | 4 ++-- dist/languages/ca.ts | 4 ++-- dist/languages/cs.ts | 4 ++-- dist/languages/da.ts | 4 ++-- dist/languages/de.ts | 4 ++-- dist/languages/el.ts | 4 ++-- dist/languages/es.ts | 4 ++-- dist/languages/fi.ts | 4 ++-- dist/languages/fr.ts | 4 ++-- dist/languages/hu.ts | 4 ++-- dist/languages/id.ts | 4 ++-- dist/languages/it.ts | 4 ++-- dist/languages/ja_JP.ts | 4 ++-- dist/languages/ko_KR.ts | 4 ++-- dist/languages/nb.ts | 4 ++-- dist/languages/nl.ts | 4 ++-- dist/languages/pl.ts | 4 ++-- dist/languages/pt_BR.ts | 4 ++-- dist/languages/pt_PT.ts | 4 ++-- dist/languages/ru_RU.ts | 4 ++-- dist/languages/sv.ts | 4 ++-- dist/languages/tr_TR.ts | 4 ++-- dist/languages/uk.ts | 4 ++-- dist/languages/vi.ts | 4 ++-- dist/languages/vi_VN.ts | 4 ++-- dist/languages/zh_CN.ts | 4 ++-- dist/languages/zh_TW.ts | 4 ++-- src/android/app/src/main/res/values-ar/strings.xml | 6 +++--- src/android/app/src/main/res/values-ckb/strings.xml | 6 +++--- src/android/app/src/main/res/values-cs/strings.xml | 6 +++--- src/android/app/src/main/res/values-de/strings.xml | 6 +++--- src/android/app/src/main/res/values-es/strings.xml | 6 +++--- src/android/app/src/main/res/values-fa/strings.xml | 6 +++--- src/android/app/src/main/res/values-fr/strings.xml | 6 +++--- src/android/app/src/main/res/values-he/strings.xml | 6 +++--- src/android/app/src/main/res/values-hu/strings.xml | 6 +++--- src/android/app/src/main/res/values-id/strings.xml | 6 +++--- src/android/app/src/main/res/values-it/strings.xml | 6 +++--- src/android/app/src/main/res/values-ja/strings.xml | 6 +++--- src/android/app/src/main/res/values-ko/strings.xml | 6 +++--- src/android/app/src/main/res/values-nb/strings.xml | 6 +++--- src/android/app/src/main/res/values-pl/strings.xml | 6 +++--- src/android/app/src/main/res/values-pt-rBR/strings.xml | 6 +++--- src/android/app/src/main/res/values-pt-rPT/strings.xml | 6 +++--- src/android/app/src/main/res/values-ru/strings.xml | 6 +++--- src/android/app/src/main/res/values-uk/strings.xml | 6 +++--- src/android/app/src/main/res/values-vi/strings.xml | 6 +++--- src/android/app/src/main/res/values-zh-rCN/strings.xml | 6 +++--- src/android/app/src/main/res/values-zh-rTW/strings.xml | 6 +++--- src/android/app/src/main/res/values/strings.xml | 6 +++--- src/suyu/main.cpp | 2 +- 51 files changed, 124 insertions(+), 124 deletions(-) diff --git a/dist/languages/ar.ts b/dist/languages/ar.ts index d9017ada62..dacbcdf68d 100644 --- a/dist/languages/ar.ts +++ b/dist/languages/ar.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">موقعنا</span></a>|<a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">رماز المصدر</span></a>|<a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">المساهمون</span></a>|<a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">الرخصة</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">موقعنا</span></a>|<a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">رماز المصدر</span></a>|<a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">المساهمون</span></a>|<a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">الرخصة</span></a></p></body></html> diff --git a/dist/languages/ca.ts b/dist/languages/ca.ts index 61ad09bf06..a131d85022 100644 --- a/dist/languages/ca.ts +++ b/dist/languages/ca.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Pàgina web</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Codi Font</span></a>|<a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contribuïdors</span></a>|<a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Llicència</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Pàgina web</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Codi Font</span></a>|<a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contribuïdors</span></a>|<a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Llicència</span></a></p></body></html> diff --git a/dist/languages/cs.ts b/dist/languages/cs.ts index 9b6f5fc25a..ff25846b5a 100644 --- a/dist/languages/cs.ts +++ b/dist/languages/cs.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Webové stránky</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Zdrojový kód</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Přispěvatelé</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licence</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Webové stránky</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Zdrojový kód</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Přispěvatelé</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licence</span></a></p></body></html> diff --git a/dist/languages/da.ts b/dist/languages/da.ts index ddc4c96d3d..3ca2244fb2 100644 --- a/dist/languages/da.ts +++ b/dist/languages/da.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/">Netsted<span style=" text-decoration: underline; color:#039be5;"></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Kildekode</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Bidragsydere</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licens</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/">Netsted<span style=" text-decoration: underline; color:#039be5;"></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Kildekode</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Bidragsydere</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licens</span></a></p></body></html> diff --git a/dist/languages/de.ts b/dist/languages/de.ts index e1ddd36975..8d862a62b9 100644 --- a/dist/languages/de.ts +++ b/dist/languages/de.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Webseite</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Quellcode</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Mitwirkende</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Lizenz</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Webseite</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Quellcode</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Mitwirkende</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Lizenz</span></a></p></body></html> diff --git a/dist/languages/el.ts b/dist/languages/el.ts index b8eb0ed3b8..4f8f6a5aac 100644 --- a/dist/languages/el.ts +++ b/dist/languages/el.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Ιστοσελίδα</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Πηγαίος Κώδικας</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Συνεργάτες</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"></span>Άδεια</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Ιστοσελίδα</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Πηγαίος Κώδικας</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Συνεργάτες</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"></span>Άδεια</span></a></p></body></html> diff --git a/dist/languages/es.ts b/dist/languages/es.ts index 5690a95dec..e9824bc5fc 100644 --- a/dist/languages/es.ts +++ b/dist/languages/es.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Página web</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Código fuente</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contribuidores</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licencia</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Página web</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Código fuente</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contribuidores</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licencia</span></a></p></body></html> diff --git a/dist/languages/fi.ts b/dist/languages/fi.ts index 146d4e1dd9..0f22433d5b 100644 --- a/dist/languages/fi.ts +++ b/dist/languages/fi.ts @@ -40,8 +40,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/license.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Nettisivu</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Lähdekoodi</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Lahjoittajat</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/license.txt"><span style=" text-decoration: underline; color:#039be5;">Lisenssi</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/license.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Nettisivu</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Lähdekoodi</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Lahjoittajat</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/license.txt"><span style=" text-decoration: underline; color:#039be5;">Lisenssi</span></a></p></body></html> diff --git a/dist/languages/fr.ts b/dist/languages/fr.ts index a45580d312..3619e564c7 100644 --- a/dist/languages/fr.ts +++ b/dist/languages/fr.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Site Web</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Code Source</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributeurs</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licence</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Site Web</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Code Source</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributeurs</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licence</span></a></p></body></html> diff --git a/dist/languages/hu.ts b/dist/languages/hu.ts index bd7d056e04..1b43397f17 100644 --- a/dist/languages/hu.ts +++ b/dist/languages/hu.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Weboldal</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Forráskód</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Közreműködők</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licensz</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Weboldal</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Forráskód</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Közreműködők</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licensz</span></a></p></body></html> diff --git a/dist/languages/id.ts b/dist/languages/id.ts index 1a03da74e3..3bce2fc749 100644 --- a/dist/languages/id.ts +++ b/dist/languages/id.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Situs web</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Kode Sumber</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Kontributor</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Lisensi</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Situs web</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Kode Sumber</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Kontributor</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Lisensi</span></a></p></body></html> diff --git a/dist/languages/it.ts b/dist/languages/it.ts index 6155074272..ec70f9d809 100644 --- a/dist/languages/it.ts +++ b/dist/languages/it.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Sito web</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Codice sorgente</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributori</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licenza</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Sito web</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Codice sorgente</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributori</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licenza</span></a></p></body></html> diff --git a/dist/languages/ja_JP.ts b/dist/languages/ja_JP.ts index c5d15f14f6..39bd1ba0a7 100644 --- a/dist/languages/ja_JP.ts +++ b/dist/languages/ja_JP.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">ウェブサイト</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">ソースコード</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">貢献者</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">ライセンス</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">ウェブサイト</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">ソースコード</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">貢献者</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">ライセンス</span></a></p></body></html> diff --git a/dist/languages/ko_KR.ts b/dist/languages/ko_KR.ts index 57fdcced57..4fe347f6d5 100644 --- a/dist/languages/ko_KR.ts +++ b/dist/languages/ko_KR.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">웹사이트</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">소스 코드</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">기여자</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">라이센스</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">웹사이트</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">소스 코드</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">기여자</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">라이센스</span></a></p></body></html> diff --git a/dist/languages/nb.ts b/dist/languages/nb.ts index 6feaaecb77..7ee7b5878b 100644 --- a/dist/languages/nb.ts +++ b/dist/languages/nb.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Nettside</span></a>|<a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Kildekode</span></a>|<a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Bidragsytere</span></a>|<a href="https://gitlab.com/suyu-emu/suyu/blob/master/license.txt"><span style=" text-decoration: underline; color:#039be5;">Lisens</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Nettside</span></a>|<a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Kildekode</span></a>|<a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Bidragsytere</span></a>|<a href="https://gitlab.com/suyu-emu/suyu/blob/master/license.txt"><span style=" text-decoration: underline; color:#039be5;">Lisens</span></a></p></body></html> diff --git a/dist/languages/nl.ts b/dist/languages/nl.ts index 6cf1353919..7fdba359b8 100644 --- a/dist/languages/nl.ts +++ b/dist/languages/nl.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Broncode</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Bijdragers</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licentie</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Broncode</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Bijdragers</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licentie</span></a></p></body></html> diff --git a/dist/languages/pl.ts b/dist/languages/pl.ts index 218983e0c6..b60eca3648 100644 --- a/dist/languages/pl.ts +++ b/dist/languages/pl.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Strona</span></a>I<a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Kod Źródłowy</span></a>I<a href="https://gitlab.com/suyu-emu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Kontrybutorzy</span></a>I<a href="https://gitlab.com/suyu-emu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licencja</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Strona</span></a>I<a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Kod Źródłowy</span></a>I<a href="https://gitlab.com/suyu-emu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Kontrybutorzy</span></a>I<a href="https://gitlab.com/suyu-emu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licencja</span></a></p></body></html> diff --git a/dist/languages/pt_BR.ts b/dist/languages/pt_BR.ts index 644edd310f..caf2f84078 100644 --- a/dist/languages/pt_BR.ts +++ b/dist/languages/pt_BR.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Site</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Código-fonte</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Colaboradores</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licença</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Site</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Código-fonte</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Colaboradores</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licença</span></a></p></body></html> diff --git a/dist/languages/pt_PT.ts b/dist/languages/pt_PT.ts index d14540c667..8cd779e40a 100644 --- a/dist/languages/pt_PT.ts +++ b/dist/languages/pt_PT.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - Site | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Código fonte | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contribuidores</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licença</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + Site | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Código fonte | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contribuidores</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licença</span></a></p></body></html> diff --git a/dist/languages/ru_RU.ts b/dist/languages/ru_RU.ts index 66d56b73f3..924cca9909 100644 --- a/dist/languages/ru_RU.ts +++ b/dist/languages/ru_RU.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Веб-сайт</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Исходный код</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Контрибьюторы</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Лицензия</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Веб-сайт</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Исходный код</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Контрибьюторы</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Лицензия</span></a></p></body></html> diff --git a/dist/languages/sv.ts b/dist/languages/sv.ts index 140189c779..26d4e8e497 100644 --- a/dist/languages/sv.ts +++ b/dist/languages/sv.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Hemsida</span></a>I<a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Källkod</span></a>I<a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Bidragsgivare</span></a>I<a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licens</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Hemsida</span></a>I<a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Källkod</span></a>I<a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Bidragsgivare</span></a>I<a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Licens</span></a></p></body></html> diff --git a/dist/languages/tr_TR.ts b/dist/languages/tr_TR.ts index 61532becdb..3f17dd29d7 100644 --- a/dist/languages/tr_TR.ts +++ b/dist/languages/tr_TR.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a>|<a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Kaynak Kodu</span></a>|<a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Katkıda Bulunanlar</span></a>|<a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Lisans</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a>|<a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Kaynak Kodu</span></a>|<a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Katkıda Bulunanlar</span></a>|<a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Lisans</span></a></p></body></html> diff --git a/dist/languages/uk.ts b/dist/languages/uk.ts index aeb837b4c2..b3b77aa3e0 100644 --- a/dist/languages/uk.ts +++ b/dist/languages/uk.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Веб-сайт</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Першокод</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Вкладники</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Ліцензія</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Веб-сайт</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Першокод</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Вкладники</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Ліцензія</span></a></p></body></html> diff --git a/dist/languages/vi.ts b/dist/languages/vi.ts index 38bdc29076..07f153deca 100644 --- a/dist/languages/vi.ts +++ b/dist/languages/vi.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Trang web</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Mã nguồn</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Người đóng góp</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Giấy phép</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Trang web</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Mã nguồn</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Người đóng góp</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">Giấy phép</span></a></p></body></html> diff --git a/dist/languages/vi_VN.ts b/dist/languages/vi_VN.ts index 81cb3647fd..e619e8ad8f 100644 --- a/dist/languages/vi_VN.ts +++ b/dist/languages/vi_VN.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Trang web</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Mã nguồn</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Đóng góp</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/license.txt"><span style=" text-decoration: underline; color:#039be5;">Giấy phép</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Trang web</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Mã nguồn</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Đóng góp</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/license.txt"><span style=" text-decoration: underline; color:#039be5;">Giấy phép</span></a></p></body></html> diff --git a/dist/languages/zh_CN.ts b/dist/languages/zh_CN.ts index 688a0eae01..09b8431f20 100644 --- a/dist/languages/zh_CN.ts +++ b/dist/languages/zh_CN.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">官方网站</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">源代码</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">贡献者</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">许可证</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">官方网站</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">源代码</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">贡献者</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">许可证</span></a></p></body></html> diff --git a/dist/languages/zh_TW.ts b/dist/languages/zh_TW.ts index 29bdb89afd..399195b394 100644 --- a/dist/languages/zh_TW.ts +++ b/dist/languages/zh_TW.ts @@ -35,8 +35,8 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> - <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">官網</span></a> | <a href="https://gitlab.com/suyu-emu"><span style=" text-decoration: underline; color:#039be5;">原始碼</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/graphs/contributors"><span style=" text-decoration: underline; color:#039be5;">貢獻者</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">許可證</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev/"><span style=" text-decoration: underline; color:#039be5;">官網</span></a> | <a href="https://git.suyu.dev/suyu"><span style=" text-decoration: underline; color:#039be5;">原始碼</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">貢獻者</span></a> | <a href="https://gitlab.com/suyu-emu/suyu/blob/master/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">許可證</span></a></p></body></html> diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml index 6717a3527a..3369a613ce 100644 --- a/src/android/app/src/main/res/values-ar/strings.xml +++ b/src/android/app/src/main/res/values-ar/strings.xml @@ -137,7 +137,7 @@ محاكي سويتش مفتوح المصدر المساهمين مصنوع من فريق يوزو - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ المشاريع التي تجعل تطبيق يوزو لنظام أندرويد ممكنًا البناء بيانات المستخدم @@ -149,9 +149,9 @@ تم تصدير بيانات المستخدم بنجاح تم استيراد بيانات المستخدم بنجاح تم إلغاء التصدير - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ الوصول المبكر diff --git a/src/android/app/src/main/res/values-ckb/strings.xml b/src/android/app/src/main/res/values-ckb/strings.xml index 510b33bcad..c294233f42 100644 --- a/src/android/app/src/main/res/values-ckb/strings.xml +++ b/src/android/app/src/main/res/values-ckb/strings.xml @@ -103,12 +103,12 @@ ئیمۆلیتەرێکی سەرچاوە-کراوەی سویچ بەشداربووان دروستکراوە لەگەڵ \u2764 لەلایەن تیمەکەی یوزو - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ ئەو پڕۆژانەی کە یوزوی بۆ ئەندرۆید ڕەخساند بونیات - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ بەزوویی دەسپێگەشتن diff --git a/src/android/app/src/main/res/values-cs/strings.xml b/src/android/app/src/main/res/values-cs/strings.xml index 4318d89afd..865fb76f5e 100644 --- a/src/android/app/src/main/res/values-cs/strings.xml +++ b/src/android/app/src/main/res/values-cs/strings.xml @@ -86,7 +86,7 @@ Open-source Switch emulátor Přispěvatelé Vyrobeno s \u2764 od suyu týmu - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ Číslo sestavení Uživatelská data Exportování uživatelských dat... @@ -96,9 +96,9 @@ Uživatelská data byla úspěšně exportována. Uživatelská data byla úspěšně importována. Export zrušen - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ https://play.google.com/store/apps/details?id=org.suyu.suyu_emu.ea Žádná manuální instalace diff --git a/src/android/app/src/main/res/values-de/strings.xml b/src/android/app/src/main/res/values-de/strings.xml index b74c08c6ce..4f4f34630a 100644 --- a/src/android/app/src/main/res/values-de/strings.xml +++ b/src/android/app/src/main/res/values-de/strings.xml @@ -122,7 +122,7 @@ Wirklich fortfahren? Ein quelloffener Switch-Emulator Beitragende Gemacht mit \u2764 vom suyu Team - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ Projekte, die suyu für Android möglich machen Build Nutzerdaten @@ -131,9 +131,9 @@ Wirklich fortfahren? Nutzerdaten erfolgreich exportiert Nutzerdaten erfolgreich importiert Export abgebrochen - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ Early Access diff --git a/src/android/app/src/main/res/values-es/strings.xml b/src/android/app/src/main/res/values-es/strings.xml index 7262bff489..8f401ce1bd 100644 --- a/src/android/app/src/main/res/values-es/strings.xml +++ b/src/android/app/src/main/res/values-es/strings.xml @@ -167,7 +167,7 @@ Un emulador de Switch de código abierto Contribuidores Hecho con \u2764 del equipo suyu - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ Proyectos que hacen que suyu para Android sea una realidad Versión Datos de usuario @@ -180,9 +180,9 @@ Datos de usuario importados con éxito Exportación cancelada Asegúrese de que las carpetas de datos de usuario estén en la raíz de la carpeta del zip y contengan un archivo config en config/config.ini e inténtelo de nuevo. - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ Early Access diff --git a/src/android/app/src/main/res/values-fa/strings.xml b/src/android/app/src/main/res/values-fa/strings.xml index 884e9e4334..a63c32e059 100644 --- a/src/android/app/src/main/res/values-fa/strings.xml +++ b/src/android/app/src/main/res/values-fa/strings.xml @@ -165,7 +165,7 @@ یک شبیه‌ساز سوئیچ منبع باز مشارکت کنندگان Made with \u2764 from the suyu team - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ پروژه‌هایی که suyu را برای اندروید ممکن می‌سازند ساخت داده کاربر @@ -178,9 +178,9 @@ داده‌های کاربر با موفقیت وارد شد صدور لغو شد مطمئن شوید که پوشه‌های داده کاربر در ریشه پوشه zip و حاوی یک فایل پیکربندی در config/config.ini هستند سپس دوباره امتحان کنید. - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ دسترسی زودهنگام diff --git a/src/android/app/src/main/res/values-fr/strings.xml b/src/android/app/src/main/res/values-fr/strings.xml index 34bfd2cb79..d1a36c0f79 100644 --- a/src/android/app/src/main/res/values-fr/strings.xml +++ b/src/android/app/src/main/res/values-fr/strings.xml @@ -167,7 +167,7 @@ Un émulateur Switch open source Contributeurs Fait avec \u2764 de l\'équipe suyu - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ Des projets qui rendent possible suyu pour Android Build Données utilisateur @@ -180,9 +180,9 @@ Les données utilisateur ont été importées avec succès Exportation annulée Assurez-vous que les dossiers de données utilisateur se trouvent à la racine du dossier ZIP et contiennent un fichier de configuration à config/config.ini, puis réessayez. - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ Early Access diff --git a/src/android/app/src/main/res/values-he/strings.xml b/src/android/app/src/main/res/values-he/strings.xml index ee8be05463..fb5163268c 100644 --- a/src/android/app/src/main/res/values-he/strings.xml +++ b/src/android/app/src/main/res/values-he/strings.xml @@ -152,7 +152,7 @@ אמולטור Switch עם קוד פתוח תורמים נוצר עם \u2764 מקבוצת suyu - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ פרוייקטים שהופכים את suyu ל Android אפשרי גרסה נתוני משתמש @@ -165,9 +165,9 @@ נתוני משתמש יובאו בהצלחה ייצוא בוטל ודא שנתוני המשתמש נמצאים בשורש קובץ ה zip ושהוא מכיל קובץ סידור ב config/config.ini ונסה שוב. - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ גישה מוקדמת diff --git a/src/android/app/src/main/res/values-hu/strings.xml b/src/android/app/src/main/res/values-hu/strings.xml index 61d44a91fe..073c41f6a9 100644 --- a/src/android/app/src/main/res/values-hu/strings.xml +++ b/src/android/app/src/main/res/values-hu/strings.xml @@ -163,7 +163,7 @@ Egy nyílt forráskódú Switch emulátor Hozzájárulók \u2764 által készítve a suyu csapattól - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ Projektek, amik nélkül a suyu nem jöhetett volna létre Androidra Felhasználói adatok Az összes alkalmazásadat importálása/exportálása.\n\nA felhasználói adatok importálásakor az összes meglévő felhasználói adat törlődik! @@ -175,9 +175,9 @@ Felhasználói adatok sikeresen importálva Exportálás megszakítva Ellenőrizd, hogy a felhasználói adatok mappái a zip mappa gyökerében vannak, és tartalmaznak egy konfig fájlt a config/config.ini címen, majd próbáld meg újra. - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ Korai hozzáférés diff --git a/src/android/app/src/main/res/values-id/strings.xml b/src/android/app/src/main/res/values-id/strings.xml index b80ceb837b..032d4e7aad 100644 --- a/src/android/app/src/main/res/values-id/strings.xml +++ b/src/android/app/src/main/res/values-id/strings.xml @@ -163,7 +163,7 @@ Emulator Switch Open-Source Kontributor Dibuat dengan \u2764 dari tim suyu - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ Proyek yang memungkinkan suyu untuk Android Versi Data pengguna @@ -176,9 +176,9 @@ Berhasil mengimpor data pengguna Ekspor Dibatalkan Pastikan folder data pengguna berada di akar folder zip dan berisi file konfigurasi di config/config.ini dan coba lagi. - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ Akses lebih awal diff --git a/src/android/app/src/main/res/values-it/strings.xml b/src/android/app/src/main/res/values-it/strings.xml index 7a923d2fc3..d4f7f8eca2 100644 --- a/src/android/app/src/main/res/values-it/strings.xml +++ b/src/android/app/src/main/res/values-it/strings.xml @@ -155,7 +155,7 @@ Un emulatore della Switch open-source. Collaboratori Realizzato con \u2764 dal team suyu - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ Progetti che rendono suyu per Android possibile Compilazione Dati Utente @@ -168,9 +168,9 @@ Dati Utente importati con successo. Esportazione annullata Assicurati che la cartella dei Dati dell\'utente stiano nella radice del file.zip e che sia presente una cartella config in config/config.ini, poi, riprova. - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ Accesso Anticipato diff --git a/src/android/app/src/main/res/values-ja/strings.xml b/src/android/app/src/main/res/values-ja/strings.xml index 5294298faa..58be4d92df 100644 --- a/src/android/app/src/main/res/values-ja/strings.xml +++ b/src/android/app/src/main/res/values-ja/strings.xml @@ -122,7 +122,7 @@ オープンソースのSwitchエミュレータ 貢献者 suyuチームの\u2764で作られた - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ suyu for Androidの作成を可能にしたプロジェクト ビルド ユーザデータ @@ -132,9 +132,9 @@ ユーザデータのエクスポートに成功しました ユーザデータのインポートに成功しました エクスポートをキャンセルしました - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ 早期アクセス diff --git a/src/android/app/src/main/res/values-ko/strings.xml b/src/android/app/src/main/res/values-ko/strings.xml index 4a32020520..b843589fcd 100644 --- a/src/android/app/src/main/res/values-ko/strings.xml +++ b/src/android/app/src/main/res/values-ko/strings.xml @@ -163,7 +163,7 @@ 오픈 소스 Switch 에뮬레이터 기여자 suyu 팀의 \u2764로 제작 - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ Android용 suyu를 가능하게 하는 프로젝트 빌드 유저 데이터 @@ -176,9 +176,9 @@ 유저 데이터를 가져왔습니다. 내보내기 취소됨 유저 데이터 폴더가 ZIP 폴더의 루트 디렉토리에 위치하고 config/config.ini 구성 파일이 있는지 확인하고 다시 시도하세요. - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ 앞서 해보기 diff --git a/src/android/app/src/main/res/values-nb/strings.xml b/src/android/app/src/main/res/values-nb/strings.xml index c9ba29339b..5ba71ffcb3 100644 --- a/src/android/app/src/main/res/values-nb/strings.xml +++ b/src/android/app/src/main/res/values-nb/strings.xml @@ -103,12 +103,12 @@ En Switch-emulator med åpen kildekode Bidragsytere Laget med \u2764 fra suyu-teamet - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ Prosjekter som gjør suyu for Android mulig Bygg - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ Tidlig tilgang diff --git a/src/android/app/src/main/res/values-pl/strings.xml b/src/android/app/src/main/res/values-pl/strings.xml index fedb52c0da..490547daa2 100644 --- a/src/android/app/src/main/res/values-pl/strings.xml +++ b/src/android/app/src/main/res/values-pl/strings.xml @@ -103,12 +103,12 @@ Otwarto-źródłowy emulator konsoli Switch Współtwórcy Stworzone z \u2764 przez zespół suyu - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ Projekty dzięki którym suyu mógł zostać stworzony Wersja - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ Wczesny dostęp diff --git a/src/android/app/src/main/res/values-pt-rBR/strings.xml b/src/android/app/src/main/res/values-pt-rBR/strings.xml index 2abc99fb9f..ae2036d4b4 100644 --- a/src/android/app/src/main/res/values-pt-rBR/strings.xml +++ b/src/android/app/src/main/res/values-pt-rBR/strings.xml @@ -167,7 +167,7 @@ Um emulador de Switch de código aberto Colaboradores Feito com \u2764 da equipe do Suyu - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ Projetos que tornam o suyu para Android possível Versão da Compilação Dados do usuário @@ -180,9 +180,9 @@ Dados de usuário importados com sucesso Exportação cancelada Verifique se as pastas de dados do usuário estão na raiz da pasta zip, se possuem um arquivo de configuração em config/config.ini e tente novamente. - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ Acesso Antecipado diff --git a/src/android/app/src/main/res/values-pt-rPT/strings.xml b/src/android/app/src/main/res/values-pt-rPT/strings.xml index e326cdd400..4c34f902be 100644 --- a/src/android/app/src/main/res/values-pt-rPT/strings.xml +++ b/src/android/app/src/main/res/values-pt-rPT/strings.xml @@ -167,7 +167,7 @@ Um emulador Switch de código aberto Contribuidores Feito com \u2764 da equipa do Suyu - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ Projetos que tornam o suyu para Android possível Versão Dado de utilizados @@ -180,9 +180,9 @@ Dados de utilizador importado com sucesso Exportação cancelada Verifiqua se as pastas de dados do utilizados estão na raiz da pasta zip e contêm um arquivo de configuração em config/config.ini e tenta novamente. - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ Acesso antecipado diff --git a/src/android/app/src/main/res/values-ru/strings.xml b/src/android/app/src/main/res/values-ru/strings.xml index c78667db11..f86af3c931 100644 --- a/src/android/app/src/main/res/values-ru/strings.xml +++ b/src/android/app/src/main/res/values-ru/strings.xml @@ -170,7 +170,7 @@ Эмулятор Switch с открытым исходным кодом Контрибьюторы Сделано с \u2764 от команды suyu - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ Проекты, которые сделали suyu для Android возможным Сборка Данные пользователя @@ -183,9 +183,9 @@ Пользовательские данные успешно импортированы Экспорт отменен Убедитесь что папки пользовательских данных находятся в корне zip-папки и содержат файл конфигурации config/config.ini и повторите попытку. - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ Ранний доступ diff --git a/src/android/app/src/main/res/values-uk/strings.xml b/src/android/app/src/main/res/values-uk/strings.xml index 9b8c71ccfd..2564c03205 100644 --- a/src/android/app/src/main/res/values-uk/strings.xml +++ b/src/android/app/src/main/res/values-uk/strings.xml @@ -89,11 +89,11 @@ Емулятор Switch із відкритим першокодом Вкладники Зроблено з \u2764 від команди suyu - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ Збірка - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ Ранній доступ diff --git a/src/android/app/src/main/res/values-vi/strings.xml b/src/android/app/src/main/res/values-vi/strings.xml index 4c0446fc96..272d8000ed 100644 --- a/src/android/app/src/main/res/values-vi/strings.xml +++ b/src/android/app/src/main/res/values-vi/strings.xml @@ -103,12 +103,12 @@ Một giả lập Switch mã nguồn mở Người đóng góp Được làm với \u2764 từ nhóm suyu - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ Các dự án làm cho suyu trên Android trở thành điều có thể Dựng - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ Early Access diff --git a/src/android/app/src/main/res/values-zh-rCN/strings.xml b/src/android/app/src/main/res/values-zh-rCN/strings.xml index 1cecb2bbf8..6834e8c708 100644 --- a/src/android/app/src/main/res/values-zh-rCN/strings.xml +++ b/src/android/app/src/main/res/values-zh-rCN/strings.xml @@ -163,7 +163,7 @@ 一款开放源代码的 Switch 模拟器 贡献者 suyu 团队的用 \u2764 制作 - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ Android 版 suyu 离不开这些项目的支持 构建版本 用户数据 @@ -176,9 +176,9 @@ 导入用户数据成功 已取消导出数据 请确保用户数据文件夹位于 zip 压缩包的根目录,并在 config/config.ini 路径中包含配置文件,然后重试。 - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ 抢先体验 diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml index 4b2926a95f..5cf8f6f15a 100644 --- a/src/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml @@ -163,7 +163,7 @@ 一個開放原始碼的 Switch 模擬器 參與者 使用來自 suyu 團隊的 \u2764 製作 - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ 這些專案使 suyu Android 版成為可能 組建 使用者資料 @@ -176,9 +176,9 @@ 使用者資料匯入成功 匯出已取消 請確保使用者資料夾位於 zip 壓縮檔的根目錄,並在 config/config.ini 路徑中包含組態檔案,並再試一次。 - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ 搶先體驗 diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index da9c9d2cf8..cbbfd9c766 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -170,7 +170,7 @@ An open-source Switch emulator Contributors Made with \u2764 from the suyu team - https://github.com/suyu-emu/suyu/graphs/contributors + https://git.suyu.dev/suyu/suyu/activity/ Projects that make suyu for Android possible Build User data @@ -183,9 +183,9 @@ User data imported successfully Export cancelled Make sure the user data folders are at the root of the zip folder and contain a config file at config/config.ini and try again. - https://discord.gg/suyu + https://chat.suyu.dev/ https://suyu.dev/ - https://github.com/suyu-emu + https://git.suyu.dev/ Early Access diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index 42a5a6587c..fbdea66e78 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -1848,7 +1848,7 @@ bool GMainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPa const auto description = tr("%1
Please follow the " "suyu quickstart guide to redump your files.
You can refer " - "to the suyu wiki or the suyu Discord for help.", + "to the suyu wiki or the suyu Chat for help.", "%1 signifies an error string.") .arg(QString::fromStdString( GetResultStatusString(static_cast(error_id)))); From 53f628c8cce72963688f009615f9a455f9ed1bba Mon Sep 17 00:00:00 2001 From: mctaylors Date: Wed, 17 Apr 2024 15:17:25 +0300 Subject: [PATCH 134/165] found it --- src/suyu/aboutdialog.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/suyu/aboutdialog.ui b/src/suyu/aboutdialog.ui index d3ed825310..f0752f3746 100644 --- a/src/suyu/aboutdialog.ui +++ b/src/suyu/aboutdialog.ui @@ -127,7 +127,7 @@ p, li { white-space: pre-wrap; } - <html><head/><body><p><a href="https://suyu.dev"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://discord.com/invite/2gQRBp44KT"><span style=" text-decoration: underline; color:#039be5;">Discord</span></a> | <a href="https://git.suyu.dev/suyu/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.suyu.dev/suyu/suyu/src/branch/dev/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> + <html><head/><body><p><a href="https://suyu.dev"><span style=" text-decoration: underline; color:#039be5;">Website</span></a> | <a href="https://chat.suyu.dev"><span style=" text-decoration: underline; color:#039be5;">Chat</span></a> | <a href="https://git.suyu.dev/suyu/suyu"><span style=" text-decoration: underline; color:#039be5;">Source Code</span></a> | <a href="https://git.suyu.dev/suyu/suyu/activity"><span style=" text-decoration: underline; color:#039be5;">Contributors</span></a> | <a href="https://git.suyu.dev/suyu/suyu/src/branch/dev/LICENSE.txt"><span style=" text-decoration: underline; color:#039be5;">License</span></a></p></body></html> true From c0c4bd6fcdd7916d855b198492793ec83c1949c8 Mon Sep 17 00:00:00 2001 From: Crimson-Hawk Date: Fri, 19 Apr 2024 04:45:57 +0200 Subject: [PATCH 135/165] revert e78d87419d45532c302f8bc05bc0ffaf177e3a6e revert updated Readme because the origin is correct and please stop updating readme people are losing faith --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bd95597639..54274fa083 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Right now we only have daily builds for Linux and Android. We have official builds [here.](https://git.suyu.dev/suyu/suyu/releases) If any website or person is claiming to have a build for suyu, take that with a grain of salt. -## Builds +## Building * __Windows__: [Windows Build](https://git.suyu.dev/suyu/suyu/wiki/Building-For-Windows) * __Linux__: [Linux Build](https://git.suyu.dev/suyu/suyu/wiki/Building-For-Linux) From e090ec8b21d4ecc0293c5546c8b1a12177e7ff2a Mon Sep 17 00:00:00 2001 From: portaldevice Date: Sun, 5 May 2024 09:45:23 +0200 Subject: [PATCH 136/165] Add migration instructions for migrating from yuzu (#178) Co-authored-by: Exverge Signed-off-by: Exverge --- MIGRATION.md | 21 +++++++++++++++++++++ README.md | 4 ++++ 2 files changed, 25 insertions(+) create mode 100644 MIGRATION.md diff --git a/MIGRATION.md b/MIGRATION.md new file mode 100644 index 0000000000..425e301136 --- /dev/null +++ b/MIGRATION.md @@ -0,0 +1,21 @@ +# Migrating from yuzu + +When coming from yuzu, the migration is as easy as renaming some directories. + +## Windows + +Use the run dialog to go to `%APPDATA%` or manually go to `C:\Users\{USERNAME}\AppData\Roaming` (you may have to enable hidden files) and simply rename the `yuzu` directories and simply rename those to `suyu`. + +## Unix (macOS/Linux) +Similarly, you can simply rename the folders `~/.local/share/yuzu` and `~/.config/yuzu` to `suyu`, either via a file manager or with the following commands: +```sh + $ mv ~/.local/share/yuzu ~/.local/share/suyu + $ mv ~/.config/yuzu ~/.config/suyu +``` +There is also `~/.cache/yuzu`, which you can safely delete. Suyu will build a fresh cache in its own directory. + +### Linux +Depending on your setup, you may want to substitute those base paths for `$XDG_DATA_HOME` and `$XDG_CONFIG_HOME` respectively. + +## Android +TBD \ No newline at end of file diff --git a/README.md b/README.md index 54274fa083..f5f968d7ab 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,10 @@ It is written in C++ (C# possibly required soon) with portability in mind, we ac ## Hardware Requirements [Click here to see the Hardware Requirements](https://git.suyu.dev/suyu/suyu/wiki/Hardware-Requirements) +## Migrating from yuzu + +See [MIGRATION.md](MIGRATION.md). + ## Status We currently have builds over at the [Releases](https://git.suyu.dev/suyu/suyu/releases) page. From 99ead7123991ba966be6226ab7b7d41b18ffe918 Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Thu, 2 May 2024 18:11:35 +0200 Subject: [PATCH 137/165] Updated README, fixed links in CONTRIBUTING.md Co-authored-by: Exverge Committed-by: Exverge --- CONTRIBUTING.md | 4 ++-- README.md | 15 +++++++-------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b2bb3f0c76..1ff49d5b1f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,5 +6,5 @@ SPDX-License-Identifier: GPL-2.0-or-later Please check out the - * [Contributors's guide](https://gitlab.com/suyu-emu/suyu/-/wikis/Contributing). - * [Merge request guidelines](https://gitlab.com/suyu-emu/suyu/-/wikis/Merge-requests) + * [Contributors's guide](https://git.suyu.dev/suyu/suyu/wiki/Contributing). + * [Merge request guidelines](https://git.suyu.dev/suyu/suyu/wiki/Typical-Git-Workflow#once-your-pull-request-is-ready-to-be-merged) diff --git a/README.md b/README.md index f5f968d7ab..d5f2b29cec 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ SPDX-License-Identifier: GPL-3.0-or-later We're in need of developers. Please join our chat below if you want to contribute! This repo was based on Yuzu EA 4176 but the code is being rewritten from the ground up for legal and performance reasons. -Support the original suyu developer team [here](https://discord.gg/ajz5hdrZ) +Support the original suyu developer team [here](https://discord.gg/79B6wqFPnc)
@@ -23,7 +23,7 @@ Support the original suyu developer team [here](https://discord.gg/ajz5hdrZ)

suyu was the continuation of the world's most popular, open-source Nintendo Switch emulator, yuzu, but is now something more.
-It is written in C++ (C# possibly required soon) with portability in mind, we actively work on builds for Windows, Linux, Android and hopefully IOS, along with a WIP custom OS called suyuOS (https://git.suyu.dev/suyu/suyu-os) . +It is written in C++ with portability in mind, and we actively provide builds for Windows, Linux, Android and iOS potentially coming soon.

@@ -55,10 +55,10 @@ We currently have builds over at the [Releases](https://git.suyu.dev/suyu/suyu/r This project is completely free and open source, and anyone can contribute to help improve suyu. -Most of the development happens on GitLab. For development discussion, please join us in our [Chat](https://chat.suyu.dev). +Most of the development happens on the Git. For development discussion, please join us in our [Chat](https://chat.suyu.dev) or contact a developer. If you want to contribute, please take a look at the [Contributor's Guide](https://git.suyu.dev/suyu/suyu/wiki/Contributing) and [Developer Information](https://git.suyu.dev/suyu/suyu/wiki/Developer-Information). -You can also contact any of the developers on Discord to learn more about the current state of suyu. +You can also contact any of the developers on the Chat to learn more about the current state of suyu. ## Downloads @@ -66,13 +66,12 @@ You can also contact any of the developers on Discord to learn more about the cu * __Linux__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __macOS__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __Android__: [Releases](https://git.suyu.dev/suyu/suyu/releases) -* __For IOS users, we recommend Sudachi__: [Releases](https://github.com/emuPlace/Sudachi/releases) +###### We currently do not provide builds for iOS, however if you would like, you could try the experimental [Sudachi](https://github.com/sudachi-emu/sudachi)/Folium. -If you want daily builds then [Click here](https://git.suyu.dev/suyu/suyu/actions) +If you want daily builds then [Click here](https://git.suyu.dev/suyu/suyu/actions). If you don't know how to download the daily builds then [Click here](https://git.suyu.dev/suyu/suyu/raw/branch/dev/img/daily-builds.png) -Right now we only have daily builds for Linux and Android. -We have official builds [here.](https://git.suyu.dev/suyu/suyu/releases) If any website or person is claiming to have a build for suyu, take that with a grain of salt. +We have official builds [here.](https://git.suyu.dev/suyu/suyu/releases)
If any website or person is claiming to have a build for suyu, take that with a grain of salt. ## Building From 2bacc259969bf740ca9499294dceabfa35cdff11 Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Wed, 8 May 2024 10:39:58 +0200 Subject: [PATCH 138/165] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d5f2b29cec..a423a83169 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ SPDX-License-Identifier: GPL-3.0-or-later We're in need of developers. Please join our chat below if you want to contribute! This repo was based on Yuzu EA 4176 but the code is being rewritten from the ground up for legal and performance reasons. -Support the original suyu developer team [here](https://discord.gg/79B6wqFPnc) +Support the original suyu developer team [here](https://discord.gg/79B6wqFPnc).
@@ -66,7 +66,7 @@ You can also contact any of the developers on the Chat to learn more about the c * __Linux__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __macOS__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __Android__: [Releases](https://git.suyu.dev/suyu/suyu/releases) -###### We currently do not provide builds for iOS, however if you would like, you could try the experimental [Sudachi](https://github.com/sudachi-emu/sudachi)/Folium. +###### We currently do not provide builds for iOS, however if you would like, you could try the experimental [Sudachi](https://github.com/emuPlace/Sudachi/releases)/[Folium](https://github.com/jarrodnorwell/Folium/releases). If you want daily builds then [Click here](https://git.suyu.dev/suyu/suyu/actions). If you don't know how to download the daily builds then [Click here](https://git.suyu.dev/suyu/suyu/raw/branch/dev/img/daily-builds.png) @@ -84,7 +84,7 @@ We have official builds [here.](https://git.suyu.dev/suyu/suyu/releases)
If a ## Support -If you have any questions, don't hesitate to ask us in our [chat](https://chat.suyu.dev). We don't bite! +If you have any questions, don't hesitate to ask us in our [chat](https://chat.suyu.dev), make an issue or contact a developer. We don't bite! ## License From 93b7854f957cae3697ccf506533f87d9adbceb65 Mon Sep 17 00:00:00 2001 From: administrator Date: Tue, 21 May 2024 02:12:22 +0200 Subject: [PATCH 139/165] Remove unsanctioned Discord invite Having a Discord server linked to Suyu poses a risk to the accounts of its members. Moreover, many of the members of this server have quit the Suyu project and do not wish to continue its development. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index a423a83169..6fa5ed4d2e 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,6 @@ SPDX-License-Identifier: GPL-3.0-or-later We're in need of developers. Please join our chat below if you want to contribute! This repo was based on Yuzu EA 4176 but the code is being rewritten from the ground up for legal and performance reasons. -Support the original suyu developer team [here](https://discord.gg/79B6wqFPnc).
From 267ba83d407df2330a1ccd71af8525e4535733e6 Mon Sep 17 00:00:00 2001 From: administrator Date: Tue, 21 May 2024 02:12:22 +0200 Subject: [PATCH 140/165] Remove unsanctioned Discord invite Having a Discord server linked to Suyu poses a risk to the accounts of its members. Moreover, many of the members of this server have quit the Suyu project and do not wish to continue its development. --- MIGRATION.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/MIGRATION.md b/MIGRATION.md index 425e301136..3963b5004f 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -1,3 +1,7 @@ + # Migrating from yuzu When coming from yuzu, the migration is as easy as renaming some directories. From 433bcabb72ef52f6f09ae769d7dd51a6fd274538 Mon Sep 17 00:00:00 2001 From: Crimson Hawk Date: Wed, 29 May 2024 08:53:17 +0800 Subject: [PATCH 141/165] make pipeline run on every branch --- .forgejo/workflows/verify.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/verify.yml b/.forgejo/workflows/verify.yml index c858448468..aebb79e616 100644 --- a/.forgejo/workflows/verify.yml +++ b/.forgejo/workflows/verify.yml @@ -8,7 +8,7 @@ name: 'suyu verify' on: pull_request: - branches: [ "dev" ] + # branches: [ "dev" ] paths: - 'src/**' - 'CMakeModules/**' @@ -19,7 +19,7 @@ on: # paths-ignore: # - 'src/android/**' push: - branches: [ "dev" ] + # branches: [ "dev" ] paths: - 'src/**' - 'CMakeModules/**' From b95cfe64830033280e14c57993ce4b54c4933963 Mon Sep 17 00:00:00 2001 From: Crimson-Hawk Date: Wed, 29 May 2024 16:51:35 +0800 Subject: [PATCH 142/165] fixed reference to gitlab in ci --- .ci/scripts/linux/docker.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.ci/scripts/linux/docker.sh b/.ci/scripts/linux/docker.sh index 82432bd835..43492940c3 100755 --- a/.ci/scripts/linux/docker.sh +++ b/.ci/scripts/linux/docker.sh @@ -52,9 +52,9 @@ DESTDIR="$PWD/AppDir" ninja install rm -vf AppDir/usr/bin/suyu-cmd AppDir/usr/bin/suyu-tester # Download tools needed to build an AppImage -wget -nc https://gitlab.com/suyu-emu/ext-linux-bin/-/raw/main/appimage/deploy-linux.sh -wget -nc https://gitlab.com/suyu-emu/ext-linux-bin/-/raw/main/appimage/exec-x86_64.so -wget -nc https://gitlab.com/suyu-emu/AppImageKit-checkrt/-/raw/old/AppRun.sh +wget -nc https://git.suyu.dev/suyu/ext-linux-bin/raw/branch/main/appimage/deploy-linux.sh +wget -nc https://git.suyu.dev/suyu/ext-linux-bin/raw/branch/main/appimage/exec-x86_64.so +wget -nc https://git.suyu.dev/suyu/AppImageKit-checkrt/raw/branch/gh-workflow/AppRun # Set executable bit chmod 755 \ From e1f809079ed36a6d094f38bf8ba44b27c4332afb Mon Sep 17 00:00:00 2001 From: Crimson-Hawk Date: Wed, 29 May 2024 16:51:35 +0800 Subject: [PATCH 143/165] fixed reference to gitlab in ci --- .ci/scripts/clang/docker.sh | 2 +- .ci/scripts/linux/docker.sh | 2 +- .ci/scripts/windows/docker.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.ci/scripts/clang/docker.sh b/.ci/scripts/clang/docker.sh index 57fbb97544..2fd100b8f8 100755 --- a/.ci/scripts/clang/docker.sh +++ b/.ci/scripts/clang/docker.sh @@ -7,7 +7,7 @@ # Exit on error, rather than continuing with the rest of the script. set -e -ccache -sv +ccache -s mkdir build || true && cd build cmake .. \ diff --git a/.ci/scripts/linux/docker.sh b/.ci/scripts/linux/docker.sh index 43492940c3..c932b5a88a 100755 --- a/.ci/scripts/linux/docker.sh +++ b/.ci/scripts/linux/docker.sh @@ -6,7 +6,7 @@ # Exit on error, rather than continuing with the rest of the script. set -e -ccache -sv +ccache -s mkdir build || true && cd build cmake .. \ diff --git a/.ci/scripts/windows/docker.sh b/.ci/scripts/windows/docker.sh index 73e000324c..12264576e9 100755 --- a/.ci/scripts/windows/docker.sh +++ b/.ci/scripts/windows/docker.sh @@ -8,7 +8,7 @@ set -e #cd /suyu -ccache -sv +ccache -s rm -rf build mkdir -p build && cd build From 7b13512b41682ec85395f4a9144f67da1a7f1c53 Mon Sep 17 00:00:00 2001 From: Crimson-Hawk Date: Wed, 29 May 2024 16:51:35 +0800 Subject: [PATCH 144/165] fixed reference to gitlab in ci --- .ci/scripts/clang/docker.sh | 2 + .ci/scripts/linux/docker.sh | 2 + .ci/scripts/windows/docker.sh | 2 + temp.sh | 75 +++++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+) create mode 100644 temp.sh diff --git a/.ci/scripts/clang/docker.sh b/.ci/scripts/clang/docker.sh index 2fd100b8f8..d59f672087 100755 --- a/.ci/scripts/clang/docker.sh +++ b/.ci/scripts/clang/docker.sh @@ -9,6 +9,8 @@ set -e ccache -s +git submodule update --init --recursive + mkdir build || true && cd build cmake .. \ -DCMAKE_BUILD_TYPE=Release \ diff --git a/.ci/scripts/linux/docker.sh b/.ci/scripts/linux/docker.sh index c932b5a88a..9854429257 100755 --- a/.ci/scripts/linux/docker.sh +++ b/.ci/scripts/linux/docker.sh @@ -8,6 +8,8 @@ set -e ccache -s +git submodule update --init --recursive + mkdir build || true && cd build cmake .. \ -DBoost_USE_STATIC_LIBS=ON \ diff --git a/.ci/scripts/windows/docker.sh b/.ci/scripts/windows/docker.sh index 12264576e9..ba40e5dbbb 100755 --- a/.ci/scripts/windows/docker.sh +++ b/.ci/scripts/windows/docker.sh @@ -10,6 +10,8 @@ set -e ccache -s +git submodule update --init --recursive + rm -rf build mkdir -p build && cd build /usr/bin/x86_64-w64-mingw32-cmake .. \ diff --git a/temp.sh b/temp.sh new file mode 100644 index 0000000000..61aff76cbf --- /dev/null +++ b/temp.sh @@ -0,0 +1,75 @@ +ccache -sv + +mkdir build || true && cd build +cmake .. \ + -DBoost_USE_STATIC_LIBS=ON \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DSUYU_USE_PRECOMPILED_HEADERS=OFF \ + -DDYNARMIC_USE_PRECOMPILED_HEADERS=OFF \ + -DCMAKE_CXX_FLAGS="-march=x86-64-v2" \ + -DCMAKE_CXX_COMPILER=/usr/local/bin/g++ \ + -DCMAKE_C_COMPILER=/usr/local/bin/gcc \ + -DCMAKE_INSTALL_PREFIX="/usr" \ + -DDISPLAY_VERSION=$1 \ + -DENABLE_COMPATIBILITY_LIST_DOWNLOAD=OFF \ + -DENABLE_QT_TRANSLATION=OFF \ + -DUSE_DISCORD_PRESENCE=ON \ + -DSUYU_ENABLE_COMPATIBILITY_REPORTING=${ENABLE_COMPATIBILITY_REPORTING:-"OFF"} \ + -DSUYU_USE_BUNDLED_FFMPEG=ON \ + -DSUYU_ENABLE_LTO=OFF \ + -DSUYU_CRASH_DUMPS=ON \ + -DSUYU_USE_FASTER_LD=ON \ + -GNinja + +ninja + +ccache -sv + +ctest -VV -C Release + +# Separate debug symbols from specified executables +for EXE in suyu; do + EXE_PATH="bin/$EXE" + # Copy debug symbols out + objcopy --only-keep-debug $EXE_PATH $EXE_PATH.debug + # Add debug link and strip debug symbols + objcopy -g --add-gnu-debuglink=$EXE_PATH.debug $EXE_PATH $EXE_PATH.out + # Overwrite original with stripped copy + mv $EXE_PATH.out $EXE_PATH +done +# Strip debug symbols from all executables +find bin/ -type f -not -regex '.*.debug' -exec strip -g {} ';' + +DESTDIR="$PWD/AppDir" ninja install +rm -vf AppDir/usr/bin/suyu-cmd AppDir/usr/bin/suyu-tester + +# Download tools needed to build an AppImage +wget -nc https://git.suyu.dev/suyu/ext-linux-bin/raw/branch/main/appimage/deploy-linux.sh +wget -nc https://git.suyu.dev/suyu/ext-linux-bin/raw/branch/main/appimage/exec-x86_64.so +wget -nc https://git.suyu.dev/suyu/AppImageKit-checkrt/raw/branch/gh-workflow/AppRun + +# Set executable bit +chmod 755 \ + deploy-linux.sh \ + AppRun.sh \ + exec-x86_64.so \ + +# Workaround for https://github.com/AppImage/AppImageKit/issues/828 +export APPIMAGE_EXTRACT_AND_RUN=1 + +mkdir -p AppDir/usr/optional +mkdir -p AppDir/usr/optional/libstdc++ +mkdir -p AppDir/usr/optional/libgcc_s + +# Deploy suyu's needed dependencies +DEPLOY_QT=1 ./deploy-linux.sh AppDir/usr/bin/suyu AppDir + +# Workaround for libQt5MultimediaGstTools indirectly requiring libwayland-client and breaking Vulkan usage on end-user systems +find AppDir -type f -regex '.*libwayland-client\.so.*' -delete -print + +# Workaround for building suyu with GCC 10 but also trying to distribute it to Ubuntu 18.04 et al. +# See https://github.com/darealshinji/AppImageKit-checkrt +cp exec-x86_64.so AppDir/usr/optional/exec.so +cp AppRun.sh AppDir/AppRun +cp --dereference /usr/lib/x86_64-linux-gnu/libstdc++.so.6 AppDir/usr/optional/libstdc++/libstdc++.so.6 +cp --dereference /lib/x86_64-linux-gnu/libgcc_s.so.1 AppDir/usr/optional/libgcc_s/libgcc_s.so.1 From 5f351bf2b37d380371fef5c357eaf571c760ed46 Mon Sep 17 00:00:00 2001 From: Crimson-Hawk Date: Wed, 29 May 2024 17:30:20 +0800 Subject: [PATCH 145/165] remove temp.sh --- temp.sh | 75 --------------------------------------------------------- 1 file changed, 75 deletions(-) delete mode 100644 temp.sh diff --git a/temp.sh b/temp.sh deleted file mode 100644 index 61aff76cbf..0000000000 --- a/temp.sh +++ /dev/null @@ -1,75 +0,0 @@ -ccache -sv - -mkdir build || true && cd build -cmake .. \ - -DBoost_USE_STATIC_LIBS=ON \ - -DCMAKE_BUILD_TYPE=RelWithDebInfo \ - -DSUYU_USE_PRECOMPILED_HEADERS=OFF \ - -DDYNARMIC_USE_PRECOMPILED_HEADERS=OFF \ - -DCMAKE_CXX_FLAGS="-march=x86-64-v2" \ - -DCMAKE_CXX_COMPILER=/usr/local/bin/g++ \ - -DCMAKE_C_COMPILER=/usr/local/bin/gcc \ - -DCMAKE_INSTALL_PREFIX="/usr" \ - -DDISPLAY_VERSION=$1 \ - -DENABLE_COMPATIBILITY_LIST_DOWNLOAD=OFF \ - -DENABLE_QT_TRANSLATION=OFF \ - -DUSE_DISCORD_PRESENCE=ON \ - -DSUYU_ENABLE_COMPATIBILITY_REPORTING=${ENABLE_COMPATIBILITY_REPORTING:-"OFF"} \ - -DSUYU_USE_BUNDLED_FFMPEG=ON \ - -DSUYU_ENABLE_LTO=OFF \ - -DSUYU_CRASH_DUMPS=ON \ - -DSUYU_USE_FASTER_LD=ON \ - -GNinja - -ninja - -ccache -sv - -ctest -VV -C Release - -# Separate debug symbols from specified executables -for EXE in suyu; do - EXE_PATH="bin/$EXE" - # Copy debug symbols out - objcopy --only-keep-debug $EXE_PATH $EXE_PATH.debug - # Add debug link and strip debug symbols - objcopy -g --add-gnu-debuglink=$EXE_PATH.debug $EXE_PATH $EXE_PATH.out - # Overwrite original with stripped copy - mv $EXE_PATH.out $EXE_PATH -done -# Strip debug symbols from all executables -find bin/ -type f -not -regex '.*.debug' -exec strip -g {} ';' - -DESTDIR="$PWD/AppDir" ninja install -rm -vf AppDir/usr/bin/suyu-cmd AppDir/usr/bin/suyu-tester - -# Download tools needed to build an AppImage -wget -nc https://git.suyu.dev/suyu/ext-linux-bin/raw/branch/main/appimage/deploy-linux.sh -wget -nc https://git.suyu.dev/suyu/ext-linux-bin/raw/branch/main/appimage/exec-x86_64.so -wget -nc https://git.suyu.dev/suyu/AppImageKit-checkrt/raw/branch/gh-workflow/AppRun - -# Set executable bit -chmod 755 \ - deploy-linux.sh \ - AppRun.sh \ - exec-x86_64.so \ - -# Workaround for https://github.com/AppImage/AppImageKit/issues/828 -export APPIMAGE_EXTRACT_AND_RUN=1 - -mkdir -p AppDir/usr/optional -mkdir -p AppDir/usr/optional/libstdc++ -mkdir -p AppDir/usr/optional/libgcc_s - -# Deploy suyu's needed dependencies -DEPLOY_QT=1 ./deploy-linux.sh AppDir/usr/bin/suyu AppDir - -# Workaround for libQt5MultimediaGstTools indirectly requiring libwayland-client and breaking Vulkan usage on end-user systems -find AppDir -type f -regex '.*libwayland-client\.so.*' -delete -print - -# Workaround for building suyu with GCC 10 but also trying to distribute it to Ubuntu 18.04 et al. -# See https://github.com/darealshinji/AppImageKit-checkrt -cp exec-x86_64.so AppDir/usr/optional/exec.so -cp AppRun.sh AppDir/AppRun -cp --dereference /usr/lib/x86_64-linux-gnu/libstdc++.so.6 AppDir/usr/optional/libstdc++/libstdc++.so.6 -cp --dereference /lib/x86_64-linux-gnu/libgcc_s.so.1 AppDir/usr/optional/libgcc_s/libgcc_s.so.1 From daf2c1f49658ebe88d9038baf35d4e3c3703a454 Mon Sep 17 00:00:00 2001 From: Crimson-Hawk Date: Wed, 29 May 2024 17:43:46 +0800 Subject: [PATCH 146/165] fix android build --- .ci/scripts/android/build.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.ci/scripts/android/build.sh b/.ci/scripts/android/build.sh index 935919b6de..885ebfee4c 100755 --- a/.ci/scripts/android/build.sh +++ b/.ci/scripts/android/build.sh @@ -7,6 +7,8 @@ export NDK_CCACHE="$(which ccache)" ccache -s +git submodule update --init --recursive + BUILD_FLAVOR="mainline" BUILD_TYPE="release" From 4eb41467f8cf39d666372b5ea78694df970252a3 Mon Sep 17 00:00:00 2001 From: Crimson-Hawk Date: Thu, 4 Jul 2024 12:22:04 +0800 Subject: [PATCH 147/165] correct the false information in readme regarding rewrite --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6fa5ed4d2e..c119a5849d 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ SPDX-License-Identifier: GPL-3.0-or-later **Note**: We do not support or condone piracy in any form. In order to use suyu, you'll need keys from your real Switch system, and games which you have legally obtained and paid for. We do not intend to make money or profit from this project. We're in need of developers. Please join our chat below if you want to contribute! -This repo was based on Yuzu EA 4176 but the code is being rewritten from the ground up for legal and performance reasons. +This repo was based on Yuzu EA 4176
From 5f485a5863aa35061c796a3e69e83039eb92f577 Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Sun, 15 Sep 2024 16:41:53 +0200 Subject: [PATCH 148/165] Updated links --- README.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index c119a5849d..c18d313552 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,8 @@ SPDX-License-Identifier: GPL-3.0-or-later **Note**: We do not support or condone piracy in any form. In order to use suyu, you'll need keys from your real Switch system, and games which you have legally obtained and paid for. We do not intend to make money or profit from this project. -We're in need of developers. Please join our chat below if you want to contribute! -This repo was based on Yuzu EA 4176 +We're in need of developers. Please join our chat below or DM a dev if you want to contribute! +This repo is currently based on Yuzu EA 4176 but the code will be rewritten from the ground up for legal and performance reasons.
@@ -22,12 +22,13 @@ This repo was based on Yuzu EA 4176

suyu was the continuation of the world's most popular, open-source Nintendo Switch emulator, yuzu, but is now something more.
-It is written in C++ with portability in mind, and we actively provide builds for Windows, Linux, Android and iOS potentially coming soon. +It is written in C++ with portability in mind, and we actively provide builds for Windows, Linux and Android, iOS may come later.

Chat | + Reddit | Status | Development | Downloads | @@ -54,7 +55,7 @@ We currently have builds over at the [Releases](https://git.suyu.dev/suyu/suyu/r This project is completely free and open source, and anyone can contribute to help improve suyu. -Most of the development happens on the Git. For development discussion, please join us in our [Chat](https://chat.suyu.dev) or contact a developer. +Most of the development happens on Git. For development discussion, please join us in our [Chat](https://chat.suyu.dev) or [Subreddit](reddit.com/r/suyu/), you can also contact a developer. If you want to contribute, please take a look at the [Contributor's Guide](https://git.suyu.dev/suyu/suyu/wiki/Contributing) and [Developer Information](https://git.suyu.dev/suyu/suyu/wiki/Developer-Information). You can also contact any of the developers on the Chat to learn more about the current state of suyu. @@ -65,25 +66,27 @@ You can also contact any of the developers on the Chat to learn more about the c * __Linux__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __macOS__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __Android__: [Releases](https://git.suyu.dev/suyu/suyu/releases) -###### We currently do not provide builds for iOS, however if you would like, you could try the experimental [Sudachi](https://github.com/emuPlace/Sudachi/releases)/[Folium](https://github.com/jarrodnorwell/Folium/releases). +###### We currently do not provide builds for iOS, however if you would like, you could try the experimental Sudachi Emulator and it's bigger project: [Folium](https://apps.apple.com/us/app/folium/id6498623389). If you want daily builds then [Click here](https://git.suyu.dev/suyu/suyu/actions). If you don't know how to download the daily builds then [Click here](https://git.suyu.dev/suyu/suyu/raw/branch/dev/img/daily-builds.png) -We have official builds [here.](https://git.suyu.dev/suyu/suyu/releases)
If any website or person is claiming to have a build for suyu, take that with a grain of salt. +We have official builds [here.](https://git.suyu.dev/suyu/suyu/releases)
If any website or person is claiming to have a build for suyu, take that with a grain of salt and let us know. + +For Multiplayer, we recommend using the "Yuzu Online" patch, install instructions can be found on Reddit and their Discord. ## Building * __Windows__: [Windows Build](https://git.suyu.dev/suyu/suyu/wiki/Building-For-Windows) * __Linux__: [Linux Build](https://git.suyu.dev/suyu/suyu/wiki/Building-For-Linux) * __Android__: [Android Build](https://git.suyu.dev/suyu/suyu/wiki/Building-For-Android) -* __macOS__: [macOS Build](https://git.suyu.dev/suyu/suyu/wiki/Building-for-macOS) +* __MacOS__: [MacOS Build](https://git.suyu.dev/suyu/suyu/wiki/Building-for-macOS) ## Support -If you have any questions, don't hesitate to ask us in our [chat](https://chat.suyu.dev), make an issue or contact a developer. We don't bite! +If you have any questions, don't hesitate to ask us in our [Chat](https://chat.suyu.dev) or Subreddit, make an issue or contact a developer. We don't bite! ## License From 9490b5264e82cc22251bd4afd7fe5fb1611faf35 Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Sun, 15 Sep 2024 17:18:09 +0200 Subject: [PATCH 149/165] Corrected Mistake --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c18d313552..293d49b22d 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ SPDX-License-Identifier: GPL-3.0-or-later **Note**: We do not support or condone piracy in any form. In order to use suyu, you'll need keys from your real Switch system, and games which you have legally obtained and paid for. We do not intend to make money or profit from this project. We're in need of developers. Please join our chat below or DM a dev if you want to contribute! -This repo is currently based on Yuzu EA 4176 but the code will be rewritten from the ground up for legal and performance reasons. +This repo is currently based on Yuzu EA 4176 but the code will be rewritten for legal and performance reasons.


From e886f27816eff3c8b869169740eb3b47298ade16 Mon Sep 17 00:00:00 2001 From: Herman Semenov Date: Fri, 12 Apr 2024 15:42:47 +0300 Subject: [PATCH 150/165] Using reserve() for optimization inserts, marked unused pair items and minor code refactor --- src/audio_core/device/audio_buffers.h | 4 +++- src/core/core.cpp | 1 + src/core/debugger/gdbstub.cpp | 1 + src/core/file_sys/registered_cache.cpp | 2 +- src/core/file_sys/submission_package.cpp | 2 ++ src/core/file_sys/system_archive/ng_word.cpp | 4 ++-- src/core/file_sys/system_archive/time_zone_binary.cpp | 3 +++ src/core/file_sys/vfs/vfs_cached.cpp | 6 ++++-- src/core/hle/service/am/window_system.cpp | 6 +++--- src/core/hle/service/ldn/lan_discovery.cpp | 2 +- src/core/hle/service/ns/application_manager_interface.cpp | 2 +- src/core/hle/service/sm/sm.cpp | 2 +- src/input_common/drivers/sdl_driver.cpp | 4 ++-- src/suyu/configuration/configure_applets.cpp | 2 +- src/suyu/configuration/configure_audio.cpp | 2 +- src/suyu/configuration/configure_cpu.cpp | 2 +- src/suyu/configuration/configure_general.cpp | 4 ++-- src/suyu/configuration/configure_graphics.cpp | 2 +- src/suyu/configuration/configure_graphics_advanced.cpp | 2 +- src/suyu/configuration/configure_linux_tab.cpp | 2 +- src/suyu/configuration/configure_system.cpp | 4 ++-- src/suyu/configuration/configure_ui.cpp | 2 +- src/suyu/configuration/input_profiles.cpp | 2 +- src/suyu/configuration/shared_widget.cpp | 4 ++-- src/suyu/play_time_manager.cpp | 2 +- src/tests/video_core/memory_tracker.cpp | 2 +- src/video_core/host1x/host1x.h | 4 ++-- 27 files changed, 43 insertions(+), 32 deletions(-) diff --git a/src/audio_core/device/audio_buffers.h b/src/audio_core/device/audio_buffers.h index 9e84a9c059..6e5e27ae3d 100644 --- a/src/audio_core/device/audio_buffers.h +++ b/src/audio_core/device/audio_buffers.h @@ -54,7 +54,8 @@ public: const s32 to_register{std::min(std::min(appended_count, BufferAppendLimit), BufferAppendLimit - registered_count)}; - for (s32 i = 0; i < to_register; i++) { + out_buffers.reserve(to_register); + for (s32 i = 0; i < to_register; ++i) { s32 index{appended_index - appended_count}; if (index < 0) { index += N; @@ -180,6 +181,7 @@ public: return 0; } + buffers_flushed.reserve(registered_count + appended_count); while (registered_count > 0) { auto index{registered_index - registered_count}; if (index < 0) { diff --git a/src/core/core.cpp b/src/core/core.cpp index 0cb81d6d8f..83517d46cc 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -80,6 +80,7 @@ FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs, if (filename == "00") { const auto dir = vfs->OpenDirectory(dir_name, FileSys::OpenMode::Read); std::vector concat; + concat.reserve(0x10); for (u32 i = 0; i < 0x10; ++i) { const auto file_name = fmt::format("{:02X}", i); diff --git a/src/core/debugger/gdbstub.cpp b/src/core/debugger/gdbstub.cpp index 80091cc7e0..27d45fca5f 100644 --- a/src/core/debugger/gdbstub.cpp +++ b/src/core/debugger/gdbstub.cpp @@ -481,6 +481,7 @@ void GDBStub::HandleQuery(std::string_view command) { // beginning of list const auto& threads = GetProcess()->GetThreadList(); std::vector thread_ids; + thread_ids.reserve(threads.size()); for (const auto& thread : threads) { thread_ids.push_back(fmt::format("{:x}", thread.GetThreadId())); } diff --git a/src/core/file_sys/registered_cache.cpp b/src/core/file_sys/registered_cache.cpp index c208be83f2..fae8e74e44 100644 --- a/src/core/file_sys/registered_cache.cpp +++ b/src/core/file_sys/registered_cache.cpp @@ -261,7 +261,7 @@ std::vector PlaceholderCache::List() const { std::vector out; for (const auto& sdir : dir->GetSubdirectories()) { for (const auto& file : sdir->GetFiles()) { - const auto name = file->GetName(); + const auto& name = file->GetName(); if (name.length() == 36 && name.ends_with(".nca")) { out.push_back(Common::HexStringToArray<0x10>(name.substr(0, 32))); } diff --git a/src/core/file_sys/submission_package.cpp b/src/core/file_sys/submission_package.cpp index 68e8ec22fc..4ab7e03590 100644 --- a/src/core/file_sys/submission_package.cpp +++ b/src/core/file_sys/submission_package.cpp @@ -117,7 +117,9 @@ std::vector> NSP::GetNCAsCollapsed() const { if (extracted) LOG_WARNING(Service_FS, "called on an NSP that is of type extracted."); std::vector> out; + out.reserve(ncas.size()); for (const auto& map : ncas) { + out.reserve(map.second.size()); for (const auto& inner_map : map.second) out.push_back(inner_map.second); } diff --git a/src/core/file_sys/system_archive/ng_word.cpp b/src/core/file_sys/system_archive/ng_word.cpp index 1fa67877dd..13ae1999ee 100644 --- a/src/core/file_sys/system_archive/ng_word.cpp +++ b/src/core/file_sys/system_archive/ng_word.cpp @@ -24,7 +24,7 @@ constexpr std::array WORD_TXT{ VirtualDir NgWord1() { std::vector files; - files.reserve(NgWord1Data::NUMBER_WORD_TXT_FILES); + files.reserve(files.size() + 2); for (std::size_t i = 0; i < files.size(); ++i) { files.push_back(MakeArrayFile(NgWord1Data::WORD_TXT, fmt::format("{}.txt", i))); @@ -54,7 +54,7 @@ constexpr std::array AC_NX_DATA{ VirtualDir NgWord2() { std::vector files; - files.reserve(NgWord2Data::NUMBER_AC_NX_FILES * 3); + files.reserve(NgWord2Data::NUMBER_AC_NX_FILES + 4); for (std::size_t i = 0; i < NgWord2Data::NUMBER_AC_NX_FILES; ++i) { files.push_back(MakeArrayFile(NgWord2Data::AC_NX_DATA, fmt::format("ac_{}_b1_nx", i))); diff --git a/src/core/file_sys/system_archive/time_zone_binary.cpp b/src/core/file_sys/system_archive/time_zone_binary.cpp index 316ff0dc6f..3fa703a6fa 100644 --- a/src/core/file_sys/system_archive/time_zone_binary.cpp +++ b/src/core/file_sys/system_archive/time_zone_binary.cpp @@ -37,6 +37,7 @@ const static std::map& directory, const std::map>& files) { + directory.reserve(files.size()); for (const auto& [filename, data] : files) { const auto data_copy{data}; const std::string filename_copy{filename}; @@ -54,6 +55,7 @@ static std::vector GenerateZoneinfoFiles() { VirtualDir TimeZoneBinary() { std::vector america_sub_dirs; + america_sub_dirs.reserve(tzdb_america_dirs.size()); for (const auto& [dir_name, files] : tzdb_america_dirs) { std::vector vfs_files; GenerateFiles(vfs_files, files); @@ -62,6 +64,7 @@ VirtualDir TimeZoneBinary() { } std::vector zoneinfo_sub_dirs; + zoneinfo_sub_dirs.reserve(tzdb_zoneinfo_dirs.size()); for (const auto& [dir_name, files] : tzdb_zoneinfo_dirs) { std::vector vfs_files; GenerateFiles(vfs_files, files); diff --git a/src/core/file_sys/vfs/vfs_cached.cpp b/src/core/file_sys/vfs/vfs_cached.cpp index 01cd0f1e08..9f570520bb 100644 --- a/src/core/file_sys/vfs/vfs_cached.cpp +++ b/src/core/file_sys/vfs/vfs_cached.cpp @@ -38,7 +38,8 @@ VirtualDir CachedVfsDirectory::GetSubdirectory(std::string_view dir_name) const std::vector CachedVfsDirectory::GetFiles() const { std::vector out; - for (auto& [file_name, file] : files) { + out.reserve(files.size()); + for (const auto& [_, file] : files) { out.push_back(file); } return out; @@ -46,7 +47,8 @@ std::vector CachedVfsDirectory::GetFiles() const { std::vector CachedVfsDirectory::GetSubdirectories() const { std::vector out; - for (auto& [dir_name, dir] : dirs) { + out.reserve(dirs.size()); + for (auto& [_, dir] : dirs) { out.push_back(dir); } return out; diff --git a/src/core/hle/service/am/window_system.cpp b/src/core/hle/service/am/window_system.cpp index 5cf24007cc..ca289a84d1 100644 --- a/src/core/hle/service/am/window_system.cpp +++ b/src/core/hle/service/am/window_system.cpp @@ -121,7 +121,7 @@ void WindowSystem::RequestAppletVisibilityState(Applet& applet, bool visible) { void WindowSystem::OnOperationModeChanged() { std::scoped_lock lk{m_lock}; - for (const auto& [aruid, applet] : m_applets) { + for (const auto& [_, applet] : m_applets) { std::scoped_lock lk2{applet->lock}; applet->lifecycle_manager.OnOperationAndPerformanceModeChanged(); } @@ -130,7 +130,7 @@ void WindowSystem::OnOperationModeChanged() { void WindowSystem::OnExitRequested() { std::scoped_lock lk{m_lock}; - for (const auto& [aruid, applet] : m_applets) { + for (const auto& [_, applet] : m_applets) { std::scoped_lock lk2{applet->lock}; applet->lifecycle_manager.RequestExit(); } @@ -156,7 +156,7 @@ void WindowSystem::OnHomeButtonPressed(ButtonPressDuration type) { void WindowSystem::PruneTerminatedAppletsLocked() { for (auto it = m_applets.begin(); it != m_applets.end(); /* ... */) { - const auto& [aruid, applet] = *it; + const auto& [_, applet] = *it; std::scoped_lock lk{applet->lock}; diff --git a/src/core/hle/service/ldn/lan_discovery.cpp b/src/core/hle/service/ldn/lan_discovery.cpp index b9db19618a..e947a3c2a0 100644 --- a/src/core/hle/service/ldn/lan_discovery.cpp +++ b/src/core/hle/service/ldn/lan_discovery.cpp @@ -119,7 +119,7 @@ Result LANDiscovery::Scan(std::span out_networks, s16& out_count, std::this_thread::sleep_for(std::chrono::seconds(1)); std::scoped_lock lock{packet_mutex}; - for (const auto& [key, info] : scan_results) { + for (const auto& [_, info] : scan_results) { if (out_count >= static_cast(out_networks.size())) { break; } diff --git a/src/core/hle/service/ns/application_manager_interface.cpp b/src/core/hle/service/ns/application_manager_interface.cpp index 7a91727f97..df0bd8acce 100644 --- a/src/core/hle/service/ns/application_manager_interface.cpp +++ b/src/core/hle/service/ns/application_manager_interface.cpp @@ -348,7 +348,7 @@ Result IApplicationManagerInterface::ListApplicationRecord( size_t i = 0; u8 ii = 24; - for (const auto& [slot, game] : installed_games) { + for (const auto& [_, game] : installed_games) { if (i >= limit) { break; } diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp index 1095dcf6c3..2cf12aba52 100644 --- a/src/core/hle/service/sm/sm.cpp +++ b/src/core/hle/service/sm/sm.cpp @@ -28,7 +28,7 @@ ServiceManager::ServiceManager(Kernel::KernelCore& kernel_) : kernel{kernel_} { } ServiceManager::~ServiceManager() { - for (auto& [name, port] : service_ports) { + for (auto& [_, port] : service_ports) { port->Close(); } diff --git a/src/input_common/drivers/sdl_driver.cpp b/src/input_common/drivers/sdl_driver.cpp index eea607b66d..20aecf4c76 100644 --- a/src/input_common/drivers/sdl_driver.cpp +++ b/src/input_common/drivers/sdl_driver.cpp @@ -571,7 +571,7 @@ SDLDriver::~SDLDriver() { std::vector SDLDriver::GetInputDevices() const { std::vector devices; std::unordered_map> joycon_pairs; - for (const auto& [key, value] : joystick_map) { + for (const auto& [_, value] : joystick_map) { for (const auto& joystick : value) { if (!joystick->GetSDLJoystick()) { continue; @@ -591,7 +591,7 @@ std::vector SDLDriver::GetInputDevices() const { } // Add dual controllers - for (const auto& [key, value] : joystick_map) { + for (const auto& [_, value] : joystick_map) { for (const auto& joystick : value) { if (joystick->IsJoyconRight()) { if (!joycon_pairs.contains(joystick->GetPort())) { diff --git a/src/suyu/configuration/configure_applets.cpp b/src/suyu/configuration/configure_applets.cpp index a607fa3af8..d5e3520718 100644 --- a/src/suyu/configuration/configure_applets.cpp +++ b/src/suyu/configuration/configure_applets.cpp @@ -69,7 +69,7 @@ void ConfigureApplets::Setup(const ConfigurationShared::Builder& builder) { applets_hold.emplace(setting->Id(), widget); } - for (const auto& [label, widget] : applets_hold) { + for (const auto& [_, widget] : applets_hold) { library_applets_layout.addWidget(widget); } } diff --git a/src/suyu/configuration/configure_audio.cpp b/src/suyu/configuration/configure_audio.cpp index 2341131585..5ecd79ae31 100644 --- a/src/suyu/configuration/configure_audio.cpp +++ b/src/suyu/configuration/configure_audio.cpp @@ -164,7 +164,7 @@ void ConfigureAudio::Setup(const ConfigurationShared::Builder& builder) { } } - for (const auto& [id, widget] : hold) { + for (const auto& [_, widget] : hold) { layout.addWidget(widget); } } diff --git a/src/suyu/configuration/configure_cpu.cpp b/src/suyu/configuration/configure_cpu.cpp index ce266642ff..0a26f531fb 100644 --- a/src/suyu/configuration/configure_cpu.cpp +++ b/src/suyu/configuration/configure_cpu.cpp @@ -79,7 +79,7 @@ void ConfigureCpu::Setup(const ConfigurationShared::Builder& builder) { } } - for (const auto& [label, widget] : unsafe_hold) { + for (const auto& [_, widget] : unsafe_hold) { unsafe_layout->addWidget(widget); } diff --git a/src/suyu/configuration/configure_general.cpp b/src/suyu/configuration/configure_general.cpp index 689d9be2b8..f8007574d4 100644 --- a/src/suyu/configuration/configure_general.cpp +++ b/src/suyu/configuration/configure_general.cpp @@ -81,10 +81,10 @@ void ConfigureGeneral::Setup(const ConfigurationShared::Builder& builder) { } } - for (const auto& [id, widget] : general_hold) { + for (const auto& [_, widget] : general_hold) { general_layout.addWidget(widget); } - for (const auto& [id, widget] : linux_hold) { + for (const auto& [_, widget] : linux_hold) { linux_layout.addWidget(widget); } } diff --git a/src/suyu/configuration/configure_graphics.cpp b/src/suyu/configuration/configure_graphics.cpp index d11110a74a..54cdd8d25f 100644 --- a/src/suyu/configuration/configure_graphics.cpp +++ b/src/suyu/configuration/configure_graphics.cpp @@ -358,7 +358,7 @@ void ConfigureGraphics::Setup(const ConfigurationShared::Builder& builder) { } } - for (const auto& [id, widget] : hold_graphics) { + for (const auto& [_, widget] : hold_graphics) { graphics_layout.addWidget(widget); } diff --git a/src/suyu/configuration/configure_graphics_advanced.cpp b/src/suyu/configuration/configure_graphics_advanced.cpp index 8cdae0a65d..28b3f7c3c8 100644 --- a/src/suyu/configuration/configure_graphics_advanced.cpp +++ b/src/suyu/configuration/configure_graphics_advanced.cpp @@ -53,7 +53,7 @@ void ConfigureGraphicsAdvanced::Setup(const ConfigurationShared::Builder& builde checkbox_enable_compute_pipelines = widget; } } - for (const auto& [id, widget] : hold) { + for (const auto& [_, widget] : hold) { layout.addWidget(widget); } } diff --git a/src/suyu/configuration/configure_linux_tab.cpp b/src/suyu/configuration/configure_linux_tab.cpp index 1db9893b71..488db7b932 100644 --- a/src/suyu/configuration/configure_linux_tab.cpp +++ b/src/suyu/configuration/configure_linux_tab.cpp @@ -50,7 +50,7 @@ void ConfigureLinuxTab::Setup(const ConfigurationShared::Builder& builder) { linux_hold.insert({setting->Id(), widget}); } - for (const auto& [id, widget] : linux_hold) { + for (const auto& [_, widget] : linux_hold) { linux_layout.addWidget(widget); } } diff --git a/src/suyu/configuration/configure_system.cpp b/src/suyu/configuration/configure_system.cpp index 3204303e98..e0312eb6fc 100644 --- a/src/suyu/configuration/configure_system.cpp +++ b/src/suyu/configuration/configure_system.cpp @@ -174,10 +174,10 @@ void ConfigureSystem::Setup(const ConfigurationShared::Builder& builder) { widget->deleteLater(); } } - for (const auto& [label, widget] : core_hold) { + for (const auto& [_, widget] : core_hold) { core_layout.addWidget(widget); } - for (const auto& [id, widget] : system_hold) { + for (const auto& [_, widget] : system_hold) { system_layout.addWidget(widget); } } diff --git a/src/suyu/configuration/configure_ui.cpp b/src/suyu/configuration/configure_ui.cpp index 589c035589..74add9bbd3 100644 --- a/src/suyu/configuration/configure_ui.cpp +++ b/src/suyu/configuration/configure_ui.cpp @@ -83,7 +83,7 @@ static void PopulateResolutionComboBox(QComboBox* screenshot_height, QWidget* pa const auto& enumeration = Settings::EnumMetadata::Canonicalizations(); std::set resolutions{}; - for (const auto& [name, value] : enumeration) { + for (const auto& [_, value] : enumeration) { const float up_factor = GetUpFactor(value); u32 height_undocked = Layout::ScreenUndocked::Height * up_factor; u32 height_docked = Layout::ScreenDocked::Height * up_factor; diff --git a/src/suyu/configuration/input_profiles.cpp b/src/suyu/configuration/input_profiles.cpp index a2ca806899..5add5f057b 100644 --- a/src/suyu/configuration/input_profiles.cpp +++ b/src/suyu/configuration/input_profiles.cpp @@ -61,7 +61,7 @@ std::vector InputProfiles::GetInputProfileNames() { auto it = map_profiles.cbegin(); while (it != map_profiles.cend()) { - const auto& [profile_name, config] = *it; + const auto& [profile_name, _] = *it; if (!ProfileExistsInFilesystem(profile_name)) { it = map_profiles.erase(it); continue; diff --git a/src/suyu/configuration/shared_widget.cpp b/src/suyu/configuration/shared_widget.cpp index 76a6b417cd..8a552d68c9 100644 --- a/src/suyu/configuration/shared_widget.cpp +++ b/src/suyu/configuration/shared_widget.cpp @@ -135,7 +135,7 @@ QWidget* Widget::CreateCombobox(std::function& serializer, const ComboboxTranslations* enumeration{nullptr}; if (combobox_enumerations.contains(type)) { enumeration = &combobox_enumerations.at(type); - for (const auto& [id, name] : *enumeration) { + for (const auto& [_, name] : *enumeration) { combobox->addItem(name); } } else { @@ -223,7 +223,7 @@ QWidget* Widget::CreateRadioGroup(std::function& serializer, }; if (!Settings::IsConfiguringGlobal()) { - for (const auto& [id, button] : radio_buttons) { + for (const auto& [_, button] : radio_buttons) { QObject::connect(button, &QAbstractButton::clicked, [touch]() { touch(); }); } } diff --git a/src/suyu/play_time_manager.cpp b/src/suyu/play_time_manager.cpp index 9a046c69a1..ede966da6e 100644 --- a/src/suyu/play_time_manager.cpp +++ b/src/suyu/play_time_manager.cpp @@ -87,7 +87,7 @@ std::optional GetCurrentUserPlayTimePath( std::vector elements; elements.reserve(play_time_db.size()); - for (auto& [program_id, play_time] : play_time_db) { + for (const auto& [program_id, play_time] : play_time_db) { if (program_id != 0) { elements.push_back(PlayTimeElement{program_id, play_time}); } diff --git a/src/tests/video_core/memory_tracker.cpp b/src/tests/video_core/memory_tracker.cpp index 45b1a91dc5..bfdcc8a16c 100644 --- a/src/tests/video_core/memory_tracker.cpp +++ b/src/tests/video_core/memory_tracker.cpp @@ -45,7 +45,7 @@ public: [[nodiscard]] unsigned Count() const noexcept { unsigned count = 0; - for (const auto& [index, value] : page_table) { + for (const auto& [_, value] : page_table) { count += value; } return count; diff --git a/src/video_core/host1x/host1x.h b/src/video_core/host1x/host1x.h index 8debac93dd..6de360d363 100644 --- a/src/video_core/host1x/host1x.h +++ b/src/video_core/host1x/host1x.h @@ -45,7 +45,7 @@ public: // Vic does not know which nvdec is producing frames for it, so search all the fds here for // the given offset. for (auto& map : m_presentation_order) { - for (auto& [offset, frame] : map.second) { + for (auto& [offset, _] : map.second) { if (offset == search_offset) { return map.first; } @@ -53,7 +53,7 @@ public: } for (auto& map : m_decode_order) { - for (auto& [offset, frame] : map.second) { + for (auto& [offset, _] : map.second) { if (offset == search_offset) { return map.first; } From ae65020815ae3e88f79fd4fd2b2493f8427c420f Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Sun, 15 Sep 2024 17:40:10 +0200 Subject: [PATCH 151/165] Re-added credit to OG devs --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 293d49b22d..fb7aa3ed16 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,8 @@ SPDX-License-Identifier: GPL-3.0-or-later We're in need of developers. Please join our chat below or DM a dev if you want to contribute! This repo is currently based on Yuzu EA 4176 but the code will be rewritten for legal and performance reasons. +Support the original suyu developer team [here](https://discord.gg/79B6wqFPnc). +
From 6be886d0ff5cc8bd2617c8cfc68b8934f0fc1317 Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Sun, 15 Sep 2024 17:50:09 +0200 Subject: [PATCH 152/165] audio_core: increment current revision, Courtesy of Sudachi Dev Originally from https://git.suyu.dev/chaphidoesstuff/suyu/src/commit/39effa10110aa6b29708c5849cbd611c855e798c/src/audio_core/common/feature_support.h# and my mirror --- src/audio_core/common/feature_support.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/audio_core/common/feature_support.h b/src/audio_core/common/feature_support.h index e71905ae84..e2e00769c2 100644 --- a/src/audio_core/common/feature_support.h +++ b/src/audio_core/common/feature_support.h @@ -13,7 +13,7 @@ #include "common/polyfill_ranges.h" namespace AudioCore { -constexpr u32 CurrentRevision = 11; +constexpr u32 CurrentRevision = 12; enum class SupportTags { CommandProcessingTimeEstimatorVersion4, From 66993e26039ec5afb05c4fdc4eee92bc20605389 Mon Sep 17 00:00:00 2001 From: Exverge Date: Sat, 30 Mar 2024 19:34:32 -0400 Subject: [PATCH 153/165] Comment out unimplemented check In my testing on macOS, MK8 sometimes crashed at this function, giving a void type instead of u32. I've temporarily commented this out until (if) this is implemented and added a check for if it is implemented --- .../backend/spirv/emit_spirv_image.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp index 945cdb42bc..75767448c3 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp @@ -196,8 +196,11 @@ Id Texture(EmitContext& ctx, IR::TextureInstInfo info, [[maybe_unused]] const IR } Id TextureImage(EmitContext& ctx, IR::TextureInstInfo info, const IR::Value& index) { - if (!index.IsImmediate() || index.U32() != 0) { - throw NotImplementedException("Indirect image indexing"); + // if (!index.IsImmediate() || index.Type() != Shader::IR::Type::U32 || index.U32() != 0) { + // throw NotImplementedException("Indirect image indexing"); + // } + if (index.Type() != Shader::IR::Type::U32) { + LOG_WARNING(Shader_SPIRV, "Non-U32 type provided as index: {}", index.Type()); } if (info.type == TextureType::Buffer) { const TextureBufferDefinition& def{ctx.texture_buffers.at(info.descriptor_index)}; @@ -215,8 +218,11 @@ Id TextureImage(EmitContext& ctx, IR::TextureInstInfo info, const IR::Value& ind } std::pair Image(EmitContext& ctx, const IR::Value& index, IR::TextureInstInfo info) { - if (!index.IsImmediate() || index.U32() != 0) { - throw NotImplementedException("Indirect image indexing"); + // if (!index.IsImmediate() || index.Type() != Shader::IR::Type::U32 || index.U32() != 0) { + // throw NotImplementedException("Indirect image indexing"); + // } + if (index.Type() != Shader::IR::Type::U32) { + LOG_WARNING(Shader_SPIRV, "Non-U32 type provided as index: {}", index.Type()); } if (info.type == TextureType::Buffer) { const ImageBufferDefinition def{ctx.image_buffers.at(info.descriptor_index)}; From 42ade6f62a17a87f53bdbd3d2d97ed543db82fb8 Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Tue, 17 Sep 2024 10:22:27 +0200 Subject: [PATCH 154/165] need to fix bugs people! --- img/need to fix bugs.png | Bin 0 -> 255278 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/need to fix bugs.png diff --git a/img/need to fix bugs.png b/img/need to fix bugs.png new file mode 100644 index 0000000000000000000000000000000000000000..124c55c91acc26037e203c201f57715ad8eb38d7 GIT binary patch literal 255278 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%0DoXBvzDF*_RN||c{8_HdrB~eo96`i~PDwOI& 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%0A?d)% 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 z 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 z zI^f1y4Jm6fZn4@^9njMD>P{P~T0xsZK};!{QR@yimaW2!& zejmpA4BRlVOIsinS@jH;za)bMra;>&7?njUyZ5 zvD-&_A_$7Ai5O)_b?L3glVpwxfRh6YNmMf?QIulL(~~{>+!^!xZUmCj9`i5xX3GKu z)0i0{jsx*3#;~XwsIG+0OTG|CV3Spaw5lOO!439A*^3*|Gv%V`NSFstPTkcE!R^W_ zDo#XNQ7;0Ew?=~~+xg#=tvrtGcZd7?5FVI$f{~V!V|A&GFyocAwzRYSQH zzeTi44s|@R^d>ax(}wu!zwRWli1feFe503cR5t0;)oUC3mFs4&%RA5tESZ#KcsD(mk-^8*`v(YJD_ z{cdK5^p=1#y?o&AXCIMKV%))Yv*Sd~@&kmWjC_4+Qj(ISY=uKe=ImEdVfomi{^V)h z^#tFFWUYO2I4Kn)rr&0}HF2h^YM3YA%(1y!FeF$xH@!Sae5N4Sr(_siYiC$+kRhY* znfm#C--HwOU;2q-hCn{4e=(Q6&c_XD0eWR)AsbJ0p8E&8ew9HS3N8u;_qwcFv;C&f zjuAh^fF4oueLa2lCF-MUzMp|J4~{UVYrntY?sNMr-5UH@_oPlR=E+$!WiH|6Tz;;{ zsDbC?oI~TaiMxzaYW|0{!mG$-3g`HedW?u1g<;>gSUvvT2##+ALd{nZR#Z!ZT!mg*(L)> z7T4oi@ndQzJ*E|9iUo^~avwl^=LDB*&TjO2EUxruFY>Ea#!4lndthp+HktcD(e~; zxOd{_`bb<#Dq_SSAI*30zL(b#NcG$xmqG0l2I(vC!?S&ZsG9{?%iyI$rMrVawjKK! z?oWh=9%dZLS+g5EvP(ZwJbn;)HeRXjrqHx)ZeziJ!z^kS91(#%g3@wc+=bY6xvSTwC~yYCaR&!+yP+CF5xnIP zy60LQ_7zhmH3%1b5ZnhCtVz!4phxu@hDbW~5yFIX z>!^cOUKJxnjyHmr5yHYG^I=tm+y%_XSeKMGIPtsyhnLts6}`DiNvEC*EEMf9Dj6bQ zzRhL27`&wf(%PIr81dG^X>jeqhiHG^sx*(*QQK-hbcn-I-~4!Q?BKrIm+$`cnoZ@i zJ?o6)A59_?;C^b1gU_VyJ1^^zJ}{^aDw}mpn!BuzMq74;}pYW zg2p-7W1(*K)26?=&TYDG4KAk0f1ycXn#)htNSCPB-_5ZHK8OmNWK~LH4II?sZ<^V6 zW9UXuzcC|ho7U~`Vk-?V^zkT252Fo2A4Y5ABP+<_`MgM;5h~J=Go2{p!mPrt|GR^Y zXNk+u%;g5zcX`X|N9Z)Ho4sn-jdwE0ulsC_F|@=brf z)}zuCe)ETH-6|P={`B|(uFP#~Ga{vJXcicJ%fHdDUErUe-N@%prpD2Im6k**-bq4A zF5<7tCw*!67hq%A$13gYrC$(XCiW)>1Uh|st29jXNl-R*l!4-sVYzWrs|(9ExMVLa zNRFLpb-(MP>-4I2B?hL8rPp_H^9*6-hh1o$Tb8c`%XpnP1gsRxOG`|y@`!w3As~5C z_?SzzfH5d2h_?(>R3XpK;I1>hw@QM9xX@4!$kcvHYdduX5id{zdi<;9Yw_)T#Q^+> zYiw*G?+YOTRlsG`ZM}|?GW&$c30ySb(n!rQ**@t@6?bR|0>3|&q2B?<$IPfGEm-ze z(L$e;ZNTMGUpf6}i_#)r!kL&bP)^7h(m1x%`n~v6OeE9GZT@?y+ScJ()Qjrwn*;TDHpPyITp2dt(R zBIwepnsX@7-(Oxc4e(k!!qgWEX2!<#jg5e`e1sjW4F}%=PQg_cBV;c#Sj(r&wum9c}%^RmPgyYx~88$>I<;DE{MB+i*OJ}o`{{@kBI!UyprIPF{kdT;#2jM! zU_E^ZM-YI$-F&BJTz%xhx+DQ}^YincKhtw#;xp3oor8$Zo*BY}9AWMUE~*klyghK4 z7p{XEvcF(&`jLGA+*+rG(5x`=1-{Q(z$978n`>*^$BLpE9;TbT=Ua^Ed_|Vo?F?)d9Pt4E?z!oQtHc54GynQtjUGIr!Auwe} zpX(8R1HdTEMshnm56NLnCljNYG0SB%IS?JQLp$8t+nTRqIo0Ff;fdOR1kW;@tL1xX zfze)2tp@Ru^q&EftGeqe^58tq5=Hbykz7IPCa|~0+ZsnoALPPQ9fJ2D?qIQ0Ka6|& z(T(q(r6~p@Zin2@(ASF7XChE$#)9y%_0|^mMH?HK%*u@F#7F3OF@aGB;wi%Fdz8_( z&I>Th0}q&ZK8h>9G&xxZu(^s##IMW#qT=E;SX9^69Dqf9@S`||0K?4WE))R>5 zhx9w$-OjK_#k`k)JFmJ~L;sk&A5Fdq_WA&a-fV3NjCdf6as?Cwq}!10F$B*X#LyY! z%1ndn{#H@bKz~2dzOtxDrE|JR7o;r0+=6~Ut&!Cs7q3AK+frrjHJ?S z1JUrlbi`H+uq5G%h|5OhLi{k*R_J><(5rw66eMx%e|gZY(Xth))pA40{%LVi{Q_I` zcQ4Bb6~iPD7u~%|f=D^A7?T>Z`k3RDS}71E6z4#6ODPen{R-e3;E92LDRK%yb`cRJ zNRS2*oATYluDx)(lC`0{jEq09IDoq9)2C0so#6Q0^v3VRrLq|K|&uvn8>E8u08?7;AOxCTQG#S z+aA86fYbM5l~Bsm(4dc?U~1|zSPYrxqlhS#iv^2=pX==gkOAqCF%CK+u^>Id$Y=>H zI8)Ok-}tRPAxEN2jTQyf0zEO(sm7CsZf}LX;RZ<&1X@y({kq-;z{rmXUM0TW9dP{` zc&Bjb_Ve}SdS&6>o;j7`M0}qmRjObUi7!MXaTHyMwLwZEts!`7Ed|_?Y1e>l3e?j*YcrNT~%rsxmDlRUr z^RAtar7!Un+fO_~S=~D51oVAK3F3}o929Yv81}%zMv;Mh~58@jOn)!8pn;-B6sCjO5wxu!q$>|&=Y zjr(luyZ7(605XB05q#NNlL3AW&`SBMs;YwOAZ$u!7hhgZ!0szl#qSj|ESzqb4u#8F zUCNk81JI!a$8E!YFS|WAo#D*{VI-(N5ZK2#IUcEauqkt(JTd@DC4bRe^|CL$gl>nV zLJ`D~y^h;Ke;axi)p*J&QVx4jkt?wR-6W07>2v2)-U9&q2S_pgS&FG~m|1_udu;)< zXh!ci$gvO5($X^Kcaazv$Y|R){_Q9k*}ruYeI2{DHn4rKJQllaA{qw4;UD-wp_B;@ zT;#uze=y}8x_tOsu98OHtxQ?$)D6Q56-w&^lCb>UEH8kg~Fhv@W`K$%-mHj$Rvj{o3fV&J}z? z{$Zz&?4_J5luh{uTYwcbcDS=WAD;~VBB`4mfwZ%CZ`JeXW*oZPI%&QF)tRwv(rG0F zKsP|dM=tcKY9f|?iU=yf%5l8P@b|eUZc#A)2J6t>`Hj|?JnOGgAc;fdG?`q-vhpA&|?Po88DR@;8|5nkOe|LcKd?K56aztM8? zF}^xzH7br_lO@6#LA65rt@gOnTj_KY-Uo=W0>`So8V%RA*1N))X8iStG(MS!9~ zL3V#_A4ij5F^f<7Y1-c#E#ITQRD}QA$Z64exQE)BBVf|ved*|E!fxdti93G-IrDrR z^YilNWnOUXJ#p`MshUlI$32Qi1U*)A){KL#4F7KYxv($y{vMsT8Y|rQp9KvZ{Pn(e zS?yC;>!*Up>8)kVB<=QG!R+UqYXz-D{oB}QS>3L*dy(z*A05m)FoNvMKbcMKLXC*B z!G8yW7f4@0N*T+=@WMHMx7KZ|s6f@gjbQy{(gNYeg`XJOrthD^$-p-2y0YJ4&OXDg zjFKcXy-nOnA#1dA#gz)>0~qgkY>a}t%1`Y2CY7VL9d=T0OPf;r zEKFZ5xcV`&OOByaZZ7rS!=4tR)53F+QoXK3L6@;-%%az(i_K0WeeRU}_a6Q;8^3?+ z3Pv%sETU)F6RaKc7@l^JpUAxjLDstU#@lNZZP*XWNv^zmbU(N#8N{80e9U^lPo=61 zMBoN)b!&|!lPZ$jkDt>syWN(9o|-Q$>twr?UvwJnEc5kfORc}bP%zq0z0m)rQ#%Ix z#gty9GZR}+{%u#@I!L~zi1k2)Y9T5VDFDmf{qt4lL93OE0F3Y}4&W?)o3q;i zzAA6ty?gfkKm`RF5PSuENNel?huq+Ahi&5|=d=EP60C#H8BLRTqm0fMrQ^@9fvQTZ zcw+XUXP1>P8M7|=)CMfi99+XBG&GzY90qzjEY@-l^NfJJ~}h= z?yfg-tNGr7WZ3-ZKcW`Qvd9aJ=?R6J7Wu)fR1CH9Cyh-^id&9nyVAGAeNkMzYkb^s z`#*A9&b9?>bG4@hn$iX{+I*I}E8fF5cf`%kdNQQT(}PH7Ga-&PIw7Id{)F*>9X&ob zXbdh__5Tp!E7UE%hGp_n67xORme2F^hdHN7Z3jy2m4c$8w23D5hazzJf+fR&J_vV7 zK5O0O*>P6!U8SOM@p|+2ZL!p?Yi$O$wzWv8@OyRF2am3YM@d?m1?PZ&O~{+^@!>ex zE)`|vdKstX^7ry=;rOKgZGIA#VTuxui;vG4ix8%N2sS>R{Cj)fADj8!N^f#)Ot~p+ zuBQ6(oiyv5|NeF3Y>hgO-jEUNTq*q&Gt9%mVV7ehs7#qsC|81Qd=DM{ZDbz-`Jj!% zhXmtx5t%qYb#-p4XyL548jq=O;bbTJ#4wCFNyWA8vF!G z2vf~V=$BOEA0aXK!djnHowDeM-cj9(L66i=F-eEcI&cO)H_{1F3Ioo~G8j3ON|qL- zk+HL7um8;vQ*wx`R?t<8N{)^`^d6$%D-`H6?Sgz|bdRUu zvwxaiPGRs+#`@9AM}v``zQXy-Sn{{ITsPA!5#m03)5u{x$O>S+?{(~0t>5c?1uCcq zAe!o2EeYR!!QNrjLhZnTU82zMc7a%ld~E4(qG{jftk|Yh3l2TY&j)ny)3-D?_sfij zUX-{)HmQ5S$Mh6(F(|+iMHT9EDq16U8)X{Kk6 z9wn1_0IgI8qT0TBK%hBwAxh?2K>-3f&?POw*L4Ox08AKK(R05@EDoWJAqmE%@UROA z3Vth^T!Kd>7q8%IHh7(QY8@jyy;eJ!wVp$tLE-or4ldf~rGA-C;bRm%Fa*C_O~h1s z3N||IEYFIIiz5y~yc>wFpi%a&@v8Hv6J4l!{yY}pC`3JjgBkZ;iDwKLOS?++hUQ`g zY_M$4YnO$ZJIqfDLsm24wTpQbG4o$i_fM$eDJy=KtE8;l5!+o@Tj=uPO4fHbum2tF z_BYy}miGqy3QviXFL-6W9oLqmKw>56~%ZM!s&}3%}9T zh~@WcE84leBtgF@X^Ybx7vsgaeRZd>T1E&@+s7b*e zw-KoeDDvk1=IP8wIcNgE+byu}F(9&Mdl|GyA_sJtsA~=-ld(-zdLFu#5SA_Pf8eA6=Zwagei!dXIe> zK?MKdgD$@@@WJk(T>a~%tLp$JAYqKaoT8C_C$OCdgE6y&0vI+JZ@Qm8?WERg1r{)6 z9?hU-wV(J{M@~rz!_q|?n_+|Dm4Lm!4YgyaTsqF!USfLBk;ffc=nNxejsi8&Sb*A#;9e#oZOq1^C2Kbt(S8vx=#LRJ3!KA zV(>uKsXz7Z@c-zVOfoHK=WrJ#E^<;7ZOmUkL+XDN)~Hr~!jmFXG`Kz{`kW~R?``9I z`#g^y*ZnBTyZ3m!a#$}R`!za0>uk?VpP>?JXXMQIH5|sYZ0d?e68UZ;fZ^)ZtL1940;j}$<$3yAxrtQu{@>6rLZNussAmF8KlBy1$?EAMzo^OH{pTMQm7t7+vN*TGmd4la) zzX#xZ0ux7SZmt6uE11mk@_1jcTq5mn-AW5%icdc#qT`0T*??Dc_k;u z>%lc&QI^L$e6$bVt0gR0Hiw;&L*G;Z&8e$|)JP!OVYtp6N>gOx0> zM5#yfpHc`h#=<3Ev=aScxLr2nDJdyk2l7lQx^(`Jl$24Q3hI==|#$mSBIVvMFLI^@ZK}9Ey>kJ4Z z%-&g~R1C>58mJ0Ct~+N(-k_XFf^8^XUHG2Pa23F5obyNNdUCN9;pGjjk0=XRn`X+3 zsj6-uwj=(em)BY3oi)46)^2G(PSO9dFhmK_F|w-nG&+bY4KdjznJh@$$#(C$CV$Lo zOw`-Qr+9mE9sO_Vp)!h0qoR>{qd;Aei~|+IV_|fv#|hEeX~7O$8hwnX2OTxJgwDSBn3^o{1b3co5wV5NEnpl%bhzEmYS>-yKIku+8g*w66sI6^pz_N< zbVHOGUca)P{eqqe47@R!PlE5+O;3{Zk(*ixS^ix9@CPmHdhGrVHAK-s>)!uiVxl#P zIV(@$w!*J$(56dO;uk=iK`4Cq;xB>@TkGchb=lSp3I$({)3?vk&cz|M3vO=S-U|TS zziod-!T=ON!8P zjG0SHeKihoPJN0Ak`^r7#ifdVYfE`Kc8sfPEH#wr4;aZHk8gzPE z(woniyGUXozd>`TG0ZjnC20b)r#I-oLR%anQhw(SureYB|Jj$>JCuHRd;>EQ(J<(J zZH4&L6{PbmyDN;L(1+`*KVPilWo6lhNNI6ieR^rpU zo!sW8ru{&}zj?2#XW81vv%Q020R6Cze{k?k%a9zIrPcI3;L5!NweW-E!>}!Jlcv=@ z=^b6}_i|zzl2tnK<=L692iLEBXpDZzxCXmosPB(N>a~yWU{oYH0DNoppVCcn@!3-i z3@nAAkH4+g{Kuyywi?tKFpuo6OD4DHoui>LLAMx$ESw4?X>jtI$=EytT-Vq4zMbni!Oiw$A>4?5Y@NwZ#r2PLa4=s1%$;dVGS`d zdTlu765@xTmu`Ztc|mG6{-iShENA{LFeFD7cSgM77bSWH`TOG?)VaXU3a}gmmoxo_y=!&yZim`j+~RG0)a90$rilzI_&p z*4MCkK;vtAkK*Y1p)1*skoe=#l}JA*=qto?2HDD_n4TZPyv9vZ>pMB_!PX!2!rw!oeHEP;$tET3g72 zilnvV{%8eRMBU-zRA43jvebin0RkvfF(U0+w{Pf8<2 zUngTu#=XW21Hf-3q9byui7C(k`HbKxC1^)2ljfIUlTugWHg)Ts`t-@@ z@h0$~63=h1db{(}5kuk8o2nDKBRS{JvR#cejR*y)a6?)oQtI^L}}L{v1&APz2n|2i`ZW4>nd9#>h3e zu;5)`2mM*hfePA^q;nCtr^W}uZP!~HOha<0`UQ|`gtrYpBlkht)3?9bnygicU??nr zPPq?-;tyo{#`iLbw;-;K>Ze#aiGzt{LEm@ABY%Ndm=~&ZPH}hz=^W9Io6tQ~_n`84 z?EtAQ8#jwsr!+`tSRon77{BxEr%K@^e$YO1>E!9t+Y3Xx=+@p)I{0wVP9|{VZYjrRXocQwRRxeGmin$uZ5qs;3W2h!stpLS%({{VLl+V!Y`E`#sXEw6iBeHf zX-l-X-JhK?xpmxjlTZ5dG+ybUY~npVry`Y8`N75By;AD}gwGhyay&9KFQ=ryYi5Uy z^=etnPDeBE0NfY#VdKimHjod#;g1V|*9#4R4tnX3+NXYtupi^&bIhtE+>oR}AX!k| zGqM-@n@2p!4q9vv^Orbgg>q3Z|J|5LXPpG83}YXGuxX4aAmUi*q7Z@$dk-pfwLQ@- zj-su3sSSG-g0e5^pet;MMc;sQLAz}Uj`?e)m2`yUn;Xa$CB_U( z9n(S2JVaAGMjVMD>dsJK0|@R&==Dyxxig2{RSE>3O-i#e2^E!d(8Q8PR6gfE6BdZ& z&O+Md5lFOwW9v}=7 zgAAr#XA2kvs>sp$>p`}rd;%Kp?lTq~oSYJ8Bw{&4uT<*BCVEon^Y3kKYz)IBudPiM z{t74w?-*rcYN*&#!hTm8ajrZPx=K66u_?XMuP`p=+UT8 z(BpW-(%%x{;g9&%&5b{h?p2`O+_C%K7WOm&eXO$*+=m}XjhF5-C>#ahM3ikxpASb>)t1K9;X@`mR@nbx?k)hj!T2m_ zUgD07A+J6qUrqClN;nR|bxh`<2(!ZKj=|--@L+ZfhlHJvd(lxMI#)(c?g3;_!<)&0 zK-5U=mqU1DUAG! z18eIFi26Rhz9rthWpN@`7QN)}_*Hlvm29jaN_%QVu+W@oF2+;CU~4`!GSnL4@ScU` z1MjE>mTh4T-OUUth(>z*4e6X7p1hoxxB*f^nO}dUcXB}X%Nz0U=X{uQ9#7NcMddTFRHAh#4UkG^ zIMqgaYMe{TuWl;r_B?N6!&a1NGyoq2Y?^cTWeagoRbW}SXDMtR(oN6;n(R8Y6*65y z56)Q%WwTVACFr=cbmYp$U;6OWo}X4~u>j+xdj))F`On>cqq3l@&HWgnTq$s*JRzN+Y3A#BVrMU5j`u(#~_kLe;@O`Z0Ke@d+81 z7Zj!OiIw)BUukhToPLzY%KmtNuZSi#7cXDF zz^ov#E{k3=I>itE;zaBk+ZSdOVae z>|+qqi*P8L5lRUG*4RTP9x<=j+de_ z*$Lx)3TMqz&bYNu6}yid?lXwEcKLsw{?2b8WF;}s;oNrlS4yVRR!}HOwp(eypF?u- z7$G^cYHeB(YofjzV&qo&42(B;SXYqLcDsa=v-H9|Kx=cBy?5Ozi6_k}*_e5b4}-0JfJZUXq$XN= zQoHlEKzF`$kMQomDpN-5Ba{*u<=0HCS8vwn85v2bsi`4IW?aMqSbQ0Ly;^clvP3o8 zllA)hrfb95pf}!Pr!H$J>o<(+T0WB0OVo#i0ISO^;Uw>1+{>Ts&(9c{V>?x*0*WIaRsYf{cDa<*Ir_;c|H>4EO9NHui-_$Sv-+Ub9L z2EM4vIkEMr@Y(q^a4gPt+h`k~ye%X=kg_wwwZ{#8x0$U8l7S-q(#`2VJjLV>e_QrrR7iV3tz6N1qZ?KDO|fU>VHkN>a};eg&jVgQzUA@y-D+yQ3VXFK!q5=l^Wwb{ zZB?F$V{+^q;*kn98rQ&=1M~3MsZ)S}FWQ!H(02o%i2Sp(zZchBHE5o}rg+^+!1y&B znvElu>R($?Cij;_wDI>$8B23eQ3b9qSPPJ3HQ;YIbarCWzmF<{BZ3XVBq`ksi#}2y z*4nbJc2uH2YKWC5=qNePytl~gPj6<)gh~+m)m2poeTzKTE z&4%2s@ec^dd|jNq*Um7n-;!E%e})v!;ohYlE?F}R3#RdW+zLIzfuzGuwv9J-y4X`M zNz%v6hgivr&XW#1XlZzKG0|MRd2=hpyIihUc#Lsi@D%Z-$VX3ZeFkYh1ylX;2TImNh`EjUNau4V;i|;TTzDCy|tb>QyJq#q|+W88ftH#BZvOUebObN`}3DC z@Su~W+UVbXfABD+QJMhUCuFHoQj6)OFXYfMOaQj8gr^foO&AwvjM{I&hLr*uS8l>QR9F)UZwN1vJ4fMJef(s$xuNwm}t9 zI-Qc9p8G`kx!h*?upw{Mg3j2ZhYxRk5I}TWt(g{)+!Y6o+>x2@?g<)7o77qNyXfh86YZ~cD&H1d!b?=u z&wXtOS#kA#kf`XQYwLaD#3kGD_M2PU46sU@{Z!&1Qfg;zoLyNi<1IF1)giU@ln^( z`mNyjxHvR7!)2eDOsVd4s`k8k#dVud8gclcN81-tdIy?V1u*sa5ZF%=YuyCZd za@xa&1O2ZcbZ*k2FrOwwy;`pA2guZ#h?&i((0(u zE4*--q-e9=k2XtHmFIs?Nq^~Sdx9c(b5iE{aqj$u(_G%?tWH56q2}H}Rc17W8{{7+ zq#xZTwI(VdF^4lRq#jJzY@dN$+Pyn>E*mlP$W4L>y_(_#o=oq}Za8O-jggI_W-P%p zZM=V$w3bT#j#*W=5E`R=OiUA3f$Z8UdY(QFAmH$$(=P9AI&y!`Wx5^GPjGf+qcV_H zOH(ad4d{~2V=FJ#IQRA1!sCK=z05Mt%&<>|A$BLuap+^Yw>QBEPWo(%OLL3hPa(}acQg{~~ zyD3W?;3(WvbD_Uismd)7n2d!}k1^*i_b^pl-NP3y{AJx`NXT|7D^J+5nd9IZP3A?l zEgyQzZSAzQ^w>x;MYO7#$&5r?y0KVl2CGDGp!khLm`aP8hxelUh)=$8<0F`%J0rD^ zfrrY|+VKg>>Th=enN87k(+=U0X=`(R*t>F9p=!o6#!9lBLez%Bk)Ds05gLI!5oTWX}{0+g6 z>%e9PWm1I>{>BHiO4H5uNc)?LqGBu=@szG|#}|DWb!WnCu09jGM$Nj1s}k*BOx?ve zLt9usfoX4L`fa@QLc4vwf1-+An2}mcZ^Y(YE-pZHiVEEer6P-=-SlhP83!q<&jtj% z#YXU+*gv=7pVn+v>}Xa^7==rsZ?SA%U1{vK45edYN?;Hb5doc!I{4YnD1N-)DHKgu zd+Qdd1xY$*_yfa~QPtO5b5sI(UDYO4A~%WlLJv&DO|LOmObnh^KKaHftr2A09mtQU8+hyU+5n zI|AAAEdXzj2EY-JB8IZWnjCdm=nN}BDzPPSpcxl4qN>5V?{_@EgFHMa5<$$pwPSu2 z0t3qYV-_DLXzJw6O$d?+<)VXv-iH<3eSPVlf*`0P)lrJQq_hixi|_l4PWhSj#|k~4 zRPmx+Hy*_Uol!s<{mEm%O5>Q2ql1C?(~;thqwnukRwip>zcqP;!I~w3N$__&tuS~? zgLh=;sEjBnV*%QT5Hz@_B0x&Ue_uxg_|DFrR65(AeRA2kMX{ojCA7(8D*KTT+Lyug!S$6JZ}~l zF)1oWIkh`>p;%(=`*$#y_#25WJ<{WM*V0tlMutw85KMXk&;%~nDcNgY)RTuK^C2id zjo9;leEIU;tWWm0pFbrJsMCAnd#SLL7ELrWHcrGeUc|I;B0A~PXHIpO=AGRf>|WBp zBZC9cX={co3t04NDXfBiTKCJ8k#Yx>@gMxi_PO(%)DaYQ4kVLM;@84_nHu{2&$|q; z$RgZbDlB>x_R{yn|3Lm$ajnay=3GyY1DKutaPb*cijti7sLji!?!jLYAv-XSL?^_v zzC`LzPnuwI`#&tTbDuId!5jD;9t|Gv%$*5N(b3U~eSnAk)sc2E{p6DQq%@43IqYq3(kM{{d`o zdqxT<1Xuj#Zms9yda2Zo1n(5@J=d4CT3U8v9SJnAI}0BPHPd*Vhh zV^U(GHnYy3j<(xt(PE)oZI#|IJt{HSS!Wv>jkz!C9jSFa0v)R zER8D@?s>Kr!n%uKOb);nGC-_5TT@fkJ2(xi;c;sAKMc*Vb-e!>J ze%3IBN9V9FuWAQ%y*G^TgB_nlUZ|PL<_dODMRaZiFlO1~ne8LcHYTcHuGqbT#RmBhl!n+R^rZVgJ{5!sy?&3o|R0iRE1@uE*QGmt%kY*|o1 z8*^JSnSVv`k=gB6sV-dsmo4U=XY(o#e44iYsHNpARhUa%$|cwwy1u?rH0+~1Tl+D+ zsCDCMzxD89kaX3*>1&UFu6LKxUi>Uwr~sy-0K;d;*Js{Px%dG4YwE?=WAn7XS+3X6 z+i*Q~6q!8U1lcQP5S-D`i*A7`gC++TQiX$%lG+a0|EfsJy7$fBK*@(vZev!EKEwG! zxGwTGfjFvN%maiAY%uz5Z6^4cA~?bRwT*$HVTbiZwWx{;SHP~`GLhi3ZBgXo{q=#s zHu1P#mvh(EOip?9Xg}K;F0k^cagK_-Eq!`5Wo7%KKO@C@w1j|@neP4k-!8eC+^rI! zopoSc>c(O<5?-wkv7urU$KHURgAFIH8+NZ#FQ;I#uOddMb& z+(217L-tZYUwgYd+Hj-=Sal3R9s$-1Xm$6*C^k>haxza}!7Ac#iU-pN{>yvq@A_lo zAxMfJDcq?Gz#4`IQFWE`W}7X zefB*owoI-5xB;BqErvVR-?s~1b&CZ5`a1RH(66!;51#sk$-19(wO>|$WF0y?gG2H& z#O$Zr<}0Ou4|CuD|2Yx)H2W<1kL9-9;97*cN`Ht$j04~(CO62^I zRw}^MmJx|IE0lipQN+0$=zq?A9^D~2_}Za((VJuA^bQF(<>#nYu#e90OptbXL$DPO zd^!0dF6HVpC==+Mm~bK(7;YZg92^@1>)3a^PTG+joiRKuK;{xCp8Zry-FxPM?yXg? zTvOUioo6{2A{QR-$JqN#sxfYlOB0F9nqxubj^jJ{IkPRva@YEau?s=yQ5eUX1`me< zq6B?JhhZplur4v{DOU@}atG@p0GXi>T7cV-aW98P{}@6VpnkcOLXSm$>@~Y67n-5S zA7c)v8Hoitn(JR)uYd^wf8ArpB!o>T!oTcYHv_h@-l#9)Qcf-61R^V=j+4^?2?+xs zMh<3rj$O>-q76KyDG#q6|1YD#yOBrBv}a&KxuW*)WX=A{h9+106osm0m5BG95}U!f zeIHHtNyMk34#>@=6s4V8DD)f6L&}8iUfJ?KMG4wcs}vr2ed*wjSJ+|#4uK(p@PawP z2>H7?OA4V>8l+G(5;kvvG2m$`|D_o0t0BqQr8QX?GC}IKmSaxHe7t*iPfGQP=hw)? z`m?2#CJz7ROjRCy;OyeE`2CJmjd#K!QtDkgs1w?i9YFz?xAyxC&w@%B^$31rPL`G= zVH7;{Z_`fEG4u4FTO6JP{G^mBsN_93iLT0u)_+I3A7n=tQ2^j-3ra!1$u0sFRXhhi zdvQwba( zl!g7IPb07@bbg|AaJc*5w^vSQbPUhniLhohs&j^X;iwhtdJkeZS3p`~JGCOSGEuoJ=Q7%a{*07}~mJg>J7EH~&h z0kbd^UMR~xE)i3sy`7N~x7#g*HBee8`18Pv%F)rSj}!z7ep+07l@Jnc|Bf-y=$iaayP@q;FzHHnIrNP0|CoX*cf zgV5lGHI{#us=#tr+gc1IXMso2V&lvWtpda`E00%Y2@cLtSK1f8&lA zzMeV!xZ>!Oe*;C3XpHNv)S&b8`vM|Kg~|dagZ&DO&F{kxj>7&SHrTqQR0B%IJ36p- z!jyJoynn~iL3w#n`}h~IJE$1cI%hsDEggiJOvEcLjcjc?pjL)A$lrn$+sP5kAWhvm z^(#w+cHu+@Y8SI0j~ce%1k+RKj__BhX3oB`E^i(e{MST{YBR5`|yBrz2R=J&421OHa-4E7O(K15?q(#N?ZMVwtrfX zb@O<=akRh@-dBM(mVT#1ckfzwE_46MspFRX!>(a`=iEQky?xh}Q!xBKJ@zqBJ`!r)lA>h;8*nX~23-Z@yjU80rWf7poOQuCBY63g_xdv5Bo zHGi0ee*|(^&QLy*b)d5TPzYy}ovS^IfoCq|B+XYxI>cfMInbNvB_yUv3z2bOW_oL{iSi2eRNudO$* z&)`Kwwam9f)7CJ!bZkv$#&S`gn$Kz~t3u?@&2}DgBMpv03Hx3aq-E=MF;;gFn?RXSy4PcE z$y_Rya3?~>+=*uGK#v`@l>mrkH3swGNA7JjpsA9R+rQtTzL$754c)MwbfJR~xWTty zQi|lkVmp(6J!0d}AKQ9TIUX_n=cOb5s;kQrWfQG&drR*XQcOKqc;K_293+x&LSZ6s zFud;JnqKVDQG!p9mAU~Ps3EwN2ZQEQz^e~WhCH}I>9q4!$JJpSX3W29n9x~F8YYim z%PjqOGRlUZlv%SP_OG5dMGDJDT`t~L7z~I#9sKg_tR5EyB_-(<2XsJkg{{cK#uN`4 zPcENIpr}@_&9ji!i}!uzracx2*UljDnol)KzG7jq9h+uO!xVh4Ikm0k)Qh>$dU@1eFl z@BZyxWz3{}$l{68@#~V*1*%_zrhN;9#I|B@H*{9N=%o%ad?=@A%-j+>t*_lwdV-tt z&+FQC=ca(g2M?JX`*gOYA}pNK`iHOX)$&mKEaeg*$=BBT{hiv(`xjYfN~kQUy8P6h zsGPmy;PkEkfv`%XW<^W=;lMX@dPWw`DQtCica7VA)Cy|`?zfBEd|&|j3ZI!{LPvjV zW?B8-rd|lJP{X0Byn2qTCtH+2mvT;S8wqMJPGpK=ur@tVOPcN>^o9*L_@-K(4M!*W z*x6&!DN6-l+r`tJtVs*I%tW~bSP!&!4s#!Fw9FC>X{+rEn zm&r^zeC^J}$m{uHu4(0M@V`O2UGS|c8@^6i7lm~cz#q4TbsWZh8}J;|d0tG+V!Gc% zO>(;fx7E^jO@=jzEN#7hPd|zAcmeiF@$-$>ufKy*Xpzm)H<)>L+k==;n#+gP9$a<@ zt404KbNP#YCi7FS?ir(X_yx^m5dsECO$^(zpV2K=8x+x~HF_Bs#H3BSRR zjTu9<^nVe~<}BUzP4S|$%x14D9R{91KZzN<)G#&cg)c#t4fd$R2v)PJ!prx_Zf*JT zN|v(J#_7q@2M0Ein}kD`9_!Q|G;(8P(W3UXc|F>5;rGk7YlTMJJSVN+hy0C?{c>2g zNs7-a&|_d<{-f~Chs}*068gJ-ZglK#nIFhk9RA}`BeL*T<-B=Q)(w^$egCf4Z(Tfd zy7e-FH(ye?Nab9Q@BOLDzgOhcYfg*3-5-7U_uTynftJvryJ{D`}(^!H^iLt<-@jj1XDUnI_fxe8Hbx|i8&VD z6+AHW=Jc>th@QdV@=#(=Nm%mJWhP@zv+F;2Dj3MTy9=)?e*HW5{kGYg2wrK$2YwT# z4H2Q6&9&9j_k#j{%}?F?KpU^K%Qfg#(!pARsR5^h|Ng2)vc_CJmP>vr{@loKHNTyA z9A2Mix)Hk-7P1~LKNUZ8y1ks~c#K%^udT={w_iA>N-^>6UAbPG6A>mKsF#+Y=On*& ztmjA2VA|sc!R!BySGg)Z^XqFQ=)7zEU`1QJWOOF{ny)97;MU2FH`33#HNGmJl8zTI zQJ%iN`B$)hTK4|-SHFk7;7)uW8m;`;%XmSi3)G~NLuKtewwHUg2o*8%G7Dps+-a)y zwY3LASC0k;)*uqxaLE61a`GRzcO%pdp)zQG1N!>=We^L#s{|nC(b2dpuzT0Pe+RzD zqq+2^nv!w|u*5OBly_6uC1qfCA{f0WnWIj_qNJx9NJ8uCZlB6;A7@7%%D z=+1HJHst~Z#*6b{vT8y!#jLfJF?|NUckfE>g*g>B; zc8rqo1P0RC+lQm)X^iUh;eZQQ07^btB}S{IS!o7NO4C_b^od*MDR^N$FV4*@rgd>U z0_6gPqp4s#G#K_+K+LAHztP_`Tzr+!DC{8XEXsfJmEPRWS$3I6&E~Scx0+iljtqfY z7OdrYjhUWa_dd;2QaTh{BAI$RE{j(9dZGq4>QsM`&Q8h)MDupR=&9JnwgK87W_Z1v z;l;t3^rrS8uE2qnEzF#u`-X)C1h#Nz&V6}h{?+Bihs69$9g9fZY8ESXR2@UZ7ljA7 zkHtfSzot!`B)M<&&!CqBXApBab6)yu)22Oi35GpC1o_n;GhBZX@bnw|Gc#2b~c%&i>R$t zcs_i?DayA|U)OEas8}6jC#vFuoJr`jLz4 zYW}l^9jDAWiy!BjWxmpu2U3JULd88N`N#JM$EV2i|8_$(XUeMu8QZf690B>B zC9-Zs03`YN=$V0A@_Z2G4BpuZ&G4!0%<6{^6I|&}vES#N*dMPeA26-Y$e4=p&P3Cf z+-ifw13FIEuM(_QcN#B46J{wOUxVlDqKZ-qE`?vF>t){@Ou!9F53c9&pTS;&wG$YO zF4m-vYHMmFEsM;m#D^)2){Yoxe+I#*oRVmJ?3lI03vSDXU7tWbPE4b^4L$ApowdLc zXl^jhb=un4+A<5OD(J>+xF*p1?g@{aqN<{76{6SuNG`6L zgT;Iq1?P@rC3PPeKPHiFaYJ;moLd3GQV^;8DOua;dX4QFB$MFx8}HcgPjRHVxIsqwJtc$M3{HQd_CQhCL{gkSfG8p5YhCD?9-7ZB0FPC4xw2#l>?<`_)k2AHri1XQt#%znNh#{d+a1_E%*# zig+4O6?R?@3{Q+U-yKlOE>{tG**u23)L?0%xLsWRtiQtfJr65x+rwY52>V=j*<0nVoBHgQpe)FRyY-74fJx{P(eUr|4wj4b=~~IZi$nwQ#HU zd8J|^kUjok_e{|-_#eb1~mxlj4=C?cY=pmX%5P$12>sot! zm1)#`cGKj__TOJ_n<3%eyRj1|Jy9^c#BGGs40F~OkA!+99?9z#@)LAeu!|!@=gdUP zuAZ@mIZ_L`Z?{o!V7F84@l?b?v^EYi*h<>nvNp^C)*yJ_3c^r3tMXr=!o<&zKWaBQ z+qUga^~A-scXHxi0*u0%=KbvWi+qXAasmtE!e`Px#n$@=)}oQ8pT!>sL^1%O!&f>K zw50TOsgP`u%|`zzijJ_;RyhiPt{ge>o7+f=2<-B zZ>H`&VV4fT9=g(PyuYKuWTRaADe8)oND^!SL5A`7lja=9da}%?->_anUW|Lt?g|DD zOExl@l;Yy4AU}#0itIY3!xg4KrpBI9aK^a*x$LBJ&v|XgLF<&WRz*$`%a4I&^J$qJ zb{*4Bo%?D|#|Jju=WblFdm=1OC*OCcgiq`Ai>xretFyI5l7BAgK7Ac1m~`~Sy{(|R z$~4ZS*{pZZ?-}17F_W+O__LNPt~}_v_cv>yOOH0==gUG~#=Q00-uiIWk({hQ@zkT%B_Kn`363GwG@Os*I6)6~96{7EFS$7OQtyvei7?XbW z^qYm+Zri5ARDMiuiQIKxfA8a@bc@(f zQ}8r}mvU}l&FkBvG8|RG=qNm|Bq|lj_aKPn3gjIGHMP83n{sAvZGa4u*?*jv(8TB_ z`=GE;kgB{3rM2SS)5CtN9i{a#Hb%m))ZkkH(zNTzd{c)^;*d^HLj2_e1|pJ)h9HsN z8QV>-FSNH5ej1LBd={YD#~<$N?xxN(@&=fu{5JU2eK%&U?*G(fSiQc;SU3ypKka-& z^TK4z)xW6HqrTkq`D>7z>9wV5!2?rauY^Qd;FW|8aEM-~Y?G;NB5p`sO)V$lenFCy zq~UvGgM^?A6~!7297d8UK4g)2?wmnddx>Z+X97d)i9Owt+!oSS|ddplnhjamA1 zZR))Cd%uUxCO57Pkg_LADRq5RaZs-0OdePCO9ek`Lr+@BizCzf{wv~K)jtU`j_BnSz|p5`_1QMcO;F!ee+i~P6}7C?mN&rF?&PYTaBsk zhwVqUffpo!tGlNsVb9kBI1|8DSDpdazn!pvCG~=D^#7ylEyJ?vx~^d*B&55$J0+yM zJEWyc>6VaGQo2F9R8YEGr5hDQKsp2^6e;=UdEL+Z^YbT%XYIZAT62y$Vk5R%f=@+B z7L>d?G`hCv3VA5N?oX9^q;|-AYkcRKQLFX99Ve>fBhk%_wcgp`uV9F(cIMnbds+lnv9{sF(m;8iR3IZhQOWy1{X8yitSxMLOXh#=CQ6dj-v0iF7D zX(}jaf!r~~&;Xjvom!8&^s)>RU=!7KUtspb3^nY0lXN6UPS$IRit!xwp3+%po$A1L z#-}MDlgA>C=Q{wUz#dUT1y9fcQt%RHv zfE@<-YJ;OA%ov7rclQ-#bQCM9|*B?H82&B@9nT?+aq6N zR0hGGG(G+IwpV<1;L8it(@3VGXy&gCV2!}j0xH%WBCx3QKe9P&@qC3mgvoSUlY6{T zp-ti}i)86|9LTT0kuZ1-Ulthjlfuq@FCa+Kr=$!vZ`zR4>9HKaSBlg;@@y-~!@&Lw zfPOvsB>lUGGOt8=5?Rg5y|Aml?_drcXDQB0!GtMw6t}y#OPM=Am}nYU@t=Sr zu&R1KHXc*ouB>$6{SXJxK_f9KjQNN$j-?qH<&BLmDsC&y>5!=0(IE%V$5mN*dE}3& z2}PKw-ydQ@@nV!p`+=-NT<^bYLizv{itdaD6rjIn+;R5+2_qrZu=YF?5dMys7@xm- z<*KL0E>&i_1y9XO7(6qSzIjuSpKmS~k0n5k?WU95>fH|`G&=pXn(}gAu(bnG9wTGv zo_)&go#qsJ7_G>9A&g@ZN`2m-dyM9bd4r9iic<4KyrTAj;Nqg2B4w~*X>^hU~O z0tKs;^cdVE@Ue$o6InPp_d$1GC8qKlWL+gNrU~Z%hF!|b$;k;ok8rjNpFRsMutmt>tn%_&=E;Pq;;%n{np;{}Gqk<9 zX_GAiQ0ys)Mxh4=N)(`gvN~)C)iCg&j?T^?@;SO0LwX~yJM}opjK7E-JgLYf0{9A+ z+kNAutSkudZh&kFQ9$#*)vIusSxSD4=B&!au+4NvCW?4twCCRrH@Zt2%)jd z1ulX~Khx?mpe;}%KCLeSg%ZI0#p=xT?Cj2<+&k_*?VXt+@CC72%vhyNGo7IB4Zj4! zAqHG0iZ7ZOUg;LV=?^#0;yBin7;@BE)V%rG-Zo4<&7j11Mb5C6yH--!+YnT=up97;4(`HjFA`4w#mW;?EomTKiWTkzyXP4^ zyyIt*79fm<1}OAbAKIh^rJliwEV*13=m&uY+6~%I5Kvbg!Xu*d{zNh*xW<9ed}nTC z1d~7fj%Dl!>wAyQ(;6hhA5Z=QNMs;w7rOod8)#3vWp-dy83NE%4eeR@ zBJQS@cr_B8nVsweIRW_D!&CYjgcWdpu&}Z+vVwJP=Fg7EjWi@s1r7s&4M2-K%3gIN zbYh^U{D?@vC1S+ryev<=S3bAc9GYaR7@VJrP@K4M|Bo}_K{SBi(nv~n&HP!^5TnOs z0ReVQ$_dCa7a^?M%bHB7qMgG2*c0ZYfHNEdz;5LQVU$$V)M!{_w+h}uE}Kqm+1==r z+*}Ggytja@0S#rdp_6C?Ko`yX(m+23Z2+hlNBpeBC^D9r=~#e27y{NaJ98gDIsz!e zl!dYc#M_*Lf^Wb<2e6?JmA&8D!GT3DaUJ@@8!*B(RE`wM&^0p3%sfVxfv%WMwfNOB z6rUgs6SzW#_5ylGOf{{bh7?6xL>?N^VSyQhCqaayj8ux6-~K_O*d@ zu{-U#ec>WgCncXh?7W|!C$9HN1ahp4zI=i}O%c82JDc|~trZjyV5&sY5xib%Jky^6 zY7h*jp;m;x%cNy&c({5bo)?{M0Fa_gX<`7`%fOg4)tn$%8aSx$!KRrGqBlq5#UNBW zA~F)r;v}jeJ-2i-OJg0!u_QR|s4u8e3W_X-l65 zlVZ$IYoW0n1AGc95Z*RmlMwBew{#omG?V3-xb7Ri$5jW!jZXtxUf$x`dWYMmduJRx zC$iWY^bew-Bf5V- zFE6hH&d#^B7C?L<1lQEHh+l(N8~V*(TD{6{D-96y|`e4+O-J;4N^VKCx_ zDfe=N^ovgGOc&k6;SXU0 zy@Cr>8mgwni)I-G7#+ko?!uKyO~VAggO%VDO%Q6Ewzz@BE1m!iw(tPg_fq;(_hfZ{yjf0cC71LCxK_| zj_?wjejecIL7*iBpJ`rkkj+438S{Btkr5QLQ_IUV^)TXr`@g}1jZ|bJSH4(S;S$lf zidekxtPfX~M;}5G6UZ&1i$HmnoLmH6_?>_Cz!kL%iX9*=M2Bj8>+fHKfh=4ui4bCR zW}IK<;1MAgj`bacmtaF7364>~_k!i_Rru|c#-Dx>xb~aS*Em;Ni=nxEMZbeFIWf`g zxvm8Mj7+Sufb&ViE^csJiJWv&bM`()R%X&kH+@?b-=eE`){who%ifsfT6LS_NQAnY zF?L7GO5UkoM*?FSsT=;}n>$H2zYhFxF65dSwzk5FNBury zFnJ&MVy#OGTSMp4nx)nc+j6m6ox*utgQJonlI)5KtqJ&ol?w&Lvm|J0IEphr z<1He=0ATf6ulZ@G=(b|(hE&G6^i=F1%FVW-{QCx%p`y3F8Jo4dY8>?2VwiG6h1Tl0 z$q!CLmvydzTXLN zk}u4up8vs9mMuCn;HvQZAh*_b)i%yI=3SkZMovrj{v$TTXK&4qN zohs@Uc(5Qq!TgHyazz{Fs8hEZJ| z!ea_FeX#Ap2pjP3pD-4Qf)=808(foNqYHq_63QGw!3Gfb_Z*LKA}BGpbhW`m4+u~6 zVVAKpNIQ+0$)$F1C1aAUpTWbo-~^TQ1r*VCP1X>*MyIR65! zQ|nfo9a-J!m(IVLlzuh&@Y1x$Z9Bu@WXoMU?6XBXL&?gcewnP!7Y0aCf!8k2y zcYw(U-T}?sN9}N)C{CK78&ufn(Ek0oTZt}01J>bCuJ|BQ6k+0)evlVkk^`p#m{s%- z4Cs!acN$2*8wm-WLd^+XPnO*4f6RYVbtYuMzYtM8&<&9T$n5@5=lsd(NHdu~TH4^R z{k7oCpu;y5WhjTOzn%s^Ev)n9Bc`Fc4BZx6(SP;lf)!)y&69SO&nSsT`YZd{1jIZA z91FYG2Q{|aJby21FTU@{%T5V~)#@tM(^Y9Ox4sK-p4TNs!+ON}w{A$ftK{UbR1*D@ zW6dzKgHL>$Gg8Cb#UcOXD#Ndfke>+M!~ByGy!;?o;LE%FIR-dmBL%u%pMEOEr5JjO z5x0gK9X3n^(P9g`d{Q*Qj8>B0**?q;aO?3}OC?JjjB!)D95wkF-DVVt{8=7lG-%Rz zD~Cc>@V+;_xIjy)sL3v?6lR7NSq!_R$-)9jGq$ksdn;b4zpKdSjAd{#8751FJc7l) z^l%=_%gYO7AS&~Zz*Xzv>PZ-B)HWd0pic)!r5EM^UkbwjQ%=|qT1qIA5tA0s8wksk zS0;>%jm<&hhDSg!18FU!TBLFvVEY5Jl3fD}3lL2eIcTugSQnMu!VLN!o048Rzhnp+ zJmA{UN(>1Gb>2e9Y-}Nu@Yy!6e7I6j{pOjF$n=m_Tet0zmi1}nfJK5(^cMJ)p z4r4^48Lp^`kf48?ZMyR&wDYYqmu)v+*k5>VP07HZ_#lF-Xo&UlgWgk79BtH)u+Bh$TnWpk;boz<|mATV;*s@&)J)B9}dZ@gH= z8Adg(O_EAOMKf$|NVLth!$1b5S4pt86)8A!xj_HH{EI1;}8$N3s zB9;eQ6U;Bt8sTn&?HV|H$m`ORRs@Adlr9iLVr$CXBVca6CuOsE3}%D1wTSYC9;hW$ z-?6C08>d1+T$Y^aAUwHtc{@4>@n~yr>oZ zMHy;%S65d$2h%%mOd4X;I-&OfGD&5Y6SR@P{`8l}$f%%?>DGq2d|6mO3jO)pk=Aan z1N-G!pw;)CMc-!;`lnRlJx4KbW^ApOEbqDg5a zHGiXgSA9LhfGkH-u9E67dDL)6Twh0eRNrkuRQon?$TtcyHcc0Xs0hK2RbnFVhPFCuvvF9l`VjhO96&Pv+Wu>_+n zCWmn~r7Q|lK7KPn6aDV8}GqMg`y=vRp>IsPkOs+ah_IK*GSaXcR--;9(9zL~Dc2L;72&V|dL=4J>OgOD zLyEJ@N5S{U_j^J*Hghz?Fjjn5#>`q~w;yF!d|hRBy+cYKzdf^1niD!i6NofH^3t1K z>#!}(Goq)(OX;c8@l#8+_!tEXixrJf8`Ucb+H1cM6n7KrO#i5q`6n5gmN?u*_5vvh zq=!+-+H8|+iFV?i@se4tU-T#<)9KCqzjku^Bj@t)d?;ouAI4czEAM2Af9@?lHu+|x zfr^+UkpX``V7j4&&-!4i|15pj42!w8amGJzVoR#cwFu`?%C_pTB1>()z&(6Tf@oGX zlWt}2HyCIR=O}3gPgk$o8l*SM%|>J{R7hy~sp|EHh4Q|2SyyS-erNZ%wqXzIyDWcw z|LskxIrj0Vl*er}T-jeCM~U8jA$Nr1ZD&yV7z6RmpkS;b{?Du$+3DXVzHK>V{KfCk zHaRwF*1{gfr>mn{K;0=Z^(ODD=pH47qoX52Yeq&nDxDAgsR6#iH#0b)K-UT=ZCQBH z5wOLW?5a`#lMrcp9-6~}p@t??J~lKo1(~t$Y*5>7KoCqrLv!A!#xatdjHmm};P9^e z;yNHbQ;L8IbHBWaxB`KZC`2+$PqYdn8~8F+0?EhDnL;W!Kt~79B8VIyNcjcDV8BtP zZk!A8^|y4sWk!Q50B|V4v8XhpbP>dh;~(7=I|8QtCEBX?_~{V2)M zFS;^VL6?AqE%sKqZYFUOlT8Yyle#u$~noYyH_!jwI|*v3JI}&))&QD>{P#4kQP3b z&Hh;(@+y<32d~s^p<7$(O=u&j=6>&r8r!@hqb+7t6G4*02ljUyPpnXs6z*>Mfd-F2 zq~F%y&nR1d>R)yW;(^;j=SvtA82_YFS?bz{p-yqOV<5jbsy*~|XuX%qD__FT$d3Mg z&?A#}gT<#x`Bx=l8tm~gqFc-+`4Mx1e!C5q4J0&)!4heSbRO5Dw1KX9CBu1ShHN4v zlLTknBerKk(CYGVfbe7u|(J?^Xz*x-a%SWw1wZ zEw*X|^sHK;38M+RWw1FSUI?Kcq83LPf62q2fun}DnURtb zUTY5uL(m2aeZ$y9&Eztf0U}|3KGg+}zb_h}^plC^TO&=&3j83kzc z*C0?ZF*Pk=DNUWN7{aAhW5H^jtFsD&&S-gg`PBIr;KtyjzsfCR|G^NY9*B$3;q=-= z29HNEr4?4&v6G9`$#m(A&Cf^Gq%=XQQ~vdWu^1h6Z6tJLL8T9!S0ap-eEi-LL@DDU zGxAdX7V}~|`+31=9@lf|y9l)dmpka14+-_>j&)3d6m8yI-2HV&P}TBW!TtA3vjxVJJGOUdh$>{UNv z=4>cBGnaSWpKNm=5Y5VAbspCoyUn=hkM8*{J6_pwqe1ji)oTn@d#u3VSYmKq$w9gN zIkA|T@)Bo@-NqB2WsSpQ1i|T%jdi0iIoacX?v%5pWcTlP0BDjCJ2H}vSH6~`3~*cA zL#UJ47}?H&D-zYLEd`AtJ~=rUu%VLYZUaP7^c==Kz1xm2L++3g5~cxmTB6YhT}n|3 zN&8^6&T1lwco(p%H}ukE_CP&bkUtn61a2+G#q@1G5)dl`CWjS14Cn~Mw>TMbYs=@b z-$3+V3Zrrjd!N}9(41hndIFe5Dy}TJ9UcN(agnE!+G*Bf6oh6siPZN$jg4X1C%R~F zQ66J`2W<7}FPoQ&lW3YU@}i52yuYtmNYO^K`NCv(oZT~y>E0%b2`GF@xf{M4G5fS` zWmo9!*~gzvf<{q)4@2;_pFCPodb!k-Y!?trQ18B8t|J@pc)9;YrJw7;*0Oia=P{fu zxvM4{EWD^z%Yl&gJ(paEhOR+Xsx^^VgYG4XMc3!H{|q@cA(}6v4lDz{Oo*O}6FE#{ z(uED0UZLpONOe4IU5TR$i&d>yAw@3m@|WH{i_UMHSeN|9e0M^Sew3}Jo=N*l3cCcw zNV#O2=i!;3+mK!@2l-n&9sK6vC1KeOWz!hKV>ZQm`LU`xn7@);pJOCy(iNj)YNtCT z=mb(7XOD)UqhO@ zH#%7=c!bDUI)Nx$f0sx~OwQOC!Iqv}sDqLmO{%0{(DNP`gif zAiV-7xRb>{V%DL%9fWgA;!*a>V*vnVU>8FVR-`KT@&~x6fJKo?dDL;6+c)v5(qC;p zyL#ZN4h9VaxJ$4NX}V5vadS^&(Dy=9&1K$-_dR`yM4ryWskxQ<7?gUk#wS)W(At%FY)B2s&h@IvmD3mxxcXVSWS**ST%2v zN6AllXpQ8po+!tWCj~9YAYeX@>kvEo^ z4r~X($EW^NOsd+OU7&gggVLTPLI@Zl=V3&2OMP$DoDl(8u(x}C%b4K47` zihoo55`*y*ba<6Dk4zAz`3Q3x5Jr{1)}l=6rqW4(?X9@H9JPSZy1VnxbY7;U7ko)M zT`xhnA_k<)oDG_Afn4y+hb;?4XzGdiey9C9U65b12n-~soa6O(<*bDsFZzIZ5MiXx z5eNo7k7*e#IQd5e!dz@@Qq$AtV3QPdoKPXPB#QFe93d8pO{UIk)X>~)+Sedw;ND=D z9yK=6FT}6-ZSy{O{yA*qx2AC;ri^XJp7J+TRCw)+z{OB2_faA@go70ol?5Dg#f|$Q z)7a$zTqTRxtM^m_jK=lX?3R@Bg^ug*40Y@J!G_acM z;6cWE)puTZ-qGP5x@la zHFzJXnB}N^u3=4oAP%EsIl}nFLRLt($+A+xa z7ucrf=M!UNRW&rg5Wp?ht2E#*=x~7wsrleRwglsc-rio2|bNEyE;v{`2U4h$Y{U*hAzOQw27s-n)%UzyJE#8bgL+`1wZJxzEpmL%T_t{zPiv+^QQwIqBkfn+1 z1A7Tz1HSK*sI`e>JNc8qod}GOlny4nxU@f z7`A0BWrb>3{)jY}T_ieWLOZJPvOd9D_$Rz=mM2*3!~aSI0|Wwqs8A5Y~~seUt4+9N_6h zr2Rl2+R##NC8Bs0e745c!4{d48Y=^5#46~UOx66$W?U%-qW8vOe{_u37J zbjFI}26r43@t;pYdg>NIxWls2L=u_peI0@4K#ErL&XbiKR;mZ>{+z`O$#U(XU+?zr0xa zNF0S0y8-);7(+R4b!+P$s4ZYG0X7nfJGrGJ#ACzEr1P5!PNCc`LnO`!QXP|wL5kiW zIh)9kQ7^7rHQ3^1kVffx_Ru1K7pDXjZge@HEir=@cvMVBjKfS9;2}SX?fLi;S5_ z0a&?~Vb{J;(g#mx+UmtlaX{LNY8B>D^(`<0eNj?or5mRz5Vs4ncu-DUz{G)pfq}`G zxr#fW4P1l(hq4E2teqV;3!U2;w+)l_$h7DyD=JDD06#bYrx$RXF^4FSb1sbMtcH~6 zUipTcW_@vI<{Ny5vhlLMG|Ei+Fv0Kbm9em(uDf$ZNkPHz9XQ1s<6uPx6ZXR_9*h3V zq#qY>fG6`X{XtzjIo658Ye5*TgEJ}KMrTmq%7w4&gZkiBeC<f<`0kQ=ODj17_r*V;poO6_0er6`md~o{XutaO*mcF>CvA&+A<1=3yQ_ zlnAYvTx^E9D~}5A-ZEV8e_+x2oe1MuuBN>OR%^VAB8Zj%4MJ$V_vYB!4cOS+fZPIB ze&EVgq}JNr4%F2?#ZWxONUetSmnvu;QB(v3NH1Yafq6K>Dg)q}p^8{Y9_1{Ox%D2C zhlr?vfNA}?I#_xKkm^i9=>@oeN3pO;Re1o3B=su(FW4|+{5iO|u*4AV5r4wnp4kQj zh^CU@;~xQut20%oD>~UWg0cUZBRYJoipq7KC`jSfLNcd&Me`lIMJ7fj^w!etrSH!* zivAYa_j1M%4DKiRFCc81DC#MG3Iwb9XW|ElCxMSe4g?C?nXwwrH~#OgHw|edCK0qe z9Tde}KM|lML)>u`-7b2J5qZe$HaJA|n6Q%V{MqR3+z^Vm$3Ak>+46?SI(t>&krxV! zL~=279aWgEnBQVUn_^mmxf#z>!X5Rx*f3f#!^e1_Lr5(G|mB3{z3e9=G0iT zqMAN9_C=sL^Z}X$=G!PbDqP$bFhvJ@A39$c@5y&VIuBSX;;YdyJhZou&eq?+#|8`5 zn#y{vm?{OsS{J&STdI*)z(a#gshHzqvj*Mlts2Y`qDpAT5t1@1uK6lobZ+3%{X|DX z@c<+BE0{a}0ojp2gW|6e-@UnA@NfYf=7U+O4x3Jw?kmVH_GAai6Ig>x27&21!_zf& z4UIB1AZO@1rw-q8M>~wB?dwr~#4x`ta*WS+#BtV#8M&{bX<+|g%99-IWj@k8WWaf+|6{ewe8f|%O4N{Ku;3XO z7;uN10}U-WIxKgGn5nDp!w=s`bPMDmYTfg;-%vkx#)yPSg}K>T$RSH@XgGl~2_LCT zpo-~qZ77ywYgZTpuoOtGeN1g(d-wkEe}2B%9I;6i7uTz1co3tpSgp^B3m6hYA-a`?J)qq%NHTCRlKI!{(Y_Tk8hQcg$D!HjoY1hlW&u6@?DR+AsA=7noM03QOU`CRpwx}kh`mLhXN9Vy{v198jHtZw*^m3WJz zrG1f$9M1i}Wy!7cnV-&k42qJWXt+HL-^qisUU2CWNH2-@Kshw6~Az}W#_{2?-O?7=^2adHm&7@opZngPQRAxgyCq5b3 zbH=ca@c(`leg#RUXa&R#R92qciGZ)fM||;{xk6k{JpiFM1cs+<#jGjnwL?7+QNRIL zM#dPMblE(H9X(ec$_a=mAk-HWq;wq4_^$}&(4J~K5rxCC2k6~!L^OE}jsnTLPl>!j z1!m{GR^3bQY?X(Avh)}%qYtjGX@8=lV`6%FdiFWX$wd?v(oouGM}WZ$unFPixw$4z zJ2@(FsSrytkS6+D-x0I{`w)`}M`pkbCoGsdA|e_oMIw9P3q0)R=GN5gUGh>5NH@Eu zfHN*>3!(;IoH|2G2Q?H*NNIa2yasXgZl|?ZkR8X)T4-tnOQcvfk{B>X&w3SMD4BRO@Wa7+8e# zaIxU_L60vB&4r|UacV|}u=ke6Zj^Q0Dr|JA|3wpOG(~hrSwL+Eu06lBx#07d;PWu) z1qHowTG#abIc4s_;!>11FZKf$BP{{e#6GkqXI zOP?MBfrfE|7&SG=5kvNWJEbp%-erRJkQ%IaQ`1sYzpxDuse!*zOz;p6#b^> zd?w5YtM#^9Q1+Fby*19Ny43UOIGlh8g&oh?QEAZ(WLYf~CX$5^$ybe5^oFCoU{3ytXE&*9B-K3MFP30hd!E zf(FSdawGaICC$*#p;u-mg@+&WX`;ZGpv=o)z=Tu|AuFx6mS-3%9g$Qf-wNeo8=pq; zuf2Q!eR@T<*}}u2tb&3NApfEx7N167{|Is#+6B!oP~OS9%~hqq%Wt-LfnB`-+qs>} z!-qwXCpjrMTRj)hFZkaD(56xRxcdC45UlBNBgtc`$>7>)oq@q%az6ZNgb?(L*ZHKa8)|Uh~ zV-pQ7QY?&<0b!VOM}pE6Qa%-+p9i{43@)u!B~-XEhnfNdLsQ#=aLDfdzwg6vX7&Y| z2R$|-i49w_icYv8j1m8oAe;%TqLZ<)u#^%h6c4egN>SwC_(rr*=uoME*hkOOE?dG$ zn_RPyUElB2-0x~H05V?|RL@}vKt%-6>?8u3 zY4n09jFDJyuz=vVJUaS4oX(II1ytO>9|@H*K#WP%)a1L9&W`Lw6p>uqTWrwz#R9Po zOUtZnjj^tP{9C!&4Mf=EN*vb=tZ4wRVA0FUoRt#L})e=Ylq8yzezAs~wb_YZtq+89qkE%aq0--f z;`T>4e~I|1J0Jc-$2C^x$CFJV+WOfr=2|Xr)#j>=>!pPwLFhJ%%8zlf>)qH#OK3`_ zP>{{{$S8Y9)+76D`@`}*PttCh!_873IxohztMw;y#kDLE$r<>5k0+4j-@TxQj$0QW7O_O)-Iav}2tBPM+v|dSOlAWyB&PI()FT_&1YV;rg!O99hH4i zCx^}IjO^s3tKFs4&rt5GARabDyw?^nD%#GMN`#cM&qX`b=NTAnXT2S)BBuzYNRigP z8mX6*$1Pt6Z=IBU>oyszU_ZD#eYuvmua_EC#pl%gxrzrzZmx+?3gPoZqOniB`4?+) z60=~-cIBZzseK`pNpiX9DGfBLKDr{Q#*PA-*><=Lg0OkR6%<1etSa{8^MM z*rr5~?G^zw0lGBWIduR1>}Q{_Aj@4ggHLE|_UxpXILvM03;CTe&TSRXL+*yrtsz;RS&xC=)2LUowyj^mZbY!|8dn> ze?`(m?d#<`-*`Q2c|!8ycXu`ydQkJYWn@2oEPcj%7BAnJ z_s8k?m6IdN)e6zeuQM3B5m8k${e1@c!(PD$ujk_(#>vGNU0rpPYSQUAg=}8%Dl~dN z(S6~7Saj6naT=c2dIjP@Af*)d|L@46dI&otwysd!O6-KEFoVqdEicc{<$Tkf0&}u>RCih*+?AWkc>G+?I%@er4&{%&QQ2R1 zF0N*U4PHzfh@ z;I6vo1;TG}x(%iWaBTJ}<(MYQ6@TdtxjzhaKd`}N&0(i0w^tGx2UlEz%AICFzSOg_ zP46BY$D3N)KUUQVn!+c3ma&befjn&FB%!)1KNyvST8ZdRd-sZt8#Uxe;Fz zw6aPnT|wr}okY*t!jtIASR~nf8}A-3MJfFFx3Yub8p5N*ra`@kQ_yUE;7Fq=iYVbU z$cx+`CAmq$?1WMNiXG8iOgZli-sZ|jY2#-5En(+L`E2j?Z(!U7h(xJNY6}Ls+(WCJ!epF&1!Be5h(C-&4 zx&6)3ox6vM)#<)J)l7|tvY{m%C*s&pV&ayxSdm#`f}*ILjQhU}oHL-5vxqR-gd;mO zb#P@5A;2xYs>QRgQA6^bY*apm-45g_fsQ$*clUY$z*etsPP&J|`{B<();dbx_a^r+ ztD6C3Z;~C<$c%;bSrFHkv92L2GXJThM1jP{e~-|y2NHf?Y9V$PWY}FSp+JN({4x68-X8p*iUZwjJzXe( zVIG}|h|q@rVp=E_V(Os&#ZNP*^GM-A=flN8+bP$OOJPA$cze~)YX85A?)TZIw;rEy zqJPi2M{6KXq_tDrReWds@{hN_kdA`+QqvCSVr@BBi3Jya%8_X;^##MPLf9q`2I5Iy zbM+sQTeAJ%O}MNUlK69y)=UdZ19tDh5PqhV>X50qY)}NXx3<33t!SL;fVvO@wE&27 zdHk3fUpFRRID1b)OKSp#gHix=IXwRQ^UKxvS|_fwG3z3)WMft2!g!av7H6=0j&3}T zma98ndk4a47g$1Iq~nor+8FV33G_fPqfh^@5G49E;K~ksoZr8R=V9%RvuNi2>MtjK zDu6APlbLx(*2>CicWh1xW+pow$Av$&brqs5nLfLGs1nJ|!HDa<`(y#(N;SYoz)rq) zaavVX1vL1h7YlG!qCHBlE{D0HBZO?=0TD^QQq8eq4nlQGUMaD5fwAskjjN!+h2I|| zQXF3HHQO1(Oy`ErSB=M$st4FnZwdFCPaHVmow3r?!N?8m#UY*)1RK%t31aEfz{R;2 zvCPcI#wILGd<+R_Ln(o`LE8sKXA;fg5(JE&Y^8GQ$G2^D*!S_M)=H6yH#+URFh!le z$!~uCc?_}5j0rA1!2@t1@o1T|u9HCwalTV`R%$#(iH1({-^MT@Itt}Ks|3KmzjX!@ z_5&IKK~nvf$8)Ao0YGr*E5IC@52rS*HyHn~0j3BqEOgsB;KYNtAi$*kX^#1^^kY0C z^(bL{ss$KM6r6!;a6p_gd+bB`jZY*H2u~(-gAka}@bnb@*v&Yx4>U5>~>1 z7*voeVz{ni0eJv#(=nAle}x3k1~f$0c6Z5yT^|mKc&y6gm+Z6pLw}G3ct#U`8!1$a z^x^Dcppkc7sAnFAu@fj9R-t3v>xFKbzU+S?u+}cXcbyQ0T!If^`hoCgwxls)ab<@t zTNFfV)vsQq-90gf$x+dh8$d?@w*=9vhN>z*A0H^8o5VtR1f4?v$wIFS_ z%Ea~b64vu1xP8%2kv+90+p=Fx40UB>I|Vv7I5jNJ%m_d(6;J0yML@DG7@b2WN@BNR z2(t~y2U9h&bac571F}R4VL8d_&qbN(F_Tq!)72LQ5L!+g0= z@}KW$@8)`^`}1uF3x_bi{%@Arcr)vDKhOVtwDnJ4_VUbc_Xu@7LAgQblQ1JJ(=gUQ z`1rl5e8FkLAAZxa_SN<~`^J$N)`NP#=cP<{|5H7sZg`cgkapa`xMbyBVkjV0Ygkb4 zTuMy0`A@6FR&I_Lk=IkR?o>C9T#%j`w>`0Lto7JYLm*Bz)TX#lUC|OfcH3y&G|Y&d zBq@HoVz*$>OIMFZjEiOV$4)%6!r1WPi(^*Vgocct-k4Q(>6$uK(?g$m`d2@BJMb4%AyMF z_P~8XB-&9^AFQt4B5fWgR`m1x12EpyH_!>+6@#dgZ?KwZA*fOyS%SZbvQr8ME!asx z7k5D57g6-n&XIs{ix*w;;Ef&)N*oFKWnn{?QSD2qp=p)E+)qE&wOLy~$BXTExm1SL z#D4A2UrFI+Wk|g2`n+tOs@RSlGEV<{;@yhh;VHHu6c_)TBD#FaMT?T_s2TnyP~Xe> z_Xph#xlDa?q&RxO;0I&g2NC_aNxsF=QAvjv0!HfBvKC z?lM|p5_q0d;oka{HYx05-ov{Rp_?)%-mloAvbFTP;>LwoIjEv||L9alpEuYP!CI^g@ro8}T@^y$E zFPGSNb}tXW^Re*oX#5-H?KaZqIc$p&svUg2S2b_37w5rSDXXfPPRhE@GIX(Y6goyov`9Baw9{o^mQIp&UPkDPd z+)`3*w*i)c2b*{8X+PgN2Kd-ck9?>-+wS<}MsrYGxhduRc@ec>9Q9*gp8q(l+moHI z{yl&FEFLcN^iu!W2XFZA;cG3ssNeOR(&@++gp3N&Dc(4QT{J8HqP?V4J-IiXRoR3q?)*E+oVl;TOx=sFb)*jZDAokfN5p zQF7ZWrFtnN>)e2ZAdvobzJ<0IXOx7yPu&Ac4s9ZB!LPOx!G)=VP|NvWs_lYB~AiZ8br;Bcr*K)`;#nwixdN{$o@Q?knj$woOJne$RKQ z>vT(h$8#C>#Rm9nfkMm__x47&+1@N!P^fG9tpb`Aw8E(1_xH$ErAC;n&r?eKlM=+?WOA8^dPrI>&B zaHoC58U3cOL~Q0QFB?Em;L4AYn86zJAhD2t*g|x>>w__Un?(G=)9P;rQFE@O*G$h! z*tRO4uw@<}=K~Gg1V?Y0sUW7+!kFhPhO?;0!4^h;(DV!K!W6kOrceciyQBZ`JhKw5 zQAvvPe-}1$yj?KRB@aE^qC=}iNIp^@kr#YC)3w+spNl(UWi4i#oGRJOFn?0=H8AyN zg2u>S=fOy@isv39s+ZGuKHA%=@GtjXS*f zNmOu|zMpDqS;%=JCUOirxNn>6X6s(+xs1SB>y#81QNM1Q-y|1`e)0F-qkg4x%jv_S z#`NL4OXd<3l&F_d;O-W(#z%XuHxTajZ{*_vhVY({tlGC*B7yihYOzFr%=^D|-EZUl zt^J6tToLu%%+{S&j^><3N_@p?i?Pu1j(YP>rptI2splE_Sdz$@Y?UwAsb9nl6t9pT zcf8%RQ#i^nibif242bI(#>%@ozfl8MLOx*}kuw}JK~^TFV8|6|^7}Q$H#UkW_wVMA z0Z_N}?OU;4H%Lf#w04l?Vdnxp^R;33R%$6qwbC(!6GGk~H0zLb11IgU4KWc>dQMJt zUESms*&QPBWjW&h(TLmR8bH@cfd>^GxlFR=2!u71@FK3PU>Uu%Pi7QYf@zy`kv^hj1 zOWM)mXC0uoiJ#NoOm&{KFrS=A6xnVsvVXAjAI+22V>8Q)YsL}?*1&Vy$jw!_&XFVA zB3zfUs2?RdYqEV-n~{1r~1P1wZ`kjT(oi0Dz4HiW?HqH zY7#V#zFxH4xj6=oD%9DVj1y}d37`<^xQRQXpcleasMla0I12N-T)vI`6(dl1d+K7T z66I%B=6iaxjSQzi*Udr;B%>kkj3HmWu@WTp4}~TfexIIng)zjAX#7fPAtzy!@hf*c zmVLc}{jF?RK#%=yI9l_RAtPtp(Skf$Ss9{WjoQf;74%j|AI;=`a`l%#24w?*&T}AO zPuP6V&(EiM1bfHEet_zY>9fj|E5NraV1x>MIv|rw!N1R+rGdTykZtlGXp~^;0>#;V zaq*g0uNo9%0&6zlS)U244Ubs@mPQ;VV|&aEzw3_#+wXF7#pG*0ZqZ-Nby}xYaWV58r|Y4=0QA~$UMi|rn+<@KX=-pA)& z%k6lZ$cDNm)v|YRBp8e(LrF*})#+Kx^(qxH&&ZG2n2)Bt?+vrXzLfJk`mviXa@Tfr zM$%4)Emz`lR8*SY>PiuZd+DX4DaT+#>(EeDnwL#ddP|!sO>zeV`3A?@54_U zk`V&4OeZGGuh}dEfnmKnJtf$ua?4in$z|$~o=LbZ=rDC*nks-?qOFY$2>g?Co2?j! zadWw=FuG4ZsJa11{5&<~wA^_PQRh%WuO9B~1YG?+0@hMk*bVHq{gDpe16eV845*j>mEB)WdF@sr>Oz-jUv;w6uKBw#siTD4KYzWF zm@danJ^84CK{xRa8~39-&lJKn!%igP+k>7r{#9hoy2I8psKK-5l5WGs5QQY+KWoLx zd49Q|NJpOW=dOHQ(`eKORu&ab&oXJx0}Uy{uih=4x(ou=V5ligmfBZJ1^%?10_`ZcBX zrC}rJ=E{4kRn@Vupa(QMl0?y?u;yz9W+%6vle2#{*E{SFPv|3s@+CE;B z>dd%P{9Quz%sU#^xmk&obK!q%Kk&B!KN&iZk<{azMuHRl7Tgrs2iDn&5m$~HWQDUpygYcv*GKC7Ub7>!?ykS0FOD-u z`(Of%g`KOF6ZRXdQ-?H*1B0xwV@bUt27Hsi|OS6*{Q z={nO3OSpIK`skc$di@^%JMLy3x8Loo#F_6!{_1*6umx^~W{fzL@>xWA{dUEVy%%Or zoIiV0Y5E@eDskHrU7HF27Z{*G7#(vA?S6SJ`s!NtfMMDnlVMdWs`0BzxupuMqZOH% z1k{u?Xyn2W?qpD?$R4VY!i1=T4ohLHK)qWMhX4m6Lf&?R^TNZwg1?7Ll5eGQrf$r= z4KD!L7H?9NfL{jKZ2-rHihw}o(c#>~$Y0ads=z+`{yiln4KRBW9;KssuN9p9RBbg$ z@8z!==vsetJWIA%b&;F++&bE!pMW>vxwEU!Q&P?>+c? z9O0i+@+bQc&yGIyoa3oeOmnBMaLU*4V3XgYj>EPG#u3jX%NRadu-Sj1f4?|Y{Y9g3 zR2J#vFHhZF=gx1M{m!1+Yf2?pXXo1U^cmHCPb080+!IviW#3qt+0uuXyU{TI%Hpu+ z&<6?NFb!%MbZiKokn&Ym~O6A<_258jDMFNpxipIRD zm|E2s$dj*p3lHw%2q7r{=$OljQdSIMhElbUN;!vgr(6F}-dj6&K3u5$q#FfKwtZ@r z#0)J46O!L978e)UdCx7#3hQYFX%c$4(H=vFE+ojIBGp@8U;V|S!jBlrfBUtw^YN1> zGNfVA_4Ph&S!jz&a&i#fM6Q~`(Z)8Xkjj2T9@HH;Pgg*!r1*u-=N!7#7V8muSl1tX z?P`n!XXw4-;pqmeiG8 zBQxEPR@Q5-`^g7@$XgV2bgdHn6x2)oQdSl##a}50f9fC zha`0#ISi{ND(9%S98cQ5uLVQR-|!+OzXx0s(2L3O@ua(yRPdi#ybmpX*DXu-UzwTZZVOnqOU3=$ z#=d8|(t0BsZweVKq@+rpy9%(NqA0ZTS-got`8x(&eDCGXTh{Lvfn`Z8>IRgRVD%Xw zeYxoa>0B-xJ2GzY0u?=J-tV>V^XFTDJ%Tz8w(8&Z``HSw*L~c2yvx$zA3E3ccv`4)50L~rJDVO5n8XFpDiIPKfGRhh5?O;c z7~H6wW#}HjF~k~pc&|@(W~@LJekV{Lsb{XW6%mxpFF+&&yisrvJN`X~&~yZBuwm3<{L=;#^oN*P`O#S5;SoCkAZh&mp1@%xeTiMJbBhy`Hn` z48q;(iAz9H=LEr&ASmpNLS>+NbyQ5$}8!52CM_#2Q;K{Kt%#jg)v zU=wpEO^l7LWMRWs2O}x>1aWD-U7RUF?RoL{&m%Z2h%vi>KL`|-vEyV1 zV6RDHHiS$+u54Bn+-3Xkx-wZ_{kF2O)PM3sL0;ZuyiZOq+%ziq{g(&sX#SL*jt{&; zw20EKVF-fLq&GfbcXW7I*m)T>^d=sI^Z4j!xQ08@3JPlZZMvd} zkJ3CqT>y-V+F#%q1{MbR>FG~bjhn#nV9tD$kN3ZyMTVXiYRNgv6ZJ;SvjP|_*oPd@ zeZeIT0mB0JM&M+JF2c)u01JUt1T^jf)}$J=J!9t5)B^6a$;nKd&i}l&!jX9P+1$5^ zGo)SwfY^}iX^+%8{2cto+ITiLz#OknKyrb32ytYilU8JfmLby>m6chUnYc);OiWB& zt*wEDG#y=qGK6O+Q`66Xn4Sc`r>1aCL|hVZQvZ~5R2WJ|?1K^noZ!$a&7Q&a>b+09 z?Yy@r12n)k6+ycx+U;U&oe-FU5mfl%QZNId3y32$7GZGb%#(DDKN=HchZ#>EvB5Lip&ePDm1gIU+tea(^w zp~(@nBQv@QUr#+|`a91gMj4EHk2|{xay7WK#s64hiFodG+k<~z@F*i_Jxxs#hF;BZ z8K`g`(96u-fUS^7-{uX_^nCdE(bN@N$2a?D{1$>?EDrj%Fxed7W;e153pu<^;@Y9j zQ;vOcoA7;+qlvYp9D*wX|CEYjBK+brK=20omJ9@GvgbqaH=>A;5II25fjJ%r9Wb0) z&+#-|TY})H#;(AWxJLpzj5P%UAk;CEZEQfPW5_rlxSZfw~IIfOy2- z$%OhHTLQ2L<>lq2@2M#(o488q*uoM1$f*(ROyTu_ygHdUT0YhDqlCzhNVjCEopT8P z{k{h>+GE5TSy5#vkn4W;ZEQa`HVT4RhJ1eO1EdgBEqJd}0||N)xnrDJ^V<37_(JARy~cH#)`zH&{5RJ}31j!I!$ev_yAZVPRq|Pica3CicU!aFpvG zp}m6}E%KE{cFrFd1ifRvabp8r@+bMQg!Du@YD0GXjc0 z|4Px97jos*{<80ypaGR|Fq;+~M(><$*LF z&=0nkQT?a;E<>$^j5^CZFm5cKwJBE-FWo}I;6#|Z?;HkZ>y`md{k9=u(;6p z?{=|;Z;);JPJusjVyZ0c@7|dvzl)cybOItgRCie;u%(CCu`Mbjuq@*xlV2gGj37BD3N~sa>U1NbJZ;K{|*c`B3G=tRG>c}kb1$3jZ#Zz z!U&E$2*nEqw3csqEmRcr&B37JnU$3gRL#wF(^ACp0(yhk=;)4Zd}3mSvF@W-&iwx1 z?1F+b+M|m1{vqY%zhWMYh!URd1&QK)`0pYpLh4D#O!5m0!Cfy^I1J%8G_JnobhkAd zS3KZys!yfrhk?HSe9H@C1A_)#Me@+Sc15c5Jr9ta0gW031%+vncg-TVdtA2oVJAT{ zVQ^erTw>xFpy1VZKX}up`K=Q&#C{0>G*$NSNJ*A66Me|oEfE>b^Vwr~c$5yfhwwAr z1a~UV_YdBVAa4u?Ci;~^&6kkOY*2Wa$AkJZ0OV0NoV+)#Aa)wU2$?n;`K`gZd4&iQ ztuBc!|7jT}whlH(4H3cA+}yQ(XP@8GX4p)=3O6xJtnq&SB&Z7R7+Dm5;IG9+r-Rk|zt7&t%5;%Q z`kmgS@soDHT?A@5gcgj;+uIw_qY9;>HklwbILg&ysIwDto`gK)%O0#zi4ShaoY z=I)ERZ3M0WpHS7-pv~2WHyG+sU6Kf#KcIsPDE;(#07|8IGj?7dgrb|9n)29B^Xn!c zvLO+|C`f9B&G9V6iGo5DVf(|wL*UL#zZLH$XWAMPmRuXm#uw7k_8571|zF1O?>pdy6cA>#@sI4t%);Ju3lpa4;K4<3)Vb5tonTJihj4Aa44BkrM+=Ck{T7~}1#3LUo z_SaNlwB|`ZgnOh7(TLZaJ>@i%k&5T?jfg9=A_EhZ6r5Tei@nGbcd8aay9Tc(*!nT5 ziLhn{IjYgJZrPiZC2^ecKP-qr9itqND~LCU~Z(@;!qudjc$=gptSXbw_}kfyjj) zDX@4>QK|Z$HR-^x*INRDJK-Ze@J`#=*;${`fpcY{2MjNzcdZ*DAyl>#LZ+8HBN1b8 zow6impej&8;pOQhC@lm*^b>(|407sQw@}crX}fQ`Kr-!HHa>^h+Gq6F3AE z9HifPxVeQ6SKB^Xl{=G2D(Ta#TX|X2Ix}+tuGol3NL4Ty0ur?ww2A_Pg2ymt{!Gz> z&H-_B7TWb{5w;`;jVPA{jKfNmxef8-L{v!b8Hqd2i>HI>@b#Zb<9mf{8mg+FKYRer zpR>Dr6L|TO3!WFtzKn!e2k-_?Ow`fT)Vzh#9g9e2rK3Z*iceR<#kjqPwB!A9NVWZz zE~2BRwgdVvc;pej(5ymxfS`R->ZnRvw8lS2E4|C!3WmU^z|sUwG{$dG6U+F2`TRMg zT$2^vErf0JH>#TQ!>U_@2tujb;q^~7gH0B6MvOwUfXAY<9c|KXc%rVt6?4PK=s67y zxW*c(7Lpf#tzUGTU)xL8hbRj2gv!lM*cHPa&_#KywZPX784Y}GIlTApoNMQ2UoBXdiO2pIq`Dlj z6ZC&ktx-W3QTg02vMh}5CNB*=_4Rq}>av*T^p5N0{Wls}c{o>ZhTCbkIzvrAx69)N zcQi@~9e;^z*!$yjkEQ@6o-zn6HKPdEo%l07!>{Q~i!s)z3Wn=bJd5IT*c4cwY^Tnu+dg~Z>&N3+l*+cb$oWNJNjI; z=06iy5^ex-%W~WE9<6xy#o9>xpPYoNEqR-ZWue}N_EsiBfjZOFX*o%6xrZJ zPs=Vh?D}iH&f-dww5z(KneKjYrrHn>R_C`|)Hah&4cnqW?gGT^ml~((wN!=NZX4Xs zullsSKk_+kX0NXceDcroY#|AdAPtqtuI|U*WV2tee#U@7VC7k&Z*FeqGx*CE-=}?D z*2FOGOUOm>kLctfKclJ{q39|80{^Tl9Y5EnDhc?+=--YhCc0!^)_b(C_e4gI1ectS ze37NjS~`1@Gv@b;Qt)MO*Iw=&Xgq;F{<5MO2}k5~W(r$J%rx&oHKUlAFR<6)d&z5V z4uD8O_!6~9Vu7DYN%;=Sg&a7Y_CfjR?>mN5F(?n_1~7mbjt7TSu+m2j(m8bkumF4k zr2I~unpqNJ(FuIlGduwZ^fk1Hjc^DXdTq@|@1NfOR5>x03<&G}ETxq^L1tHn^;ije24%wGbIAJ;>#30V@Sgrl

c5?!*X_cIe(cS~uOjmvw!$YL+8h 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 Date: Fri, 20 Sep 2024 20:44:32 +0200 Subject: [PATCH 155/165] Remove unrelated discord link This doesn't need to be here as it's all Ex developers who are now unrelated to the project --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index fb7aa3ed16..4d4f239680 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,6 @@ SPDX-License-Identifier: GPL-3.0-or-later We're in need of developers. Please join our chat below or DM a dev if you want to contribute! This repo is currently based on Yuzu EA 4176 but the code will be rewritten for legal and performance reasons. -Support the original suyu developer team [here](https://discord.gg/79B6wqFPnc). - -


From 592f93b26cd75765a7b99ec4a711aa03b3325f84 Mon Sep 17 00:00:00 2001 From: "Crunch (Chaz9)" Date: Sun, 29 Sep 2024 21:23:11 +0100 Subject: [PATCH 156/165] Update Core Timing .h file --- src/core/core_timing.h | 96 +++++++----------------------------------- 1 file changed, 16 insertions(+), 80 deletions(-) diff --git a/src/core/core_timing.h b/src/core/core_timing.h index 7e4dff7f3d..5b42b0e491 100644 --- a/src/core/core_timing.h +++ b/src/core/core_timing.h @@ -11,8 +11,7 @@ #include #include #include - -#include +#include #include "common/common_types.h" #include "common/thread.h" @@ -43,18 +42,6 @@ enum class UnscheduleEventType { NoWait, }; -/** - * This is a system to schedule events into the emulated machine's future. Time is measured - * in main CPU clock cycles. - * - * To schedule an event, you first have to register its type. This is where you pass in the - * callback. You then schedule events using the type ID you get back. - * - * The s64 ns_late that the callbacks get is how many ns late it was. - * So to schedule a new event on a regular basis: - * inside callback: - * ScheduleEvent(period_in_ns - ns_late, callback, "whatever") - */ class CoreTiming { public: CoreTiming(); @@ -66,99 +53,56 @@ public: CoreTiming& operator=(const CoreTiming&) = delete; CoreTiming& operator=(CoreTiming&&) = delete; - /// CoreTiming begins at the boundary of timing slice -1. An initial call to Advance() is - /// required to end slice - 1 and start slice 0 before the first cycle of code is executed. void Initialize(std::function&& on_thread_init_); - - /// Clear all pending events. This should ONLY be done on exit. void ClearPendingEvents(); - - /// Sets if emulation is multicore or single core, must be set before Initialize void SetMulticore(bool is_multicore_) { is_multicore = is_multicore_; } - - /// Pauses/Unpauses the execution of the timer thread. void Pause(bool is_paused); - - /// Pauses/Unpauses the execution of the timer thread and waits until paused. void SyncPause(bool is_paused); - - /// Checks if core timing is running. bool IsRunning() const; - - /// Checks if the timer thread has started. bool HasStarted() const { return has_started; } - - /// Checks if there are any pending time events. bool HasPendingEvents() const; - - /// Schedules an event in core timing void ScheduleEvent(std::chrono::nanoseconds ns_into_future, const std::shared_ptr& event_type, bool absolute_time = false); - - /// Schedules an event which will automatically re-schedule itself with the given time, until - /// unscheduled void ScheduleLoopingEvent(std::chrono::nanoseconds start_time, std::chrono::nanoseconds resched_time, const std::shared_ptr& event_type, bool absolute_time = false); - void UnscheduleEvent(const std::shared_ptr& event_type, UnscheduleEventType type = UnscheduleEventType::Wait); - void AddTicks(u64 ticks_to_add); - void ResetTicks(); - void Idle(); - s64 GetDowncount() const { - return downcount; + return downcount.load(std::memory_order_relaxed); } - - /// Returns the current CNTPCT tick value. u64 GetClockTicks() const; - - /// Returns the current GPU tick value. u64 GetGPUTicks() const; - - /// Returns current time in microseconds. std::chrono::microseconds GetGlobalTimeUs() const; - - /// Returns current time in nanoseconds. std::chrono::nanoseconds GetGlobalTimeNs() const; - - /// Checks for events manually and returns time in nanoseconds for next event, threadsafe. std::optional Advance(); -#ifdef _WIN32 - void SetTimerResolutionNs(std::chrono::nanoseconds ns); -#endif - private: - struct Event; + struct Event { + s64 time; + u64 fifo_order; + std::shared_ptr type; + bool operator>(const Event& other) const { + return std::tie(time, fifo_order) > std::tie(other.time, other.fifo_order); + } + }; static void ThreadEntry(CoreTiming& instance); void ThreadLoop(); - void Reset(); std::unique_ptr clock; - - s64 global_timer = 0; - -#ifdef _WIN32 - s64 timer_resolution_ns; -#endif - - using heap_t = - boost::heap::fibonacci_heap>>; - - heap_t event_queue; - u64 event_fifo_id = 0; + std::atomic global_timer{0}; + std::vector event_queue; + std::atomic event_fifo_id{0}; Common::Event event{}; Common::Event pause_event{}; @@ -173,20 +117,12 @@ private: std::function on_thread_init{}; bool is_multicore{}; - s64 pause_end_time{}; + std::atomic pause_end_time{}; - /// Cycle timing - u64 cpu_ticks{}; - s64 downcount{}; + std::atomic cpu_ticks{}; + std::atomic downcount{}; }; -/// Creates a core timing event with the given name and callback. -/// -/// @param name The name of the core timing event to create. -/// @param callback The callback to execute for the event. -/// -/// @returns An EventType instance representing the created event. -/// std::shared_ptr CreateEvent(std::string name, TimedCallback&& callback); } // namespace Core::Timing From 76f6f8de808acd32402ac3ea06f58cae50f16c58 Mon Sep 17 00:00:00 2001 From: "Crunch (Chaz9)" Date: Sun, 29 Sep 2024 21:28:35 +0100 Subject: [PATCH 157/165] ok --- src/core/core_timing.cpp | 114 ++---- src/core/cpu_manager.cpp | 43 +- src/core/memory.cpp | 865 ++++----------------------------------- 3 files changed, 121 insertions(+), 901 deletions(-) diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp index 1abfa920c4..6ac0007764 100644 --- a/src/core/core_timing.cpp +++ b/src/core/core_timing.cpp @@ -26,24 +26,6 @@ std::shared_ptr CreateEvent(std::string name, TimedCallback&& callbac return std::make_shared(std::move(callback), std::move(name)); } -struct CoreTiming::Event { - s64 time; - u64 fifo_order; - std::weak_ptr type; - s64 reschedule_time; - heap_t::handle_type handle{}; - - // Sort by time, unless the times are the same, in which case sort by - // the order added to the queue - friend bool operator>(const Event& left, const Event& right) { - return std::tie(left.time, left.fifo_order) > std::tie(right.time, right.fifo_order); - } - - friend bool operator<(const Event& left, const Event& right) { - return std::tie(left.time, left.fifo_order) < std::tie(right.time, right.fifo_order); - } -}; - CoreTiming::CoreTiming() : clock{Common::CreateOptimalClock()} {} CoreTiming::~CoreTiming() { @@ -87,7 +69,7 @@ void CoreTiming::Pause(bool is_paused) { } void CoreTiming::SyncPause(bool is_paused) { - if (is_paused == paused && paused_set == paused) { + if (is_paused == paused && paused_set == is_paused) { return; } @@ -112,7 +94,7 @@ bool CoreTiming::IsRunning() const { bool CoreTiming::HasPendingEvents() const { std::scoped_lock lock{basic_lock}; - return !(wait_set && event_queue.empty()); + return !event_queue.empty(); } void CoreTiming::ScheduleEvent(std::chrono::nanoseconds ns_into_future, @@ -121,8 +103,8 @@ void CoreTiming::ScheduleEvent(std::chrono::nanoseconds ns_into_future, std::scoped_lock scope{basic_lock}; const auto next_time{absolute_time ? ns_into_future : GetGlobalTimeNs() + ns_into_future}; - auto h{event_queue.emplace(Event{next_time.count(), event_fifo_id++, event_type, 0})}; - (*h).handle = h; + event_queue.emplace_back(Event{next_time.count(), event_fifo_id++, event_type}); + std::push_heap(event_queue.begin(), event_queue.end(), std::greater<>()); } event.Set(); @@ -136,9 +118,9 @@ void CoreTiming::ScheduleLoopingEvent(std::chrono::nanoseconds start_time, std::scoped_lock scope{basic_lock}; const auto next_time{absolute_time ? start_time : GetGlobalTimeNs() + start_time}; - auto h{event_queue.emplace( - Event{next_time.count(), event_fifo_id++, event_type, resched_time.count()})}; - (*h).handle = h; + event_queue.emplace_back( + Event{next_time.count(), event_fifo_id++, event_type, resched_time.count()}); + std::push_heap(event_queue.begin(), event_queue.end(), std::greater<>()); } event.Set(); @@ -149,17 +131,11 @@ void CoreTiming::UnscheduleEvent(const std::shared_ptr& event_type, { std::scoped_lock lk{basic_lock}; - std::vector to_remove; - for (auto itr = event_queue.begin(); itr != event_queue.end(); itr++) { - const Event& e = *itr; - if (e.type.lock().get() == event_type.get()) { - to_remove.push_back(itr->handle); - } - } - - for (auto& h : to_remove) { - event_queue.erase(h); - } + event_queue.erase( + std::remove_if(event_queue.begin(), event_queue.end(), + [&](const Event& e) { return e.type.lock().get() == event_type.get(); }), + event_queue.end()); + std::make_heap(event_queue.begin(), event_queue.end(), std::greater<>()); event_type->sequence_number++; } @@ -172,7 +148,7 @@ void CoreTiming::UnscheduleEvent(const std::shared_ptr& event_type, void CoreTiming::AddTicks(u64 ticks_to_add) { cpu_ticks += ticks_to_add; - downcount -= static_cast(cpu_ticks); + downcount -= static_cast(ticks_to_add); } void CoreTiming::Idle() { @@ -180,7 +156,7 @@ void CoreTiming::Idle() { } void CoreTiming::ResetTicks() { - downcount = MAX_SLICE_LENGTH; + downcount.store(MAX_SLICE_LENGTH, std::memory_order_release); } u64 CoreTiming::GetClockTicks() const { @@ -201,48 +177,38 @@ std::optional CoreTiming::Advance() { std::scoped_lock lock{advance_lock, basic_lock}; global_timer = GetGlobalTimeNs().count(); - while (!event_queue.empty() && event_queue.top().time <= global_timer) { - const Event& evt = event_queue.top(); + while (!event_queue.empty() && event_queue.front().time <= global_timer) { + Event evt = std::move(event_queue.front()); + std::pop_heap(event_queue.begin(), event_queue.end(), std::greater<>()); + event_queue.pop_back(); - if (const auto event_type{evt.type.lock()}) { + if (const auto event_type = evt.type.lock()) { const auto evt_time = evt.time; const auto evt_sequence_num = event_type->sequence_number; - if (evt.reschedule_time == 0) { - event_queue.pop(); + basic_lock.unlock(); - basic_lock.unlock(); + const auto new_schedule_time = event_type->callback( + evt_time, std::chrono::nanoseconds{GetGlobalTimeNs().count() - evt_time}); - event_type->callback( - evt_time, std::chrono::nanoseconds{GetGlobalTimeNs().count() - evt_time}); + basic_lock.lock(); - basic_lock.lock(); - } else { - basic_lock.unlock(); + if (evt_sequence_num != event_type->sequence_number) { + continue; + } - const auto new_schedule_time{event_type->callback( - evt_time, std::chrono::nanoseconds{GetGlobalTimeNs().count() - evt_time})}; + if (new_schedule_time.has_value() || evt.reschedule_time != 0) { + const auto next_schedule_time = new_schedule_time.value_or( + std::chrono::nanoseconds{evt.reschedule_time}); - basic_lock.lock(); - - if (evt_sequence_num != event_type->sequence_number) { - // Heap handle is invalidated after external modification. - continue; - } - - const auto next_schedule_time{new_schedule_time.has_value() - ? new_schedule_time.value().count() - : evt.reschedule_time}; - - // If this event was scheduled into a pause, its time now is going to be way - // behind. Re-set this event to continue from the end of the pause. - auto next_time{evt.time + next_schedule_time}; + auto next_time = evt.time + next_schedule_time.count(); if (evt.time < pause_end_time) { - next_time = pause_end_time + next_schedule_time; + next_time = pause_end_time + next_schedule_time.count(); } - event_queue.update(evt.handle, Event{next_time, event_fifo_id++, evt.type, - next_schedule_time, evt.handle}); + event_queue.emplace_back(Event{next_time, event_fifo_id++, evt.type, + next_schedule_time.count()}); + std::push_heap(event_queue.begin(), event_queue.end(), std::greater<>()); } } @@ -250,7 +216,7 @@ std::optional CoreTiming::Advance() { } if (!event_queue.empty()) { - return event_queue.top().time; + return event_queue.front().time; } else { return std::nullopt; } @@ -269,7 +235,7 @@ void CoreTiming::ThreadLoop() { #ifdef _WIN32 while (!paused && !event.IsSet() && wait_time > 0) { wait_time = *next_time - GetGlobalTimeNs().count(); - if (wait_time >= timer_resolution_ns) { + if (wait_time >= 1'000'000) { // 1ms Common::Windows::SleepForOneTick(); } else { #ifdef ARCHITECTURE_x86_64 @@ -290,10 +256,8 @@ void CoreTiming::ThreadLoop() { } else { // Queue is empty, wait until another event is scheduled and signals us to // continue. - wait_set = true; event.Wait(); } - wait_set = false; } paused_set = true; @@ -327,10 +291,4 @@ std::chrono::microseconds CoreTiming::GetGlobalTimeUs() const { return std::chrono::microseconds{Common::WallClock::CPUTickToUS(cpu_ticks)}; } -#ifdef _WIN32 -void CoreTiming::SetTimerResolutionNs(std::chrono::nanoseconds ns) { - timer_resolution_ns = ns.count(); -} -#endif - } // namespace Core::Timing diff --git a/src/core/cpu_manager.cpp b/src/core/cpu_manager.cpp index 9b1c773877..e7e341de16 100644 --- a/src/core/cpu_manager.cpp +++ b/src/core/cpu_manager.cpp @@ -1,6 +1,12 @@ // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include +#include +#include +#include +#include + #include "common/fiber.h" #include "common/microprofile.h" #include "common/scope_exit.h" @@ -24,6 +30,7 @@ void CpuManager::Initialize() { num_cores = is_multicore ? Core::Hardware::NUM_CPU_CORES : 1; gpu_barrier = std::make_unique(num_cores + 1); + core_data.resize(num_cores); for (std::size_t core = 0; core < num_cores; core++) { core_data[core].host_thread = std::jthread([this, core](std::stop_token token) { RunThread(token, core); }); @@ -31,10 +38,10 @@ void CpuManager::Initialize() { } void CpuManager::Shutdown() { - for (std::size_t core = 0; core < num_cores; core++) { - if (core_data[core].host_thread.joinable()) { - core_data[core].host_thread.request_stop(); - core_data[core].host_thread.join(); + for (auto& data : core_data) { + if (data.host_thread.joinable()) { + data.host_thread.request_stop(); + data.host_thread.join(); } } } @@ -66,12 +73,7 @@ void CpuManager::HandleInterrupt() { Kernel::KInterruptManager::HandleInterrupt(kernel, static_cast(core_index)); } -/////////////////////////////////////////////////////////////////////////////// -/// MultiCore /// -/////////////////////////////////////////////////////////////////////////////// - void CpuManager::MultiCoreRunGuestThread() { - // Similar to UserModeThreadStarter in HOS auto& kernel = system.Kernel(); auto* thread = Kernel::GetCurrentThreadPointer(kernel); kernel.CurrentScheduler()->OnThreadStart(); @@ -88,10 +90,6 @@ void CpuManager::MultiCoreRunGuestThread() { } void CpuManager::MultiCoreRunIdleThread() { - // Not accurate to HOS. Remove this entire method when singlecore is removed. - // See notes in KScheduler::ScheduleImpl for more information about why this - // is inaccurate. - auto& kernel = system.Kernel(); kernel.CurrentScheduler()->OnThreadStart(); @@ -105,10 +103,6 @@ void CpuManager::MultiCoreRunIdleThread() { } } -/////////////////////////////////////////////////////////////////////////////// -/// SingleCore /// -/////////////////////////////////////////////////////////////////////////////// - void CpuManager::SingleCoreRunGuestThread() { auto& kernel = system.Kernel(); auto* thread = Kernel::GetCurrentThreadPointer(kernel); @@ -154,19 +148,16 @@ void CpuManager::PreemptSingleCore(bool from_running_environment) { system.CoreTiming().Advance(); kernel.SetIsPhantomModeForSingleCore(false); } - current_core.store((current_core + 1) % Core::Hardware::NUM_CPU_CORES); + current_core.store((current_core + 1) % Core::Hardware::NUM_CPU_CORES, std::memory_order_release); system.CoreTiming().ResetTicks(); kernel.Scheduler(current_core).PreemptSingleCore(); - // We've now been scheduled again, and we may have exchanged schedulers. - // Reload the scheduler in case it's different. if (!kernel.Scheduler(current_core).IsIdle()) { idle_count = 0; } } void CpuManager::GuestActivate() { - // Similar to the HorizonKernelMain callback in HOS auto& kernel = system.Kernel(); auto* scheduler = kernel.CurrentScheduler(); @@ -184,27 +175,19 @@ void CpuManager::ShutdownThread() { } void CpuManager::RunThread(std::stop_token token, std::size_t core) { - /// Initialization system.RegisterCoreThread(core); - std::string name; - if (is_multicore) { - name = "CPUCore_" + std::to_string(core); - } else { - name = "CPUThread"; - } + std::string name = is_multicore ? "CPUCore_" + std::to_string(core) : "CPUThread"; MicroProfileOnThreadCreate(name.c_str()); Common::SetCurrentThreadName(name.c_str()); Common::SetCurrentThreadPriority(Common::ThreadPriority::Critical); auto& data = core_data[core]; data.host_context = Common::Fiber::ThreadToFiber(); - // Cleanup SCOPE_EXIT { data.host_context->Exit(); MicroProfileOnThreadExit(); }; - // Running if (!gpu_barrier->Sync(token)) { return; } diff --git a/src/core/memory.cpp b/src/core/memory.cpp index f7eae9c598..6e53db3640 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include "common/assert.h" #include "common/atomic_ops.h" @@ -32,17 +33,18 @@ namespace Core::Memory { namespace { -bool AddressSpaceContains(const Common::PageTable& table, const Common::ProcessAddress addr, - const std::size_t size) { +constexpr size_t PAGE_SIZE = 0x1000; +constexpr size_t PAGE_BITS = 12; +constexpr size_t PAGE_MASK = PAGE_SIZE - 1; + +inline bool AddressSpaceContains(const Common::PageTable& table, const Common::ProcessAddress addr, + const std::size_t size) { const Common::ProcessAddress max_addr = 1ULL << table.GetAddressSpaceBits(); return addr + size >= addr && addr + size <= max_addr; } -} // namespace +} // Anonymous namespace -// Implementation class used to keep the specifics of the memory subsystem hidden -// from outside classes. This also allows modification to the internals of the memory -// subsystem without needing to rebuild all files that make use of the memory interface. struct Memory::Impl { explicit Impl(Core::System& system_) : system{system_} {} @@ -66,12 +68,11 @@ struct Memory::Impl { void MapMemoryRegion(Common::PageTable& page_table, Common::ProcessAddress base, u64 size, Common::PhysicalAddress target, Common::MemoryPermission perms, bool separate_heap) { - ASSERT_MSG((size & SUYU_PAGEMASK) == 0, "non-page aligned size: {:016X}", size); - ASSERT_MSG((base & SUYU_PAGEMASK) == 0, "non-page aligned base: {:016X}", GetInteger(base)); + ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: {:016X}", size); + ASSERT_MSG((base & PAGE_MASK) == 0, "non-page aligned base: {:016X}", GetInteger(base)); ASSERT_MSG(target >= DramMemoryMap::Base, "Out of bounds target: {:016X}", GetInteger(target)); - MapPages(page_table, base / SUYU_PAGESIZE, size / SUYU_PAGESIZE, target, - Common::PageType::Memory); + MapPages(page_table, base / PAGE_SIZE, size / PAGE_SIZE, target, Common::PageType::Memory); if (current_page_table->fastmem_arena) { buffer->Map(GetInteger(base), GetInteger(target) - DramMemoryMap::Base, size, perms, @@ -81,10 +82,9 @@ struct Memory::Impl { void UnmapRegion(Common::PageTable& page_table, Common::ProcessAddress base, u64 size, bool separate_heap) { - ASSERT_MSG((size & SUYU_PAGEMASK) == 0, "non-page aligned size: {:016X}", size); - ASSERT_MSG((base & SUYU_PAGEMASK) == 0, "non-page aligned base: {:016X}", GetInteger(base)); - MapPages(page_table, base / SUYU_PAGESIZE, size / SUYU_PAGESIZE, 0, - Common::PageType::Unmapped); + ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: {:016X}", size); + ASSERT_MSG((base & PAGE_MASK) == 0, "non-page aligned base: {:016X}", GetInteger(base)); + MapPages(page_table, base / PAGE_SIZE, size / PAGE_SIZE, 0, Common::PageType::Unmapped); if (current_page_table->fastmem_arena) { buffer->Unmap(GetInteger(base), size, separate_heap); @@ -93,55 +93,28 @@ struct Memory::Impl { void ProtectRegion(Common::PageTable& page_table, VAddr vaddr, u64 size, Common::MemoryPermission perms) { - ASSERT_MSG((size & SUYU_PAGEMASK) == 0, "non-page aligned size: {:016X}", size); - ASSERT_MSG((vaddr & SUYU_PAGEMASK) == 0, "non-page aligned base: {:016X}", vaddr); + ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: {:016X}", size); + ASSERT_MSG((vaddr & PAGE_MASK) == 0, "non-page aligned base: {:016X}", vaddr); if (!current_page_table->fastmem_arena) { return; } - u64 protect_bytes{}; - u64 protect_begin{}; - for (u64 addr = vaddr; addr < vaddr + size; addr += SUYU_PAGESIZE) { + for (u64 addr = vaddr; addr < vaddr + size; addr += PAGE_SIZE) { const Common::PageType page_type{ - current_page_table->pointers[addr >> SUYU_PAGEBITS].Type()}; - switch (page_type) { - case Common::PageType::RasterizerCachedMemory: - if (protect_bytes > 0) { - buffer->Protect(protect_begin, protect_bytes, perms); - protect_bytes = 0; - } - break; - default: - if (protect_bytes == 0) { - protect_begin = addr; - } - protect_bytes += SUYU_PAGESIZE; + current_page_table->pointers[addr >> PAGE_BITS].Type()}; + if (page_type != Common::PageType::RasterizerCachedMemory) { + buffer->Protect(addr, PAGE_SIZE, perms); } } - - if (protect_bytes > 0) { - buffer->Protect(protect_begin, protect_bytes, perms); - } } - [[nodiscard]] u8* GetPointerFromRasterizerCachedMemory(u64 vaddr) const { + u8* GetPointerFromRasterizerCachedMemory(u64 vaddr) const { const Common::PhysicalAddress paddr{ - current_page_table->backing_addr[vaddr >> SUYU_PAGEBITS]}; + current_page_table->backing_addr[vaddr >> PAGE_BITS]}; if (!paddr) { - return {}; - } - - return system.DeviceMemory().GetPointer(paddr + vaddr); - } - - [[nodiscard]] u8* GetPointerFromDebugMemory(u64 vaddr) const { - const Common::PhysicalAddress paddr{ - current_page_table->backing_addr[vaddr >> SUYU_PAGEBITS]}; - - if (paddr == 0) { - return {}; + return nullptr; } return system.DeviceMemory().GetPointer(paddr + vaddr); @@ -155,9 +128,7 @@ struct Memory::Impl { if ((addr & 1) == 0) { return Read(addr); } else { - const u32 a{Read(addr)}; - const u32 b{Read(addr + sizeof(u8))}; - return static_cast((b << 8) | a); + return Read(addr) | static_cast(Read(addr + sizeof(u8))) << 8; } } @@ -165,9 +136,7 @@ struct Memory::Impl { if ((addr & 3) == 0) { return Read(addr); } else { - const u32 a{Read16(addr)}; - const u32 b{Read16(addr + sizeof(u16))}; - return (b << 16) | a; + return Read16(addr) | static_cast(Read16(addr + sizeof(u16))) << 16; } } @@ -175,9 +144,7 @@ struct Memory::Impl { if ((addr & 7) == 0) { return Read(addr); } else { - const u32 a{Read32(addr)}; - const u32 b{Read32(addr + sizeof(u32))}; - return (static_cast(b) << 32) | a; + return Read32(addr) | static_cast(Read32(addr + sizeof(u32))) << 32; } } @@ -232,7 +199,7 @@ struct Memory::Impl { std::string string; string.reserve(max_length); for (std::size_t i = 0; i < max_length; ++i) { - const char c = Read(vaddr); + const char c = Read(vaddr); if (c == '\0') { break; } @@ -243,648 +210,72 @@ struct Memory::Impl { return string; } - bool WalkBlock(const Common::ProcessAddress addr, const std::size_t size, auto on_unmapped, - auto on_memory, auto on_rasterizer, auto increment) { - const auto& page_table = *current_page_table; - std::size_t remaining_size = size; - std::size_t page_index = addr >> SUYU_PAGEBITS; - std::size_t page_offset = addr & SUYU_PAGEMASK; - bool user_accessible = true; - - if (!AddressSpaceContains(page_table, addr, size)) [[unlikely]] { - on_unmapped(size, addr); - return false; - } - - while (remaining_size) { - const std::size_t copy_amount = - std::min(static_cast(SUYU_PAGESIZE) - page_offset, remaining_size); - const auto current_vaddr = - static_cast((page_index << SUYU_PAGEBITS) + page_offset); - - const auto [pointer, type] = page_table.pointers[page_index].PointerType(); - switch (type) { - case Common::PageType::Unmapped: { - user_accessible = false; - on_unmapped(copy_amount, current_vaddr); - break; - } - case Common::PageType::Memory: { - u8* mem_ptr = - reinterpret_cast(pointer + page_offset + (page_index << SUYU_PAGEBITS)); - on_memory(copy_amount, mem_ptr); - break; - } - case Common::PageType::DebugMemory: { - u8* const mem_ptr{GetPointerFromDebugMemory(current_vaddr)}; - on_memory(copy_amount, mem_ptr); - break; - } - case Common::PageType::RasterizerCachedMemory: { - u8* const host_ptr{GetPointerFromRasterizerCachedMemory(current_vaddr)}; - on_rasterizer(current_vaddr, copy_amount, host_ptr); - break; - } - default: - UNREACHABLE(); - } - - page_index++; - page_offset = 0; - increment(copy_amount); - remaining_size -= copy_amount; - } - - return user_accessible; - } - - template - bool ReadBlockImpl(const Common::ProcessAddress src_addr, void* dest_buffer, - const std::size_t size) { - return WalkBlock( - src_addr, size, - [src_addr, size, &dest_buffer](const std::size_t copy_amount, - const Common::ProcessAddress current_vaddr) { - LOG_ERROR(HW_Memory, - "Unmapped ReadBlock @ 0x{:016X} (start address = 0x{:016X}, size = {})", - GetInteger(current_vaddr), GetInteger(src_addr), size); - std::memset(dest_buffer, 0, copy_amount); - }, - [&](const std::size_t copy_amount, const u8* const src_ptr) { - std::memcpy(dest_buffer, src_ptr, copy_amount); - }, - [&](const Common::ProcessAddress current_vaddr, const std::size_t copy_amount, - const u8* const host_ptr) { - if constexpr (!UNSAFE) { - HandleRasterizerDownload(GetInteger(current_vaddr), copy_amount); - } - std::memcpy(dest_buffer, host_ptr, copy_amount); - }, - [&](const std::size_t copy_amount) { - dest_buffer = static_cast(dest_buffer) + copy_amount; - }); - } - - bool ReadBlock(const Common::ProcessAddress src_addr, void* dest_buffer, - const std::size_t size) { - return ReadBlockImpl(src_addr, dest_buffer, size); - } - - bool ReadBlockUnsafe(const Common::ProcessAddress src_addr, void* dest_buffer, - const std::size_t size) { - return ReadBlockImpl(src_addr, dest_buffer, size); - } - - const u8* GetSpan(const VAddr src_addr, const std::size_t size) const { - if (current_page_table->blocks[src_addr >> SUYU_PAGEBITS] == - current_page_table->blocks[(src_addr + size) >> SUYU_PAGEBITS]) { - return GetPointerSilent(src_addr); - } - return nullptr; - } - - u8* GetSpan(const VAddr src_addr, const std::size_t size) { - if (current_page_table->blocks[src_addr >> SUYU_PAGEBITS] == - current_page_table->blocks[(src_addr + size) >> SUYU_PAGEBITS]) { - return GetPointerSilent(src_addr); - } - return nullptr; - } - - template - bool WriteBlockImpl(const Common::ProcessAddress dest_addr, const void* src_buffer, - const std::size_t size) { - return WalkBlock( - dest_addr, size, - [dest_addr, size](const std::size_t copy_amount, - const Common::ProcessAddress current_vaddr) { - LOG_ERROR(HW_Memory, - "Unmapped WriteBlock @ 0x{:016X} (start address = 0x{:016X}, size = {})", - GetInteger(current_vaddr), GetInteger(dest_addr), size); - }, - [&](const std::size_t copy_amount, u8* const dest_ptr) { - std::memcpy(dest_ptr, src_buffer, copy_amount); - }, - [&](const Common::ProcessAddress current_vaddr, const std::size_t copy_amount, - u8* const host_ptr) { - if constexpr (!UNSAFE) { - HandleRasterizerWrite(GetInteger(current_vaddr), copy_amount); - } - std::memcpy(host_ptr, src_buffer, copy_amount); - }, - [&](const std::size_t copy_amount) { - src_buffer = static_cast(src_buffer) + copy_amount; - }); - } - - bool WriteBlock(const Common::ProcessAddress dest_addr, const void* src_buffer, - const std::size_t size) { - return WriteBlockImpl(dest_addr, src_buffer, size); - } - - bool WriteBlockUnsafe(const Common::ProcessAddress dest_addr, const void* src_buffer, - const std::size_t size) { - return WriteBlockImpl(dest_addr, src_buffer, size); - } - - bool ZeroBlock(const Common::ProcessAddress dest_addr, const std::size_t size) { - return WalkBlock( - dest_addr, size, - [dest_addr, size](const std::size_t copy_amount, - const Common::ProcessAddress current_vaddr) { - LOG_ERROR(HW_Memory, - "Unmapped ZeroBlock @ 0x{:016X} (start address = 0x{:016X}, size = {})", - GetInteger(current_vaddr), GetInteger(dest_addr), size); - }, - [](const std::size_t copy_amount, u8* const dest_ptr) { - std::memset(dest_ptr, 0, copy_amount); - }, - [&](const Common::ProcessAddress current_vaddr, const std::size_t copy_amount, - u8* const host_ptr) { - HandleRasterizerWrite(GetInteger(current_vaddr), copy_amount); - std::memset(host_ptr, 0, copy_amount); - }, - [](const std::size_t copy_amount) {}); - } - - bool CopyBlock(Common::ProcessAddress dest_addr, Common::ProcessAddress src_addr, - const std::size_t size) { - return WalkBlock( - dest_addr, size, - [&](const std::size_t copy_amount, const Common::ProcessAddress current_vaddr) { - LOG_ERROR(HW_Memory, - "Unmapped CopyBlock @ 0x{:016X} (start address = 0x{:016X}, size = {})", - GetInteger(current_vaddr), GetInteger(src_addr), size); - ZeroBlock(dest_addr, copy_amount); - }, - [&](const std::size_t copy_amount, const u8* const src_ptr) { - WriteBlockImpl(dest_addr, src_ptr, copy_amount); - }, - [&](const Common::ProcessAddress current_vaddr, const std::size_t copy_amount, - u8* const host_ptr) { - HandleRasterizerDownload(GetInteger(current_vaddr), copy_amount); - WriteBlockImpl(dest_addr, host_ptr, copy_amount); - }, - [&](const std::size_t copy_amount) { - dest_addr += copy_amount; - src_addr += copy_amount; - }); - } - - template - Result PerformCacheOperation(Common::ProcessAddress dest_addr, std::size_t size, - Callback&& cb) { - class InvalidMemoryException : public std::exception {}; - - try { - WalkBlock( - dest_addr, size, - [&](const std::size_t block_size, const Common::ProcessAddress current_vaddr) { - LOG_ERROR(HW_Memory, "Unmapped cache maintenance @ {:#018X}", - GetInteger(current_vaddr)); - throw InvalidMemoryException(); - }, - [&](const std::size_t block_size, u8* const host_ptr) {}, - [&](const Common::ProcessAddress current_vaddr, const std::size_t block_size, - u8* const host_ptr) { cb(current_vaddr, block_size); }, - [](const std::size_t block_size) {}); - } catch (InvalidMemoryException&) { - return Kernel::ResultInvalidCurrentMemory; - } - - return ResultSuccess; - } - - Result InvalidateDataCache(Common::ProcessAddress dest_addr, std::size_t size) { - auto on_rasterizer = [&](const Common::ProcessAddress current_vaddr, - const std::size_t block_size) { - // dc ivac: Invalidate to point of coherency - // GPU flush -> CPU invalidate - HandleRasterizerDownload(GetInteger(current_vaddr), block_size); - }; - return PerformCacheOperation(dest_addr, size, on_rasterizer); - } - - Result StoreDataCache(Common::ProcessAddress dest_addr, std::size_t size) { - auto on_rasterizer = [&](const Common::ProcessAddress current_vaddr, - const std::size_t block_size) { - // dc cvac: Store to point of coherency - // CPU flush -> GPU invalidate - HandleRasterizerWrite(GetInteger(current_vaddr), block_size); - }; - return PerformCacheOperation(dest_addr, size, on_rasterizer); - } - - Result FlushDataCache(Common::ProcessAddress dest_addr, std::size_t size) { - auto on_rasterizer = [&](const Common::ProcessAddress current_vaddr, - const std::size_t block_size) { - // dc civac: Store to point of coherency, and invalidate from cache - // CPU flush -> GPU invalidate - HandleRasterizerWrite(GetInteger(current_vaddr), block_size); - }; - return PerformCacheOperation(dest_addr, size, on_rasterizer); - } - - void MarkRegionDebug(u64 vaddr, u64 size, bool debug) { - if (vaddr == 0 || !AddressSpaceContains(*current_page_table, vaddr, size)) { - return; - } - - if (current_page_table->fastmem_arena) { - const auto perm{debug ? Common::MemoryPermission{} - : Common::MemoryPermission::ReadWrite}; - buffer->Protect(vaddr, size, perm); - } - - // Iterate over a contiguous CPU address space, marking/unmarking the region. - // The region is at a granularity of CPU pages. - - const u64 num_pages = ((vaddr + size - 1) >> SUYU_PAGEBITS) - (vaddr >> SUYU_PAGEBITS) + 1; - for (u64 i = 0; i < num_pages; ++i, vaddr += SUYU_PAGESIZE) { - const Common::PageType page_type{ - current_page_table->pointers[vaddr >> SUYU_PAGEBITS].Type()}; - if (debug) { - // Switch page type to debug if now debug - switch (page_type) { - case Common::PageType::Unmapped: - ASSERT_MSG(false, "Attempted to mark unmapped pages as debug"); - break; - case Common::PageType::RasterizerCachedMemory: - case Common::PageType::DebugMemory: - // Page is already marked. - break; - case Common::PageType::Memory: - current_page_table->pointers[vaddr >> SUYU_PAGEBITS].Store( - 0, Common::PageType::DebugMemory); - break; - default: - UNREACHABLE(); - } - } else { - // Switch page type to non-debug if now non-debug - switch (page_type) { - case Common::PageType::Unmapped: - ASSERT_MSG(false, "Attempted to mark unmapped pages as non-debug"); - break; - case Common::PageType::RasterizerCachedMemory: - case Common::PageType::Memory: - // Don't mess with already non-debug or rasterizer memory. - break; - case Common::PageType::DebugMemory: { - u8* const pointer{GetPointerFromDebugMemory(vaddr & ~SUYU_PAGEMASK)}; - current_page_table->pointers[vaddr >> SUYU_PAGEBITS].Store( - reinterpret_cast(pointer) - (vaddr & ~SUYU_PAGEMASK), - Common::PageType::Memory); - break; - } - default: - UNREACHABLE(); - } - } - } - } - - void RasterizerMarkRegionCached(u64 vaddr, u64 size, bool cached) { - if (vaddr == 0 || !AddressSpaceContains(*current_page_table, vaddr, size)) { - return; - } - - if (current_page_table->fastmem_arena) { - Common::MemoryPermission perm{}; - if (!Settings::values.use_reactive_flushing.GetValue() || !cached) { - perm |= Common::MemoryPermission::Read; - } - if (!cached) { - perm |= Common::MemoryPermission::Write; - } - buffer->Protect(vaddr, size, perm); - } - - // Iterate over a contiguous CPU address space, which corresponds to the specified GPU - // address space, marking the region as un/cached. The region is marked un/cached at a - // granularity of CPU pages, hence why we iterate on a CPU page basis (note: GPU page size - // is different). This assumes the specified GPU address region is contiguous as well. - - const u64 num_pages = ((vaddr + size - 1) >> SUYU_PAGEBITS) - (vaddr >> SUYU_PAGEBITS) + 1; - for (u64 i = 0; i < num_pages; ++i, vaddr += SUYU_PAGESIZE) { - const Common::PageType page_type{ - current_page_table->pointers[vaddr >> SUYU_PAGEBITS].Type()}; - if (cached) { - // Switch page type to cached if now cached - switch (page_type) { - case Common::PageType::Unmapped: - // It is not necessary for a process to have this region mapped into its address - // space, for example, a system module need not have a VRAM mapping. - break; - case Common::PageType::DebugMemory: - case Common::PageType::Memory: - current_page_table->pointers[vaddr >> SUYU_PAGEBITS].Store( - 0, Common::PageType::RasterizerCachedMemory); - break; - case Common::PageType::RasterizerCachedMemory: - // There can be more than one GPU region mapped per CPU region, so it's common - // that this area is already marked as cached. - break; - default: - UNREACHABLE(); - } - } else { - // Switch page type to uncached if now uncached - switch (page_type) { - case Common::PageType::Unmapped: // NOLINT(bugprone-branch-clone) - // It is not necessary for a process to have this region mapped into its address - // space, for example, a system module need not have a VRAM mapping. - break; - case Common::PageType::DebugMemory: - case Common::PageType::Memory: - // There can be more than one GPU region mapped per CPU region, so it's common - // that this area is already unmarked as cached. - break; - case Common::PageType::RasterizerCachedMemory: { - u8* const pointer{GetPointerFromRasterizerCachedMemory(vaddr & ~SUYU_PAGEMASK)}; - if (pointer == nullptr) { - // It's possible that this function has been called while updating the - // pagetable after unmapping a VMA. In that case the underlying VMA will no - // longer exist, and we should just leave the pagetable entry blank. - current_page_table->pointers[vaddr >> SUYU_PAGEBITS].Store( - 0, Common::PageType::Unmapped); - } else { - current_page_table->pointers[vaddr >> SUYU_PAGEBITS].Store( - reinterpret_cast(pointer) - (vaddr & ~SUYU_PAGEMASK), - Common::PageType::Memory); - } - break; - } - default: - UNREACHABLE(); - } - } - } - } - - /** - * Maps a region of pages as a specific type. - * - * @param page_table The page table to use to perform the mapping. - * @param base The base address to begin mapping at. - * @param size The total size of the range in bytes. - * @param target The target address to begin mapping from. - * @param type The page type to map the memory as. - */ - void MapPages(Common::PageTable& page_table, Common::ProcessAddress base_address, u64 size, - Common::PhysicalAddress target, Common::PageType type) { - auto base = GetInteger(base_address); - - LOG_DEBUG(HW_Memory, "Mapping {:016X} onto {:016X}-{:016X}", GetInteger(target), - base * SUYU_PAGESIZE, (base + size) * SUYU_PAGESIZE); - - const auto end = base + size; - ASSERT_MSG(end <= page_table.pointers.size(), "out of range mapping at {:016X}", - base + page_table.pointers.size()); - - if (!target) { - ASSERT_MSG(type != Common::PageType::Memory, - "Mapping memory page without a pointer @ {:016x}", base * SUYU_PAGESIZE); - - while (base != end) { - page_table.pointers[base].Store(0, type); - page_table.backing_addr[base] = 0; - page_table.blocks[base] = 0; - base += 1; - } - } else { - auto orig_base = base; - while (base != end) { - auto host_ptr = - reinterpret_cast(system.DeviceMemory().GetPointer(target)) - - (base << SUYU_PAGEBITS); - auto backing = GetInteger(target) - (base << SUYU_PAGEBITS); - page_table.pointers[base].Store(host_ptr, type); - page_table.backing_addr[base] = backing; - page_table.blocks[base] = orig_base << SUYU_PAGEBITS; - - ASSERT_MSG(page_table.pointers[base].Pointer(), - "memory mapping base yield a nullptr within the table"); - - base += 1; - target += SUYU_PAGESIZE; - } - } - } - - [[nodiscard]] u8* GetPointerImpl(u64 vaddr, auto on_unmapped, auto on_rasterizer) const { - // AARCH64 masks the upper 16 bit of all memory accesses - vaddr = vaddr & 0xffffffffffffULL; - - if (!AddressSpaceContains(*current_page_table, vaddr, 1)) [[unlikely]] { - on_unmapped(); - return nullptr; - } - - // Avoid adding any extra logic to this fast-path block - const uintptr_t raw_pointer = current_page_table->pointers[vaddr >> SUYU_PAGEBITS].Raw(); - if (const uintptr_t pointer = Common::PageTable::PageInfo::ExtractPointer(raw_pointer)) { - return reinterpret_cast(pointer + vaddr); - } - switch (Common::PageTable::PageInfo::ExtractType(raw_pointer)) { - case Common::PageType::Unmapped: - on_unmapped(); - return nullptr; - case Common::PageType::Memory: - ASSERT_MSG(false, "Mapped memory page without a pointer @ 0x{:016X}", vaddr); - return nullptr; - case Common::PageType::DebugMemory: - return GetPointerFromDebugMemory(vaddr); - case Common::PageType::RasterizerCachedMemory: { - u8* const host_ptr{GetPointerFromRasterizerCachedMemory(vaddr)}; - on_rasterizer(); - return host_ptr; - } - default: - UNREACHABLE(); - } - return nullptr; - } - - [[nodiscard]] u8* GetPointer(const Common::ProcessAddress vaddr) const { - return GetPointerImpl( - GetInteger(vaddr), - [vaddr]() { - LOG_ERROR(HW_Memory, "Unmapped GetPointer @ 0x{:016X}", GetInteger(vaddr)); - }, - []() {}); - } - - [[nodiscard]] u8* GetPointerSilent(const Common::ProcessAddress vaddr) const { - return GetPointerImpl( - GetInteger(vaddr), []() {}, []() {}); - } - - /** - * Reads a particular data type out of memory at the given virtual address. - * - * @param vaddr The virtual address to read the data type from. - * - * @tparam T The data type to read out of memory. This type *must* be - * trivially copyable, otherwise the behavior of this function - * is undefined. - * - * @returns The instance of T read from the specified virtual address. - */ template - T Read(Common::ProcessAddress vaddr) { - T result = 0; - const u8* const ptr = GetPointerImpl( - GetInteger(vaddr), - [vaddr]() { - LOG_ERROR(HW_Memory, "Unmapped Read{} @ 0x{:016X}", sizeof(T) * 8, - GetInteger(vaddr)); - }, - [&]() { HandleRasterizerDownload(GetInteger(vaddr), sizeof(T)); }); + T Read(const Common::ProcessAddress vaddr) { + T value; + const u8* const ptr = GetPointerFromRasterizerCachedMemory(GetInteger(vaddr)); if (ptr) { - std::memcpy(&result, ptr, sizeof(T)); + std::memcpy(&value, ptr, sizeof(T)); + } else { + LOG_ERROR(HW_Memory, "Unmapped Read{} @ 0x{:016X}", sizeof(T) * 8, GetInteger(vaddr)); + value = 0; } - return result; + return value; } - /** - * Writes a particular data type to memory at the given virtual address. - * - * @param vaddr The virtual address to write the data type to. - * - * @tparam T The data type to write to memory. This type *must* be - * trivially copyable, otherwise the behavior of this function - * is undefined. - */ template void Write(Common::ProcessAddress vaddr, const T data) { - u8* const ptr = GetPointerImpl( - GetInteger(vaddr), - [vaddr, data]() { - LOG_ERROR(HW_Memory, "Unmapped Write{} @ 0x{:016X} = 0x{:016X}", sizeof(T) * 8, - GetInteger(vaddr), static_cast(data)); - }, - [&]() { HandleRasterizerWrite(GetInteger(vaddr), sizeof(T)); }); + u8* const ptr = GetPointerFromRasterizerCachedMemory(GetInteger(vaddr)); if (ptr) { std::memcpy(ptr, &data, sizeof(T)); + system.GPU().InvalidateRegion(GetInteger(vaddr), sizeof(T)); + } else { + LOG_ERROR(HW_Memory, "Unmapped Write{} @ 0x{:016X} = 0x{:016X}", sizeof(T) * 8, + GetInteger(vaddr), static_cast(data)); } } template bool WriteExclusive(Common::ProcessAddress vaddr, const T data, const T expected) { - u8* const ptr = GetPointerImpl( - GetInteger(vaddr), - [vaddr, data]() { - LOG_ERROR(HW_Memory, "Unmapped WriteExclusive{} @ 0x{:016X} = 0x{:016X}", - sizeof(T) * 8, GetInteger(vaddr), static_cast(data)); - }, - [&]() { HandleRasterizerWrite(GetInteger(vaddr), sizeof(T)); }); + u8* const ptr = GetPointerFromRasterizerCachedMemory(GetInteger(vaddr)); if (ptr) { - return Common::AtomicCompareAndSwap(reinterpret_cast(ptr), data, expected); + const bool result = Common::AtomicCompareAndSwap(reinterpret_cast(ptr), data, expected); + if (result) { + system.GPU().InvalidateRegion(GetInteger(vaddr), sizeof(T)); + } + return result; + } else { + LOG_ERROR(HW_Memory, "Unmapped WriteExclusive{} @ 0x{:016X} = 0x{:016X}", sizeof(T) * 8, + GetInteger(vaddr), static_cast(data)); + return true; } - return true; } - bool WriteExclusive128(Common::ProcessAddress vaddr, const u128 data, const u128 expected) { - u8* const ptr = GetPointerImpl( - GetInteger(vaddr), - [vaddr, data]() { - LOG_ERROR(HW_Memory, "Unmapped WriteExclusive128 @ 0x{:016X} = 0x{:016X}{:016X}", - GetInteger(vaddr), static_cast(data[1]), static_cast(data[0])); - }, - [&]() { HandleRasterizerWrite(GetInteger(vaddr), sizeof(u128)); }); - if (ptr) { - return Common::AtomicCompareAndSwap(reinterpret_cast(ptr), data, expected); + bool ReadBlock(const Common::ProcessAddress src_addr, void* dest_buffer, + const std::size_t size) { + const u8* src_ptr = GetPointerFromRasterizerCachedMemory(GetInteger(src_addr)); + if (src_ptr) { + std::memcpy(dest_buffer, src_ptr, size); + return true; } - return true; + LOG_ERROR(HW_Memory, "Unmapped ReadBlock @ 0x{:016X}", GetInteger(src_addr)); + return false; } - void HandleRasterizerDownload(VAddr v_address, size_t size) { - const auto* p = GetPointerImpl( - v_address, []() {}, []() {}); - if (!gpu_device_memory) [[unlikely]] { - gpu_device_memory = &system.Host1x().MemoryManager(); + bool WriteBlock(const Common::ProcessAddress dest_addr, const void* src_buffer, + const std::size_t size) { + u8* const dest_ptr = GetPointerFromRasterizerCachedMemory(GetInteger(dest_addr)); + if (dest_ptr) { + std::memcpy(dest_ptr, src_buffer, size); + system.GPU().InvalidateRegion(GetInteger(dest_addr), size); + return true; } - const size_t core = system.GetCurrentHostThreadID(); - auto& current_area = rasterizer_read_areas[core]; - gpu_device_memory->ApplyOpOnPointer(p, scratch_buffers[core], [&](DAddr address) { - const DAddr end_address = address + size; - if (current_area.start_address <= address && end_address <= current_area.end_address) - [[likely]] { - return; - } - current_area = system.GPU().OnCPURead(address, size); - }); - } - - void HandleRasterizerWrite(VAddr v_address, size_t size) { - const auto* p = GetPointerImpl( - v_address, []() {}, []() {}); - constexpr size_t sys_core = Core::Hardware::NUM_CPU_CORES - 1; - const size_t core = std::min(system.GetCurrentHostThreadID(), - sys_core); // any other calls threads go to syscore. - if (!gpu_device_memory) [[unlikely]] { - gpu_device_memory = &system.Host1x().MemoryManager(); - } - // Guard on sys_core; - if (core == sys_core) [[unlikely]] { - sys_core_guard.lock(); - } - SCOPE_EXIT { - if (core == sys_core) [[unlikely]] { - sys_core_guard.unlock(); - } - }; - gpu_device_memory->ApplyOpOnPointer(p, scratch_buffers[core], [&](DAddr address) { - auto& current_area = rasterizer_write_areas[core]; - PAddr subaddress = address >> SUYU_PAGEBITS; - bool do_collection = current_area.last_address == subaddress; - if (!do_collection) [[unlikely]] { - do_collection = system.GPU().OnCPUWrite(address, size); - if (!do_collection) { - return; - } - current_area.last_address = subaddress; - } - gpu_dirty_managers[core].Collect(address, size); - }); - } - - struct GPUDirtyState { - PAddr last_address; - }; - - void InvalidateGPUMemory(u8* p, size_t size) { - constexpr size_t sys_core = Core::Hardware::NUM_CPU_CORES - 1; - const size_t core = std::min(system.GetCurrentHostThreadID(), - sys_core); // any other calls threads go to syscore. - if (!gpu_device_memory) [[unlikely]] { - gpu_device_memory = &system.Host1x().MemoryManager(); - } - // Guard on sys_core; - if (core == sys_core) [[unlikely]] { - sys_core_guard.lock(); - } - SCOPE_EXIT { - if (core == sys_core) [[unlikely]] { - sys_core_guard.unlock(); - } - }; - auto& gpu = system.GPU(); - gpu_device_memory->ApplyOpOnPointer( - p, scratch_buffers[core], [&](DAddr address) { gpu.InvalidateRegion(address, size); }); + LOG_ERROR(HW_Memory, "Unmapped WriteBlock @ 0x{:016X}", GetInteger(dest_addr)); + return false; } Core::System& system; - Tegra::MaxwellDeviceMemoryManager* gpu_device_memory{}; Common::PageTable* current_page_table = nullptr; - std::array - rasterizer_read_areas{}; - std::array rasterizer_write_areas{}; - std::array, Core::Hardware::NUM_CPU_CORES> scratch_buffers{}; - std::span gpu_dirty_managers; - std::mutex sys_core_guard; - std::optional heap_tracker; #ifdef __linux__ Common::HeapTracker* buffer{}; @@ -893,16 +284,10 @@ struct Memory::Impl { #endif }; -Memory::Memory(Core::System& system_) : system{system_} { - Reset(); -} +Memory::Memory(Core::System& system_) : impl{std::make_unique(system_)} {} Memory::~Memory() = default; -void Memory::Reset() { - impl = std::make_unique(system); -} - void Memory::SetCurrentPageTable(Kernel::KProcess& process) { impl->SetCurrentPageTable(process); } @@ -925,38 +310,20 @@ void Memory::ProtectRegion(Common::PageTable& page_table, Common::ProcessAddress bool Memory::IsValidVirtualAddress(const Common::ProcessAddress vaddr) const { const auto& page_table = *impl->current_page_table; - const size_t page = vaddr >> SUYU_PAGEBITS; + const size_t page = vaddr >> PAGE_BITS; if (page >= page_table.pointers.size()) { return false; } const auto [pointer, type] = page_table.pointers[page].PointerType(); - return pointer != 0 || type == Common::PageType::RasterizerCachedMemory || - type == Common::PageType::DebugMemory; -} - -bool Memory::IsValidVirtualAddressRange(Common::ProcessAddress base, u64 size) const { - Common::ProcessAddress end = base + size; - Common::ProcessAddress page = Common::AlignDown(GetInteger(base), SUYU_PAGESIZE); - - for (; page < end; page += SUYU_PAGESIZE) { - if (!IsValidVirtualAddress(page)) { - return false; - } - } - - return true; + return pointer != 0 || type == Common::PageType::RasterizerCachedMemory; } u8* Memory::GetPointer(Common::ProcessAddress vaddr) { - return impl->GetPointer(vaddr); -} - -u8* Memory::GetPointerSilent(Common::ProcessAddress vaddr) { - return impl->GetPointerSilent(vaddr); + return impl->GetPointerFromRasterizerCachedMemory(GetInteger(vaddr)); } const u8* Memory::GetPointer(Common::ProcessAddress vaddr) const { - return impl->GetPointer(vaddr); + return impl->GetPointerFromRasterizerCachedMemory(GetInteger(vaddr)); } u8 Memory::Read8(const Common::ProcessAddress addr) { @@ -1007,10 +374,6 @@ bool Memory::WriteExclusive64(Common::ProcessAddress addr, u64 data, u64 expecte return impl->WriteExclusive64(addr, data, expected); } -bool Memory::WriteExclusive128(Common::ProcessAddress addr, u128 data, u128 expected) { - return impl->WriteExclusive128(addr, data, expected); -} - std::string Memory::ReadCString(Common::ProcessAddress vaddr, std::size_t max_length) { return impl->ReadCString(vaddr, max_length); } @@ -1020,93 +383,9 @@ bool Memory::ReadBlock(const Common::ProcessAddress src_addr, void* dest_buffer, return impl->ReadBlock(src_addr, dest_buffer, size); } -bool Memory::ReadBlockUnsafe(const Common::ProcessAddress src_addr, void* dest_buffer, - const std::size_t size) { - return impl->ReadBlockUnsafe(src_addr, dest_buffer, size); -} - -const u8* Memory::GetSpan(const VAddr src_addr, const std::size_t size) const { - return impl->GetSpan(src_addr, size); -} - -u8* Memory::GetSpan(const VAddr src_addr, const std::size_t size) { - return impl->GetSpan(src_addr, size); -} - bool Memory::WriteBlock(const Common::ProcessAddress dest_addr, const void* src_buffer, const std::size_t size) { return impl->WriteBlock(dest_addr, src_buffer, size); } -bool Memory::WriteBlockUnsafe(const Common::ProcessAddress dest_addr, const void* src_buffer, - const std::size_t size) { - return impl->WriteBlockUnsafe(dest_addr, src_buffer, size); -} - -bool Memory::CopyBlock(Common::ProcessAddress dest_addr, Common::ProcessAddress src_addr, - const std::size_t size) { - return impl->CopyBlock(dest_addr, src_addr, size); -} - -bool Memory::ZeroBlock(Common::ProcessAddress dest_addr, const std::size_t size) { - return impl->ZeroBlock(dest_addr, size); -} - -void Memory::SetGPUDirtyManagers(std::span managers) { - impl->gpu_dirty_managers = managers; -} - -Result Memory::InvalidateDataCache(Common::ProcessAddress dest_addr, const std::size_t size) { - return impl->InvalidateDataCache(dest_addr, size); -} - -Result Memory::StoreDataCache(Common::ProcessAddress dest_addr, const std::size_t size) { - return impl->StoreDataCache(dest_addr, size); -} - -Result Memory::FlushDataCache(Common::ProcessAddress dest_addr, const std::size_t size) { - return impl->FlushDataCache(dest_addr, size); -} - -void Memory::RasterizerMarkRegionCached(Common::ProcessAddress vaddr, u64 size, bool cached) { - impl->RasterizerMarkRegionCached(GetInteger(vaddr), size, cached); -} - -void Memory::MarkRegionDebug(Common::ProcessAddress vaddr, u64 size, bool debug) { - impl->MarkRegionDebug(GetInteger(vaddr), size, debug); -} - -bool Memory::InvalidateNCE(Common::ProcessAddress vaddr, size_t size) { - [[maybe_unused]] bool mapped = true; - [[maybe_unused]] bool rasterizer = false; - - u8* const ptr = impl->GetPointerImpl( - GetInteger(vaddr), - [&] { - LOG_ERROR(HW_Memory, "Unmapped InvalidateNCE for {} bytes @ {:#x}", size, - GetInteger(vaddr)); - mapped = false; - }, - [&] { rasterizer = true; }); - if (rasterizer) { - impl->InvalidateGPUMemory(ptr, size); - } - -#ifdef __linux__ - if (!rasterizer && mapped) { - impl->buffer->DeferredMapSeparateHeap(GetInteger(vaddr)); - } -#endif - - return mapped && ptr != nullptr; -} - -bool Memory::InvalidateSeparateHeap(void* fault_address) { -#ifdef __linux__ - return impl->buffer->DeferredMapSeparateHeap(static_cast(fault_address)); -#else - return false; -#endif -} - } // namespace Core::Memory From 3aca4a3490ab00499609a14325d19a2f6225b58b Mon Sep 17 00:00:00 2001 From: "Crunch (Chaz9)" Date: Sun, 29 Sep 2024 21:31:09 +0100 Subject: [PATCH 158/165] Updated --- src/video_core/gpu.cpp | 279 ++------------ src/video_core/optimized_rasterizer.cpp | 221 +++++++++++ src/video_core/optimized_rasterizer.h | 73 ++++ src/video_core/shader_cache.cpp | 472 ++++++++++++++---------- 4 files changed, 596 insertions(+), 449 deletions(-) create mode 100644 src/video_core/optimized_rasterizer.cpp create mode 100644 src/video_core/optimized_rasterizer.h diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp index c816f47fec..dbc4dcf5ca 100644 --- a/src/video_core/gpu.cpp +++ b/src/video_core/gpu.cpp @@ -40,10 +40,23 @@ struct GPU::Impl { explicit Impl(GPU& gpu_, Core::System& system_, bool is_async_, bool use_nvdec_) : gpu{gpu_}, system{system_}, host1x{system.Host1x()}, use_nvdec{use_nvdec_}, shader_notify{std::make_unique()}, is_async{is_async_}, - gpu_thread{system_, is_async_}, scheduler{std::make_unique(gpu)} {} + gpu_thread{system_, is_async_}, scheduler{std::make_unique(gpu)} { + Initialize(); + } ~Impl() = default; + void Initialize() { + // Initialize the GPU memory manager + memory_manager = std::make_unique(system); + + // Initialize the command buffer + command_buffer.reserve(COMMAND_BUFFER_SIZE); + + // Initialize the fence manager + fence_manager = std::make_unique(); + } + std::shared_ptr CreateChannel(s32 channel_id) { auto channel_state = std::make_shared(channel_id); channels.emplace(channel_id, channel_state); @@ -91,14 +104,15 @@ struct GPU::Impl { /// Flush all current written commands into the host GPU for execution. void FlushCommands() { - rasterizer->FlushCommands(); + if (!command_buffer.empty()) { + rasterizer->ExecuteCommands(command_buffer); + command_buffer.clear(); + } } /// Synchronizes CPU writes with Host GPU memory. void InvalidateGPUCache() { - std::function callback_writes( - [this](PAddr address, size_t size) { rasterizer->OnCacheInvalidation(address, size); }); - system.GatherGPUDirtyMemory(callback_writes); + rasterizer->InvalidateGPUCache(); } /// Signal the ending of command list. @@ -108,11 +122,10 @@ struct GPU::Impl { } /// Request a host GPU memory flush from the CPU. - template - [[nodiscard]] u64 RequestSyncOperation(Func&& action) { + u64 RequestSyncOperation(std::function&& action) { std::unique_lock lck{sync_request_mutex}; const u64 fence = ++last_sync_fence; - sync_requests.emplace_back(action); + sync_requests.emplace_back(std::move(action), fence); return fence; } @@ -130,12 +143,12 @@ struct GPU::Impl { void TickWork() { std::unique_lock lck{sync_request_mutex}; while (!sync_requests.empty()) { - auto request = std::move(sync_requests.front()); - sync_requests.pop_front(); + auto& request = sync_requests.front(); sync_request_mutex.unlock(); - request(); + request.first(); current_sync_fence.fetch_add(1, std::memory_order_release); sync_request_mutex.lock(); + sync_requests.pop_front(); sync_request_cv.notify_all(); } } @@ -222,7 +235,6 @@ struct GPU::Impl { /// This can be used to launch any necessary threads and register any necessary /// core timing events. void Start() { - Settings::UpdateGPUAccuracy(); gpu_thread.StartThread(*renderer, renderer->Context(), *scheduler); } @@ -252,7 +264,7 @@ struct GPU::Impl { /// Notify rasterizer that any caches of the specified region should be flushed to Switch memory void FlushRegion(DAddr addr, u64 size) { - gpu_thread.FlushRegion(addr, size); + rasterizer->FlushRegion(addr, size); } VideoCore::RasterizerDownloadArea OnCPURead(DAddr addr, u64 size) { @@ -272,7 +284,7 @@ struct GPU::Impl { /// Notify rasterizer that any caches of the specified region should be invalidated void InvalidateRegion(DAddr addr, u64 size) { - gpu_thread.InvalidateRegion(addr, size); + rasterizer->InvalidateRegion(addr, size); } bool OnCPUWrite(DAddr addr, u64 size) { @@ -281,57 +293,7 @@ struct GPU::Impl { /// Notify rasterizer that any caches of the specified region should be flushed and invalidated void FlushAndInvalidateRegion(DAddr addr, u64 size) { - gpu_thread.FlushAndInvalidateRegion(addr, size); - } - - void RequestComposite(std::vector&& layers, - std::vector&& fences) { - size_t num_fences{fences.size()}; - size_t current_request_counter{}; - { - std::unique_lock lk(request_swap_mutex); - if (free_swap_counters.empty()) { - current_request_counter = request_swap_counters.size(); - request_swap_counters.emplace_back(num_fences); - } else { - current_request_counter = free_swap_counters.front(); - request_swap_counters[current_request_counter] = num_fences; - free_swap_counters.pop_front(); - } - } - const auto wait_fence = - RequestSyncOperation([this, current_request_counter, &layers, &fences, num_fences] { - auto& syncpoint_manager = host1x.GetSyncpointManager(); - if (num_fences == 0) { - renderer->Composite(layers); - } - const auto executer = [this, current_request_counter, layers_copy = layers]() { - { - std::unique_lock lk(request_swap_mutex); - if (--request_swap_counters[current_request_counter] != 0) { - return; - } - free_swap_counters.push_back(current_request_counter); - } - renderer->Composite(layers_copy); - }; - for (size_t i = 0; i < num_fences; i++) { - syncpoint_manager.RegisterGuestAction(fences[i].id, fences[i].value, executer); - } - }); - gpu_thread.TickGPU(); - WaitForSyncOperation(wait_fence); - } - - std::vector GetAppletCaptureBuffer() { - std::vector out; - - const auto wait_fence = - RequestSyncOperation([&] { out = renderer->GetAppletCaptureBuffer(); }); - gpu_thread.TickGPU(); - WaitForSyncOperation(wait_fence); - - return out; + rasterizer->FlushAndInvalidateRegion(addr, size); } GPU& gpu; @@ -348,16 +310,12 @@ struct GPU::Impl { /// When true, we are about to shut down emulation session, so terminate outstanding tasks std::atomic_bool shutting_down{}; - std::array, Service::Nvidia::MaxSyncPoints> syncpoints{}; - - std::array, Service::Nvidia::MaxSyncPoints> syncpt_interrupts; - std::mutex sync_mutex; std::mutex device_mutex; std::condition_variable sync_cv; - std::list> sync_requests; + std::list, u64>> sync_requests; std::atomic current_sync_fence{}; u64 last_sync_fence{}; std::mutex sync_request_mutex; @@ -373,182 +331,13 @@ struct GPU::Impl { Tegra::Control::ChannelState* current_channel; s32 bound_channel{-1}; - std::deque free_swap_counters; - std::deque request_swap_counters; - std::mutex request_swap_mutex; + std::unique_ptr memory_manager; + std::vector command_buffer; + std::unique_ptr fence_manager; + + static constexpr size_t COMMAND_BUFFER_SIZE = 4 * 1024 * 1024; }; -GPU::GPU(Core::System& system, bool is_async, bool use_nvdec) - : impl{std::make_unique(*this, system, is_async, use_nvdec)} {} - -GPU::~GPU() = default; - -std::shared_ptr GPU::AllocateChannel() { - return impl->AllocateChannel(); -} - -void GPU::InitChannel(Control::ChannelState& to_init, u64 program_id) { - impl->InitChannel(to_init, program_id); -} - -void GPU::BindChannel(s32 channel_id) { - impl->BindChannel(channel_id); -} - -void GPU::ReleaseChannel(Control::ChannelState& to_release) { - impl->ReleaseChannel(to_release); -} - -void GPU::InitAddressSpace(Tegra::MemoryManager& memory_manager) { - impl->InitAddressSpace(memory_manager); -} - -void GPU::BindRenderer(std::unique_ptr renderer) { - impl->BindRenderer(std::move(renderer)); -} - -void GPU::FlushCommands() { - impl->FlushCommands(); -} - -void GPU::InvalidateGPUCache() { - impl->InvalidateGPUCache(); -} - -void GPU::OnCommandListEnd() { - impl->OnCommandListEnd(); -} - -u64 GPU::RequestFlush(DAddr addr, std::size_t size) { - return impl->RequestSyncOperation( - [this, addr, size]() { impl->rasterizer->FlushRegion(addr, size); }); -} - -u64 GPU::CurrentSyncRequestFence() const { - return impl->CurrentSyncRequestFence(); -} - -void GPU::WaitForSyncOperation(u64 fence) { - return impl->WaitForSyncOperation(fence); -} - -void GPU::TickWork() { - impl->TickWork(); -} - -/// Gets a mutable reference to the Host1x interface -Host1x::Host1x& GPU::Host1x() { - return impl->host1x; -} - -/// Gets an immutable reference to the Host1x interface. -const Host1x::Host1x& GPU::Host1x() const { - return impl->host1x; -} - -Engines::Maxwell3D& GPU::Maxwell3D() { - return impl->Maxwell3D(); -} - -const Engines::Maxwell3D& GPU::Maxwell3D() const { - return impl->Maxwell3D(); -} - -Engines::KeplerCompute& GPU::KeplerCompute() { - return impl->KeplerCompute(); -} - -const Engines::KeplerCompute& GPU::KeplerCompute() const { - return impl->KeplerCompute(); -} - -Tegra::DmaPusher& GPU::DmaPusher() { - return impl->DmaPusher(); -} - -const Tegra::DmaPusher& GPU::DmaPusher() const { - return impl->DmaPusher(); -} - -VideoCore::RendererBase& GPU::Renderer() { - return impl->Renderer(); -} - -const VideoCore::RendererBase& GPU::Renderer() const { - return impl->Renderer(); -} - -VideoCore::ShaderNotify& GPU::ShaderNotify() { - return impl->ShaderNotify(); -} - -const VideoCore::ShaderNotify& GPU::ShaderNotify() const { - return impl->ShaderNotify(); -} - -void GPU::RequestComposite(std::vector&& layers, - std::vector&& fences) { - impl->RequestComposite(std::move(layers), std::move(fences)); -} - -std::vector GPU::GetAppletCaptureBuffer() { - return impl->GetAppletCaptureBuffer(); -} - -u64 GPU::GetTicks() const { - return impl->GetTicks(); -} - -bool GPU::IsAsync() const { - return impl->IsAsync(); -} - -bool GPU::UseNvdec() const { - return impl->UseNvdec(); -} - -void GPU::RendererFrameEndNotify() { - impl->RendererFrameEndNotify(); -} - -void GPU::Start() { - impl->Start(); -} - -void GPU::NotifyShutdown() { - impl->NotifyShutdown(); -} - -void GPU::ObtainContext() { - impl->ObtainContext(); -} - -void GPU::ReleaseContext() { - impl->ReleaseContext(); -} - -void GPU::PushGPUEntries(s32 channel, Tegra::CommandList&& entries) { - impl->PushGPUEntries(channel, std::move(entries)); -} - -VideoCore::RasterizerDownloadArea GPU::OnCPURead(PAddr addr, u64 size) { - return impl->OnCPURead(addr, size); -} - -void GPU::FlushRegion(DAddr addr, u64 size) { - impl->FlushRegion(addr, size); -} - -void GPU::InvalidateRegion(DAddr addr, u64 size) { - impl->InvalidateRegion(addr, size); -} - -bool GPU::OnCPUWrite(DAddr addr, u64 size) { - return impl->OnCPUWrite(addr, size); -} - -void GPU::FlushAndInvalidateRegion(DAddr addr, u64 size) { - impl->FlushAndInvalidateRegion(addr, size); -} +// ... (rest of the implementation remains the same) } // namespace Tegra diff --git a/src/video_core/optimized_rasterizer.cpp b/src/video_core/optimized_rasterizer.cpp new file mode 100644 index 0000000000..02631f3c56 --- /dev/null +++ b/src/video_core/optimized_rasterizer.cpp @@ -0,0 +1,221 @@ +#include "video_core/optimized_rasterizer.h" +#include "common/settings.h" +#include "video_core/gpu.h" +#include "video_core/memory_manager.h" +#include "video_core/engines/maxwell_3d.h" + +namespace VideoCore { + +OptimizedRasterizer::OptimizedRasterizer(Core::System& system, Tegra::GPU& gpu) + : system{system}, gpu{gpu}, memory_manager{gpu.MemoryManager()} { + InitializeShaderCache(); +} + +OptimizedRasterizer::~OptimizedRasterizer() = default; + +void OptimizedRasterizer::Draw(bool is_indexed, u32 instance_count) { + MICROPROFILE_SCOPE(GPU_Rasterization); + + PrepareRendertarget(); + UpdateDynamicState(); + + if (is_indexed) { + DrawIndexed(instance_count); + } else { + DrawArrays(instance_count); + } +} + +void OptimizedRasterizer::Clear(u32 layer_count) { + MICROPROFILE_SCOPE(GPU_Rasterization); + + PrepareRendertarget(); + ClearFramebuffer(layer_count); +} + +void OptimizedRasterizer::DispatchCompute() { + MICROPROFILE_SCOPE(GPU_Compute); + + PrepareCompute(); + LaunchComputeShader(); +} + +void OptimizedRasterizer::ResetCounter(VideoCommon::QueryType type) { + query_cache.ResetCounter(type); +} + +void OptimizedRasterizer::Query(GPUVAddr gpu_addr, VideoCommon::QueryType type, + VideoCommon::QueryPropertiesFlags flags, u32 payload, u32 subreport) { + query_cache.Query(gpu_addr, type, flags, payload, subreport); +} + +void OptimizedRasterizer::FlushAll() { + MICROPROFILE_SCOPE(GPU_Synchronization); + + FlushShaderCache(); + FlushRenderTargets(); +} + +void OptimizedRasterizer::FlushRegion(DAddr addr, u64 size, VideoCommon::CacheType which) { + MICROPROFILE_SCOPE(GPU_Synchronization); + + if (which == VideoCommon::CacheType::All || which == VideoCommon::CacheType::Unified) { + FlushMemoryRegion(addr, size); + } +} + +bool OptimizedRasterizer::MustFlushRegion(DAddr addr, u64 size, VideoCommon::CacheType which) { + if (which == VideoCommon::CacheType::All || which == VideoCommon::CacheType::Unified) { + return IsRegionCached(addr, size); + } + return false; +} + +RasterizerDownloadArea OptimizedRasterizer::GetFlushArea(DAddr addr, u64 size) { + return GetFlushableArea(addr, size); +} + +void OptimizedRasterizer::InvalidateRegion(DAddr addr, u64 size, VideoCommon::CacheType which) { + MICROPROFILE_SCOPE(GPU_Synchronization); + + if (which == VideoCommon::CacheType::All || which == VideoCommon::CacheType::Unified) { + InvalidateMemoryRegion(addr, size); + } +} + +void OptimizedRasterizer::OnCacheInvalidation(PAddr addr, u64 size) { + MICROPROFILE_SCOPE(GPU_Synchronization); + + InvalidateCachedRegion(addr, size); +} + +bool OptimizedRasterizer::OnCPUWrite(PAddr addr, u64 size) { + return HandleCPUWrite(addr, size); +} + +void OptimizedRasterizer::InvalidateGPUCache() { + MICROPROFILE_SCOPE(GPU_Synchronization); + + InvalidateAllCache(); +} + +void OptimizedRasterizer::UnmapMemory(DAddr addr, u64 size) { + MICROPROFILE_SCOPE(GPU_Synchronization); + + UnmapGPUMemoryRegion(addr, size); +} + +void OptimizedRasterizer::ModifyGPUMemory(size_t as_id, GPUVAddr addr, u64 size) { + MICROPROFILE_SCOPE(GPU_Synchronization); + + UpdateMappedGPUMemory(as_id, addr, size); +} + +void OptimizedRasterizer::FlushAndInvalidateRegion(DAddr addr, u64 size, VideoCommon::CacheType which) { + MICROPROFILE_SCOPE(GPU_Synchronization); + + if (which == VideoCommon::CacheType::All || which == VideoCommon::CacheType::Unified) { + FlushAndInvalidateMemoryRegion(addr, size); + } +} + +void OptimizedRasterizer::WaitForIdle() { + MICROPROFILE_SCOPE(GPU_Synchronization); + + WaitForGPUIdle(); +} + +void OptimizedRasterizer::FragmentBarrier() { + MICROPROFILE_SCOPE(GPU_Synchronization); + + InsertFragmentBarrier(); +} + +void OptimizedRasterizer::TiledCacheBarrier() { + MICROPROFILE_SCOPE(GPU_Synchronization); + + InsertTiledCacheBarrier(); +} + +void OptimizedRasterizer::FlushCommands() { + MICROPROFILE_SCOPE(GPU_Synchronization); + + SubmitCommands(); +} + +void OptimizedRasterizer::TickFrame() { + MICROPROFILE_SCOPE(GPU_Synchronization); + + EndFrame(); +} + +void OptimizedRasterizer::PrepareRendertarget() { + const auto& regs{gpu.Maxwell3D().regs}; + const auto& framebuffer{regs.framebuffer}; + + render_targets.resize(framebuffer.num_color_buffers); + for (std::size_t index = 0; index < framebuffer.num_color_buffers; ++index) { + render_targets[index] = GetColorBuffer(index); + } + + depth_stencil = GetDepthBuffer(); +} + +void OptimizedRasterizer::UpdateDynamicState() { + const auto& regs{gpu.Maxwell3D().regs}; + + UpdateViewport(regs.viewport_transform); + UpdateScissor(regs.scissor_test); + UpdateDepthBias(regs.polygon_offset_units, regs.polygon_offset_clamp, regs.polygon_offset_factor); + UpdateBlendConstants(regs.blend_color); + UpdateStencilFaceMask(regs.stencil_front_func_mask, regs.stencil_back_func_mask); +} + +void OptimizedRasterizer::DrawIndexed(u32 instance_count) { + const auto& draw_state{gpu.Maxwell3D().draw_manager->GetDrawState()}; + const auto& index_buffer{memory_manager.ReadBlockUnsafe(draw_state.index_buffer.Address(), + draw_state.index_buffer.size)}; + + shader_cache.BindComputeShader(); + shader_cache.BindGraphicsShader(); + + DrawElementsInstanced(draw_state.topology, draw_state.index_buffer.count, + draw_state.index_buffer.format, index_buffer.data(), instance_count); +} + +void OptimizedRasterizer::DrawArrays(u32 instance_count) { + const auto& draw_state{gpu.Maxwell3D().draw_manager->GetDrawState()}; + + shader_cache.BindComputeShader(); + shader_cache.BindGraphicsShader(); + + DrawArraysInstanced(draw_state.topology, draw_state.vertex_buffer.first, + draw_state.vertex_buffer.count, instance_count); +} + +void OptimizedRasterizer::ClearFramebuffer(u32 layer_count) { + const auto& regs{gpu.Maxwell3D().regs}; + const auto& clear_state{regs.clear_buffers}; + + if (clear_state.R || clear_state.G || clear_state.B || clear_state.A) { + ClearColorBuffers(clear_state.R, clear_state.G, clear_state.B, clear_state.A, + regs.clear_color[0], regs.clear_color[1], regs.clear_color[2], + regs.clear_color[3], layer_count); + } + + if (clear_state.Z || clear_state.S) { + ClearDepthStencilBuffer(clear_state.Z, clear_state.S, regs.clear_depth, regs.clear_stencil, + layer_count); + } +} + +void OptimizedRasterizer::PrepareCompute() { + shader_cache.BindComputeShader(); +} + +void OptimizedRasterizer::LaunchComputeShader() { + const auto& launch_desc{gpu.KeplerCompute().launch_description}; + DispatchCompute(launch_desc.grid_dim_x, launch_desc.grid_dim_y, launch_desc.grid_dim_z); +} + +} // namespace VideoCore \ No newline at end of file diff --git a/src/video_core/optimized_rasterizer.h b/src/video_core/optimized_rasterizer.h new file mode 100644 index 0000000000..9c9fe1f35e --- /dev/null +++ b/src/video_core/optimized_rasterizer.h @@ -0,0 +1,73 @@ +#pragma once + +#include +#include +#include "common/common_types.h" +#include "video_core/rasterizer_interface.h" +#include "video_core/engines/maxwell_3d.h" + +namespace Core { +class System; +} + +namespace Tegra { +class GPU; +class MemoryManager; +} + +namespace VideoCore { + +class ShaderCache; +class QueryCache; + +class OptimizedRasterizer final : public RasterizerInterface { +public: + explicit OptimizedRasterizer(Core::System& system, Tegra::GPU& gpu); + ~OptimizedRasterizer() override; + + void Draw(bool is_indexed, u32 instance_count) override; + void Clear(u32 layer_count) override; + void DispatchCompute() override; + void ResetCounter(VideoCommon::QueryType type) override; + void Query(GPUVAddr gpu_addr, VideoCommon::QueryType type, + VideoCommon::QueryPropertiesFlags flags, u32 payload, u32 subreport) override; + void FlushAll() override; + void FlushRegion(DAddr addr, u64 size, VideoCommon::CacheType which) override; + bool MustFlushRegion(DAddr addr, u64 size, VideoCommon::CacheType which) override; + RasterizerDownloadArea GetFlushArea(DAddr addr, u64 size) override; + void InvalidateRegion(DAddr addr, u64 size, VideoCommon::CacheType which) override; + void OnCacheInvalidation(PAddr addr, u64 size) override; + bool OnCPUWrite(PAddr addr, u64 size) override; + void InvalidateGPUCache() override; + void UnmapMemory(DAddr addr, u64 size) override; + void ModifyGPUMemory(size_t as_id, GPUVAddr addr, u64 size) override; + void FlushAndInvalidateRegion(DAddr addr, u64 size, VideoCommon::CacheType which) override; + void WaitForIdle() override; + void FragmentBarrier() override; + void TiledCacheBarrier() override; + void FlushCommands() override; + void TickFrame() override; + +private: + void PrepareRendertarget(); + void UpdateDynamicState(); + void DrawIndexed(u32 instance_count); + void DrawArrays(u32 instance_count); + void ClearFramebuffer(u32 layer_count); + void PrepareCompute(); + void LaunchComputeShader(); + + Core::System& system; + Tegra::GPU& gpu; + Tegra::MemoryManager& memory_manager; + + std::unique_ptr shader_cache; + std::unique_ptr query_cache; + + std::vector render_targets; + DepthStencilConfig depth_stencil; + + // Add any additional member variables needed for the optimized rasterizer +}; + +} // namespace VideoCore \ No newline at end of file diff --git a/src/video_core/shader_cache.cpp b/src/video_core/shader_cache.cpp index a281f5d541..c32bd88b22 100644 --- a/src/video_core/shader_cache.cpp +++ b/src/video_core/shader_cache.cpp @@ -3,9 +3,18 @@ #include #include +#include +#include +#include +#include +#include #include #include "common/assert.h" +#include "common/fs/file.h" +#include "common/fs/path_util.h" +#include "common/logging/log.h" +#include "common/thread_worker.h" #include "shader_recompiler/frontend/maxwell/control_flow.h" #include "shader_recompiler/object_pool.h" #include "video_core/control/channel_state.h" @@ -19,233 +28,288 @@ namespace VideoCommon { +constexpr size_t MAX_SHADER_CACHE_SIZE = 1024 * 1024 * 1024; // 1GB + +class ShaderCacheWorker : public Common::ThreadWorker { +public: + explicit ShaderCacheWorker(const std::string& name) : ThreadWorker(name) {} + ~ShaderCacheWorker() = default; + + void CompileShader(ShaderInfo* shader) { + Push([shader]() { + // Compile shader here + // This is a placeholder for the actual compilation process + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + shader->is_compiled.store(true, std::memory_order_release); + }); + } +}; + +class ShaderCache::Impl { +public: + explicit Impl(Tegra::MaxwellDeviceMemoryManager& device_memory_) + : device_memory{device_memory_}, workers{CreateWorkers()} { + LoadCache(); + } + + ~Impl() { + SaveCache(); + } + + void InvalidateRegion(VAddr addr, size_t size) { + std::scoped_lock lock{invalidation_mutex}; + InvalidatePagesInRegion(addr, size); + RemovePendingShaders(); + } + + void OnCacheInvalidation(VAddr addr, size_t size) { + std::scoped_lock lock{invalidation_mutex}; + InvalidatePagesInRegion(addr, size); + } + + void SyncGuestHost() { + std::scoped_lock lock{invalidation_mutex}; + RemovePendingShaders(); + } + + bool RefreshStages(std::array& unique_hashes); + const ShaderInfo* ComputeShader(); + void GetGraphicsEnvironments(GraphicsEnvironments& result, const std::array& unique_hashes); + + ShaderInfo* TryGet(VAddr addr) const { + std::scoped_lock lock{lookup_mutex}; + + const auto it = lookup_cache.find(addr); + if (it == lookup_cache.end()) { + return nullptr; + } + return it->second->data; + } + + void Register(std::unique_ptr data, VAddr addr, size_t size) { + std::scoped_lock lock{invalidation_mutex, lookup_mutex}; + + const VAddr addr_end = addr + size; + Entry* const entry = NewEntry(addr, addr_end, data.get()); + + const u64 page_end = (addr_end + SUYU_PAGESIZE - 1) >> SUYU_PAGEBITS; + for (u64 page = addr >> SUYU_PAGEBITS; page < page_end; ++page) { + invalidation_cache[page].push_back(entry); + } + + storage.push_back(std::move(data)); + + device_memory.UpdatePagesCachedCount(addr, size, 1); + } + +private: + std::vector> CreateWorkers() { + const size_t num_workers = std::thread::hardware_concurrency(); + std::vector> workers; + workers.reserve(num_workers); + for (size_t i = 0; i < num_workers; ++i) { + workers.emplace_back(std::make_unique(fmt::format("ShaderWorker{}", i))); + } + return workers; + } + + void LoadCache() { + const auto cache_dir = Common::FS::GetSuyuPath(Common::FS::SuyuPath::ShaderDir); + std::filesystem::create_directories(cache_dir); + + const auto cache_file = cache_dir / "shader_cache.bin"; + if (!std::filesystem::exists(cache_file)) { + return; + } + + std::ifstream file(cache_file, std::ios::binary); + if (!file) { + LOG_ERROR(Render_Vulkan, "Failed to open shader cache file for reading"); + return; + } + + size_t num_entries; + file.read(reinterpret_cast(&num_entries), sizeof(num_entries)); + + for (size_t i = 0; i < num_entries; ++i) { + VAddr addr; + size_t size; + file.read(reinterpret_cast(&addr), sizeof(addr)); + file.read(reinterpret_cast(&size), sizeof(size)); + + auto info = std::make_unique(); + file.read(reinterpret_cast(info.get()), sizeof(ShaderInfo)); + + Register(std::move(info), addr, size); + } + } + + void SaveCache() { + const auto cache_dir = Common::FS::GetSuyuPath(Common::FS::SuyuPath::ShaderDir); + std::filesystem::create_directories(cache_dir); + + const auto cache_file = cache_dir / "shader_cache.bin"; + std::ofstream file(cache_file, std::ios::binary | std::ios::trunc); + if (!file) { + LOG_ERROR(Render_Vulkan, "Failed to open shader cache file for writing"); + return; + } + + const size_t num_entries = storage.size(); + file.write(reinterpret_cast(&num_entries), sizeof(num_entries)); + + for (const auto& shader : storage) { + const VAddr addr = shader->addr; + const size_t size = shader->size_bytes; + file.write(reinterpret_cast(&addr), sizeof(addr)); + file.write(reinterpret_cast(&size), sizeof(size)); + file.write(reinterpret_cast(shader.get()), sizeof(ShaderInfo)); + } + } + + void InvalidatePagesInRegion(VAddr addr, size_t size) { + const VAddr addr_end = addr + size; + const u64 page_end = (addr_end + SUYU_PAGESIZE - 1) >> SUYU_PAGEBITS; + for (u64 page = addr >> SUYU_PAGEBITS; page < page_end; ++page) { + auto it = invalidation_cache.find(page); + if (it == invalidation_cache.end()) { + continue; + } + InvalidatePageEntries(it->second, addr, addr_end); + } + } + + void RemovePendingShaders() { + if (marked_for_removal.empty()) { + return; + } + // Remove duplicates + std::sort(marked_for_removal.begin(), marked_for_removal.end()); + marked_for_removal.erase(std::unique(marked_for_removal.begin(), marked_for_removal.end()), + marked_for_removal.end()); + + std::vector removed_shaders; + + std::scoped_lock lock{lookup_mutex}; + for (Entry* const entry : marked_for_removal) { + removed_shaders.push_back(entry->data); + + const auto it = lookup_cache.find(entry->addr_start); + ASSERT(it != lookup_cache.end()); + lookup_cache.erase(it); + } + marked_for_removal.clear(); + + if (!removed_shaders.empty()) { + RemoveShadersFromStorage(removed_shaders); + } + } + + void InvalidatePageEntries(std::vector& entries, VAddr addr, VAddr addr_end) { + size_t index = 0; + while (index < entries.size()) { + Entry* const entry = entries[index]; + if (!entry->Overlaps(addr, addr_end)) { + ++index; + continue; + } + + UnmarkMemory(entry); + RemoveEntryFromInvalidationCache(entry); + marked_for_removal.push_back(entry); + } + } + + void RemoveEntryFromInvalidationCache(const Entry* entry) { + const u64 page_end = (entry->addr_end + SUYU_PAGESIZE - 1) >> SUYU_PAGEBITS; + for (u64 page = entry->addr_start >> SUYU_PAGEBITS; page < page_end; ++page) { + const auto entries_it = invalidation_cache.find(page); + ASSERT(entries_it != invalidation_cache.end()); + std::vector& entries = entries_it->second; + + const auto entry_it = std::find(entries.begin(), entries.end(), entry); + ASSERT(entry_it != entries.end()); + entries.erase(entry_it); + } + } + + void UnmarkMemory(Entry* entry) { + if (!entry->is_memory_marked) { + return; + } + entry->is_memory_marked = false; + + const VAddr addr = entry->addr_start; + const size_t size = entry->addr_end - addr; + device_memory.UpdatePagesCachedCount(addr, size, -1); + } + + void RemoveShadersFromStorage(const std::vector& removed_shaders) { + storage.erase( + std::remove_if(storage.begin(), storage.end(), + [&removed_shaders](const std::unique_ptr& shader) { + return std::find(removed_shaders.begin(), removed_shaders.end(), + shader.get()) != removed_shaders.end(); + }), + storage.end()); + } + + Entry* NewEntry(VAddr addr, VAddr addr_end, ShaderInfo* data) { + auto entry = std::make_unique(Entry{addr, addr_end, data}); + Entry* const entry_pointer = entry.get(); + + lookup_cache.emplace(addr, std::move(entry)); + return entry_pointer; + } + + Tegra::MaxwellDeviceMemoryManager& device_memory; + std::vector> workers; + + mutable std::mutex lookup_mutex; + std::mutex invalidation_mutex; + + std::unordered_map> lookup_cache; + std::unordered_map> invalidation_cache; + std::vector> storage; + std::vector marked_for_removal; +}; + +ShaderCache::ShaderCache(Tegra::MaxwellDeviceMemoryManager& device_memory_) + : impl{std::make_unique(device_memory_)} {} + +ShaderCache::~ShaderCache() = default; + void ShaderCache::InvalidateRegion(VAddr addr, size_t size) { - std::scoped_lock lock{invalidation_mutex}; - InvalidatePagesInRegion(addr, size); - RemovePendingShaders(); + impl->InvalidateRegion(addr, size); } void ShaderCache::OnCacheInvalidation(VAddr addr, size_t size) { - std::scoped_lock lock{invalidation_mutex}; - InvalidatePagesInRegion(addr, size); + impl->OnCacheInvalidation(addr, size); } void ShaderCache::SyncGuestHost() { - std::scoped_lock lock{invalidation_mutex}; - RemovePendingShaders(); + impl->SyncGuestHost(); } -ShaderCache::ShaderCache(Tegra::MaxwellDeviceMemoryManager& device_memory_) - : device_memory{device_memory_} {} - bool ShaderCache::RefreshStages(std::array& unique_hashes) { - auto& dirty{maxwell3d->dirty.flags}; - if (!dirty[VideoCommon::Dirty::Shaders]) { - return last_shaders_valid; - } - dirty[VideoCommon::Dirty::Shaders] = false; - - const GPUVAddr base_addr{maxwell3d->regs.program_region.Address()}; - for (size_t index = 0; index < Tegra::Engines::Maxwell3D::Regs::MaxShaderProgram; ++index) { - if (!maxwell3d->regs.IsShaderConfigEnabled(index)) { - unique_hashes[index] = 0; - continue; - } - const auto& shader_config{maxwell3d->regs.pipelines[index]}; - const auto program{static_cast(index)}; - if (program == Tegra::Engines::Maxwell3D::Regs::ShaderType::Pixel && - !maxwell3d->regs.rasterize_enable) { - unique_hashes[index] = 0; - continue; - } - const GPUVAddr shader_addr{base_addr + shader_config.offset}; - const std::optional cpu_shader_addr{gpu_memory->GpuToCpuAddress(shader_addr)}; - if (!cpu_shader_addr) { - LOG_ERROR(HW_GPU, "Invalid GPU address for shader 0x{:016x}", shader_addr); - last_shaders_valid = false; - return false; - } - const ShaderInfo* shader_info{TryGet(*cpu_shader_addr)}; - if (!shader_info) { - const u32 start_address{shader_config.offset}; - GraphicsEnvironment env{*maxwell3d, *gpu_memory, program, base_addr, start_address}; - shader_info = MakeShaderInfo(env, *cpu_shader_addr); - } - shader_infos[index] = shader_info; - unique_hashes[index] = shader_info->unique_hash; - } - last_shaders_valid = true; - return true; + return impl->RefreshStages(unique_hashes); } const ShaderInfo* ShaderCache::ComputeShader() { - const GPUVAddr program_base{kepler_compute->regs.code_loc.Address()}; - const auto& qmd{kepler_compute->launch_description}; - const GPUVAddr shader_addr{program_base + qmd.program_start}; - const std::optional cpu_shader_addr{gpu_memory->GpuToCpuAddress(shader_addr)}; - if (!cpu_shader_addr) { - LOG_ERROR(HW_GPU, "Invalid GPU address for shader 0x{:016x}", shader_addr); - return nullptr; - } - if (const ShaderInfo* const shader = TryGet(*cpu_shader_addr)) { - return shader; - } - ComputeEnvironment env{*kepler_compute, *gpu_memory, program_base, qmd.program_start}; - return MakeShaderInfo(env, *cpu_shader_addr); + return impl->ComputeShader(); } void ShaderCache::GetGraphicsEnvironments(GraphicsEnvironments& result, const std::array& unique_hashes) { - size_t env_index{}; - const GPUVAddr base_addr{maxwell3d->regs.program_region.Address()}; - for (size_t index = 0; index < NUM_PROGRAMS; ++index) { - if (unique_hashes[index] == 0) { - continue; - } - const auto program{static_cast(index)}; - auto& env{result.envs[index]}; - const u32 start_address{maxwell3d->regs.pipelines[index].offset}; - env = GraphicsEnvironment{*maxwell3d, *gpu_memory, program, base_addr, start_address}; - env.SetCachedSize(shader_infos[index]->size_bytes); - result.env_ptrs[env_index++] = &env; - } + impl->GetGraphicsEnvironments(result, unique_hashes); } ShaderInfo* ShaderCache::TryGet(VAddr addr) const { - std::scoped_lock lock{lookup_mutex}; - - const auto it = lookup_cache.find(addr); - if (it == lookup_cache.end()) { - return nullptr; - } - return it->second->data; + return impl->TryGet(addr); } void ShaderCache::Register(std::unique_ptr data, VAddr addr, size_t size) { - std::scoped_lock lock{invalidation_mutex, lookup_mutex}; - - const VAddr addr_end = addr + size; - Entry* const entry = NewEntry(addr, addr_end, data.get()); - - const u64 page_end = (addr_end + SUYU_PAGESIZE - 1) >> SUYU_PAGEBITS; - for (u64 page = addr >> SUYU_PAGEBITS; page < page_end; ++page) { - invalidation_cache[page].push_back(entry); - } - - storage.push_back(std::move(data)); - - device_memory.UpdatePagesCachedCount(addr, size, 1); -} - -void ShaderCache::InvalidatePagesInRegion(VAddr addr, size_t size) { - const VAddr addr_end = addr + size; - const u64 page_end = (addr_end + SUYU_PAGESIZE - 1) >> SUYU_PAGEBITS; - for (u64 page = addr >> SUYU_PAGEBITS; page < page_end; ++page) { - auto it = invalidation_cache.find(page); - if (it == invalidation_cache.end()) { - continue; - } - InvalidatePageEntries(it->second, addr, addr_end); - } -} - -void ShaderCache::RemovePendingShaders() { - if (marked_for_removal.empty()) { - return; - } - // Remove duplicates - std::ranges::sort(marked_for_removal); - marked_for_removal.erase(std::unique(marked_for_removal.begin(), marked_for_removal.end()), - marked_for_removal.end()); - - boost::container::small_vector removed_shaders; - - std::scoped_lock lock{lookup_mutex}; - for (Entry* const entry : marked_for_removal) { - removed_shaders.push_back(entry->data); - - const auto it = lookup_cache.find(entry->addr_start); - ASSERT(it != lookup_cache.end()); - lookup_cache.erase(it); - } - marked_for_removal.clear(); - - if (!removed_shaders.empty()) { - RemoveShadersFromStorage(removed_shaders); - } -} - -void ShaderCache::InvalidatePageEntries(std::vector& entries, VAddr addr, VAddr addr_end) { - size_t index = 0; - while (index < entries.size()) { - Entry* const entry = entries[index]; - if (!entry->Overlaps(addr, addr_end)) { - ++index; - continue; - } - - UnmarkMemory(entry); - RemoveEntryFromInvalidationCache(entry); - marked_for_removal.push_back(entry); - } -} - -void ShaderCache::RemoveEntryFromInvalidationCache(const Entry* entry) { - const u64 page_end = (entry->addr_end + SUYU_PAGESIZE - 1) >> SUYU_PAGEBITS; - for (u64 page = entry->addr_start >> SUYU_PAGEBITS; page < page_end; ++page) { - const auto entries_it = invalidation_cache.find(page); - ASSERT(entries_it != invalidation_cache.end()); - std::vector& entries = entries_it->second; - - const auto entry_it = std::ranges::find(entries, entry); - ASSERT(entry_it != entries.end()); - entries.erase(entry_it); - } -} - -void ShaderCache::UnmarkMemory(Entry* entry) { - if (!entry->is_memory_marked) { - return; - } - entry->is_memory_marked = false; - - const VAddr addr = entry->addr_start; - const size_t size = entry->addr_end - addr; - device_memory.UpdatePagesCachedCount(addr, size, -1); -} - -void ShaderCache::RemoveShadersFromStorage(std::span removed_shaders) { - // Remove them from the cache - std::erase_if(storage, [&removed_shaders](const std::unique_ptr& shader) { - return std::ranges::find(removed_shaders, shader.get()) != removed_shaders.end(); - }); -} - -ShaderCache::Entry* ShaderCache::NewEntry(VAddr addr, VAddr addr_end, ShaderInfo* data) { - auto entry = std::make_unique(Entry{addr, addr_end, data}); - Entry* const entry_pointer = entry.get(); - - lookup_cache.emplace(addr, std::move(entry)); - return entry_pointer; -} - -const ShaderInfo* ShaderCache::MakeShaderInfo(GenericEnvironment& env, VAddr cpu_addr) { - auto info = std::make_unique(); - if (const std::optional cached_hash{env.Analyze()}) { - info->unique_hash = *cached_hash; - info->size_bytes = env.CachedSizeBytes(); - } else { - // Slow path, not really hit on commercial games - // Build a control flow graph to get the real shader size - Shader::ObjectPool flow_block; - Shader::Maxwell::Flow::CFG cfg{env, flow_block, env.StartAddress()}; - info->unique_hash = env.CalculateHash(); - info->size_bytes = env.ReadSizeBytes(); - } - const size_t size_bytes{info->size_bytes}; - const ShaderInfo* const result{info.get()}; - Register(std::move(info), cpu_addr, size_bytes); - return result; + impl->Register(std::move(data), addr, size); } } // namespace VideoCommon From 8d6b694569d6407614048f01104728e0c3c237b4 Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Mon, 30 Sep 2024 12:30:59 +0200 Subject: [PATCH 159/165] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 4d4f239680..e2cfaa9ded 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,8 @@ SPDX-License-Identifier: GPL-3.0-or-later We're in need of developers. Please join our chat below or DM a dev if you want to contribute! This repo is currently based on Yuzu EA 4176 but the code will be rewritten for legal and performance reasons. +Our only website is suyu.dev so please be cautious when using other sites offering builds/downloads. +

From 509b880eec852181cf1c3b5036d18747520da8b6 Mon Sep 17 00:00:00 2001 From: CrimsonHawk Date: Sat, 5 Oct 2024 13:50:31 +0800 Subject: [PATCH 160/165] Revert all the trash commits that were breaking build, back to e5c47e911b This reverts commit 592f93b26cd75765a7b99ec4a711aa03b3325f84. --- src/core/core_timing.cpp | 116 +++- src/core/core_timing.h | 96 ++- src/core/cpu_manager.cpp | 43 +- src/core/memory.cpp | 869 ++++++++++++++++++++++-- src/video_core/gpu.cpp | 279 +++++++- src/video_core/optimized_rasterizer.cpp | 221 ------ src/video_core/optimized_rasterizer.h | 73 -- src/video_core/shader_cache.cpp | 472 ++++++------- 8 files changed, 1433 insertions(+), 736 deletions(-) delete mode 100644 src/video_core/optimized_rasterizer.cpp delete mode 100644 src/video_core/optimized_rasterizer.h diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp index 6ac0007764..1abfa920c4 100644 --- a/src/core/core_timing.cpp +++ b/src/core/core_timing.cpp @@ -26,6 +26,24 @@ std::shared_ptr CreateEvent(std::string name, TimedCallback&& callbac return std::make_shared(std::move(callback), std::move(name)); } +struct CoreTiming::Event { + s64 time; + u64 fifo_order; + std::weak_ptr type; + s64 reschedule_time; + heap_t::handle_type handle{}; + + // Sort by time, unless the times are the same, in which case sort by + // the order added to the queue + friend bool operator>(const Event& left, const Event& right) { + return std::tie(left.time, left.fifo_order) > std::tie(right.time, right.fifo_order); + } + + friend bool operator<(const Event& left, const Event& right) { + return std::tie(left.time, left.fifo_order) < std::tie(right.time, right.fifo_order); + } +}; + CoreTiming::CoreTiming() : clock{Common::CreateOptimalClock()} {} CoreTiming::~CoreTiming() { @@ -69,7 +87,7 @@ void CoreTiming::Pause(bool is_paused) { } void CoreTiming::SyncPause(bool is_paused) { - if (is_paused == paused && paused_set == is_paused) { + if (is_paused == paused && paused_set == paused) { return; } @@ -94,7 +112,7 @@ bool CoreTiming::IsRunning() const { bool CoreTiming::HasPendingEvents() const { std::scoped_lock lock{basic_lock}; - return !event_queue.empty(); + return !(wait_set && event_queue.empty()); } void CoreTiming::ScheduleEvent(std::chrono::nanoseconds ns_into_future, @@ -103,8 +121,8 @@ void CoreTiming::ScheduleEvent(std::chrono::nanoseconds ns_into_future, std::scoped_lock scope{basic_lock}; const auto next_time{absolute_time ? ns_into_future : GetGlobalTimeNs() + ns_into_future}; - event_queue.emplace_back(Event{next_time.count(), event_fifo_id++, event_type}); - std::push_heap(event_queue.begin(), event_queue.end(), std::greater<>()); + auto h{event_queue.emplace(Event{next_time.count(), event_fifo_id++, event_type, 0})}; + (*h).handle = h; } event.Set(); @@ -118,9 +136,9 @@ void CoreTiming::ScheduleLoopingEvent(std::chrono::nanoseconds start_time, std::scoped_lock scope{basic_lock}; const auto next_time{absolute_time ? start_time : GetGlobalTimeNs() + start_time}; - event_queue.emplace_back( - Event{next_time.count(), event_fifo_id++, event_type, resched_time.count()}); - std::push_heap(event_queue.begin(), event_queue.end(), std::greater<>()); + auto h{event_queue.emplace( + Event{next_time.count(), event_fifo_id++, event_type, resched_time.count()})}; + (*h).handle = h; } event.Set(); @@ -131,11 +149,17 @@ void CoreTiming::UnscheduleEvent(const std::shared_ptr& event_type, { std::scoped_lock lk{basic_lock}; - event_queue.erase( - std::remove_if(event_queue.begin(), event_queue.end(), - [&](const Event& e) { return e.type.lock().get() == event_type.get(); }), - event_queue.end()); - std::make_heap(event_queue.begin(), event_queue.end(), std::greater<>()); + std::vector to_remove; + for (auto itr = event_queue.begin(); itr != event_queue.end(); itr++) { + const Event& e = *itr; + if (e.type.lock().get() == event_type.get()) { + to_remove.push_back(itr->handle); + } + } + + for (auto& h : to_remove) { + event_queue.erase(h); + } event_type->sequence_number++; } @@ -148,7 +172,7 @@ void CoreTiming::UnscheduleEvent(const std::shared_ptr& event_type, void CoreTiming::AddTicks(u64 ticks_to_add) { cpu_ticks += ticks_to_add; - downcount -= static_cast(ticks_to_add); + downcount -= static_cast(cpu_ticks); } void CoreTiming::Idle() { @@ -156,7 +180,7 @@ void CoreTiming::Idle() { } void CoreTiming::ResetTicks() { - downcount.store(MAX_SLICE_LENGTH, std::memory_order_release); + downcount = MAX_SLICE_LENGTH; } u64 CoreTiming::GetClockTicks() const { @@ -177,38 +201,48 @@ std::optional CoreTiming::Advance() { std::scoped_lock lock{advance_lock, basic_lock}; global_timer = GetGlobalTimeNs().count(); - while (!event_queue.empty() && event_queue.front().time <= global_timer) { - Event evt = std::move(event_queue.front()); - std::pop_heap(event_queue.begin(), event_queue.end(), std::greater<>()); - event_queue.pop_back(); + while (!event_queue.empty() && event_queue.top().time <= global_timer) { + const Event& evt = event_queue.top(); - if (const auto event_type = evt.type.lock()) { + if (const auto event_type{evt.type.lock()}) { const auto evt_time = evt.time; const auto evt_sequence_num = event_type->sequence_number; - basic_lock.unlock(); + if (evt.reschedule_time == 0) { + event_queue.pop(); - const auto new_schedule_time = event_type->callback( - evt_time, std::chrono::nanoseconds{GetGlobalTimeNs().count() - evt_time}); + basic_lock.unlock(); - basic_lock.lock(); + event_type->callback( + evt_time, std::chrono::nanoseconds{GetGlobalTimeNs().count() - evt_time}); - if (evt_sequence_num != event_type->sequence_number) { - continue; - } + basic_lock.lock(); + } else { + basic_lock.unlock(); - if (new_schedule_time.has_value() || evt.reschedule_time != 0) { - const auto next_schedule_time = new_schedule_time.value_or( - std::chrono::nanoseconds{evt.reschedule_time}); + const auto new_schedule_time{event_type->callback( + evt_time, std::chrono::nanoseconds{GetGlobalTimeNs().count() - evt_time})}; - auto next_time = evt.time + next_schedule_time.count(); - if (evt.time < pause_end_time) { - next_time = pause_end_time + next_schedule_time.count(); + basic_lock.lock(); + + if (evt_sequence_num != event_type->sequence_number) { + // Heap handle is invalidated after external modification. + continue; } - event_queue.emplace_back(Event{next_time, event_fifo_id++, evt.type, - next_schedule_time.count()}); - std::push_heap(event_queue.begin(), event_queue.end(), std::greater<>()); + const auto next_schedule_time{new_schedule_time.has_value() + ? new_schedule_time.value().count() + : evt.reschedule_time}; + + // If this event was scheduled into a pause, its time now is going to be way + // behind. Re-set this event to continue from the end of the pause. + auto next_time{evt.time + next_schedule_time}; + if (evt.time < pause_end_time) { + next_time = pause_end_time + next_schedule_time; + } + + event_queue.update(evt.handle, Event{next_time, event_fifo_id++, evt.type, + next_schedule_time, evt.handle}); } } @@ -216,7 +250,7 @@ std::optional CoreTiming::Advance() { } if (!event_queue.empty()) { - return event_queue.front().time; + return event_queue.top().time; } else { return std::nullopt; } @@ -235,7 +269,7 @@ void CoreTiming::ThreadLoop() { #ifdef _WIN32 while (!paused && !event.IsSet() && wait_time > 0) { wait_time = *next_time - GetGlobalTimeNs().count(); - if (wait_time >= 1'000'000) { // 1ms + if (wait_time >= timer_resolution_ns) { Common::Windows::SleepForOneTick(); } else { #ifdef ARCHITECTURE_x86_64 @@ -256,8 +290,10 @@ void CoreTiming::ThreadLoop() { } else { // Queue is empty, wait until another event is scheduled and signals us to // continue. + wait_set = true; event.Wait(); } + wait_set = false; } paused_set = true; @@ -291,4 +327,10 @@ std::chrono::microseconds CoreTiming::GetGlobalTimeUs() const { return std::chrono::microseconds{Common::WallClock::CPUTickToUS(cpu_ticks)}; } +#ifdef _WIN32 +void CoreTiming::SetTimerResolutionNs(std::chrono::nanoseconds ns) { + timer_resolution_ns = ns.count(); +} +#endif + } // namespace Core::Timing diff --git a/src/core/core_timing.h b/src/core/core_timing.h index 5b42b0e491..7e4dff7f3d 100644 --- a/src/core/core_timing.h +++ b/src/core/core_timing.h @@ -11,7 +11,8 @@ #include #include #include -#include + +#include #include "common/common_types.h" #include "common/thread.h" @@ -42,6 +43,18 @@ enum class UnscheduleEventType { NoWait, }; +/** + * This is a system to schedule events into the emulated machine's future. Time is measured + * in main CPU clock cycles. + * + * To schedule an event, you first have to register its type. This is where you pass in the + * callback. You then schedule events using the type ID you get back. + * + * The s64 ns_late that the callbacks get is how many ns late it was. + * So to schedule a new event on a regular basis: + * inside callback: + * ScheduleEvent(period_in_ns - ns_late, callback, "whatever") + */ class CoreTiming { public: CoreTiming(); @@ -53,56 +66,99 @@ public: CoreTiming& operator=(const CoreTiming&) = delete; CoreTiming& operator=(CoreTiming&&) = delete; + /// CoreTiming begins at the boundary of timing slice -1. An initial call to Advance() is + /// required to end slice - 1 and start slice 0 before the first cycle of code is executed. void Initialize(std::function&& on_thread_init_); + + /// Clear all pending events. This should ONLY be done on exit. void ClearPendingEvents(); + + /// Sets if emulation is multicore or single core, must be set before Initialize void SetMulticore(bool is_multicore_) { is_multicore = is_multicore_; } + + /// Pauses/Unpauses the execution of the timer thread. void Pause(bool is_paused); + + /// Pauses/Unpauses the execution of the timer thread and waits until paused. void SyncPause(bool is_paused); + + /// Checks if core timing is running. bool IsRunning() const; + + /// Checks if the timer thread has started. bool HasStarted() const { return has_started; } + + /// Checks if there are any pending time events. bool HasPendingEvents() const; + + /// Schedules an event in core timing void ScheduleEvent(std::chrono::nanoseconds ns_into_future, const std::shared_ptr& event_type, bool absolute_time = false); + + /// Schedules an event which will automatically re-schedule itself with the given time, until + /// unscheduled void ScheduleLoopingEvent(std::chrono::nanoseconds start_time, std::chrono::nanoseconds resched_time, const std::shared_ptr& event_type, bool absolute_time = false); + void UnscheduleEvent(const std::shared_ptr& event_type, UnscheduleEventType type = UnscheduleEventType::Wait); + void AddTicks(u64 ticks_to_add); + void ResetTicks(); + void Idle(); + s64 GetDowncount() const { - return downcount.load(std::memory_order_relaxed); + return downcount; } + + /// Returns the current CNTPCT tick value. u64 GetClockTicks() const; + + /// Returns the current GPU tick value. u64 GetGPUTicks() const; + + /// Returns current time in microseconds. std::chrono::microseconds GetGlobalTimeUs() const; + + /// Returns current time in nanoseconds. std::chrono::nanoseconds GetGlobalTimeNs() const; + + /// Checks for events manually and returns time in nanoseconds for next event, threadsafe. std::optional Advance(); +#ifdef _WIN32 + void SetTimerResolutionNs(std::chrono::nanoseconds ns); +#endif + private: - struct Event { - s64 time; - u64 fifo_order; - std::shared_ptr type; - bool operator>(const Event& other) const { - return std::tie(time, fifo_order) > std::tie(other.time, other.fifo_order); - } - }; + struct Event; static void ThreadEntry(CoreTiming& instance); void ThreadLoop(); + void Reset(); std::unique_ptr clock; - std::atomic global_timer{0}; - std::vector event_queue; - std::atomic event_fifo_id{0}; + + s64 global_timer = 0; + +#ifdef _WIN32 + s64 timer_resolution_ns; +#endif + + using heap_t = + boost::heap::fibonacci_heap>>; + + heap_t event_queue; + u64 event_fifo_id = 0; Common::Event event{}; Common::Event pause_event{}; @@ -117,12 +173,20 @@ private: std::function on_thread_init{}; bool is_multicore{}; - std::atomic pause_end_time{}; + s64 pause_end_time{}; - std::atomic cpu_ticks{}; - std::atomic downcount{}; + /// Cycle timing + u64 cpu_ticks{}; + s64 downcount{}; }; +/// Creates a core timing event with the given name and callback. +/// +/// @param name The name of the core timing event to create. +/// @param callback The callback to execute for the event. +/// +/// @returns An EventType instance representing the created event. +/// std::shared_ptr CreateEvent(std::string name, TimedCallback&& callback); } // namespace Core::Timing diff --git a/src/core/cpu_manager.cpp b/src/core/cpu_manager.cpp index e7e341de16..9b1c773877 100644 --- a/src/core/cpu_manager.cpp +++ b/src/core/cpu_manager.cpp @@ -1,12 +1,6 @@ // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include -#include -#include -#include -#include - #include "common/fiber.h" #include "common/microprofile.h" #include "common/scope_exit.h" @@ -30,7 +24,6 @@ void CpuManager::Initialize() { num_cores = is_multicore ? Core::Hardware::NUM_CPU_CORES : 1; gpu_barrier = std::make_unique(num_cores + 1); - core_data.resize(num_cores); for (std::size_t core = 0; core < num_cores; core++) { core_data[core].host_thread = std::jthread([this, core](std::stop_token token) { RunThread(token, core); }); @@ -38,10 +31,10 @@ void CpuManager::Initialize() { } void CpuManager::Shutdown() { - for (auto& data : core_data) { - if (data.host_thread.joinable()) { - data.host_thread.request_stop(); - data.host_thread.join(); + for (std::size_t core = 0; core < num_cores; core++) { + if (core_data[core].host_thread.joinable()) { + core_data[core].host_thread.request_stop(); + core_data[core].host_thread.join(); } } } @@ -73,7 +66,12 @@ void CpuManager::HandleInterrupt() { Kernel::KInterruptManager::HandleInterrupt(kernel, static_cast(core_index)); } +/////////////////////////////////////////////////////////////////////////////// +/// MultiCore /// +/////////////////////////////////////////////////////////////////////////////// + void CpuManager::MultiCoreRunGuestThread() { + // Similar to UserModeThreadStarter in HOS auto& kernel = system.Kernel(); auto* thread = Kernel::GetCurrentThreadPointer(kernel); kernel.CurrentScheduler()->OnThreadStart(); @@ -90,6 +88,10 @@ void CpuManager::MultiCoreRunGuestThread() { } void CpuManager::MultiCoreRunIdleThread() { + // Not accurate to HOS. Remove this entire method when singlecore is removed. + // See notes in KScheduler::ScheduleImpl for more information about why this + // is inaccurate. + auto& kernel = system.Kernel(); kernel.CurrentScheduler()->OnThreadStart(); @@ -103,6 +105,10 @@ void CpuManager::MultiCoreRunIdleThread() { } } +/////////////////////////////////////////////////////////////////////////////// +/// SingleCore /// +/////////////////////////////////////////////////////////////////////////////// + void CpuManager::SingleCoreRunGuestThread() { auto& kernel = system.Kernel(); auto* thread = Kernel::GetCurrentThreadPointer(kernel); @@ -148,16 +154,19 @@ void CpuManager::PreemptSingleCore(bool from_running_environment) { system.CoreTiming().Advance(); kernel.SetIsPhantomModeForSingleCore(false); } - current_core.store((current_core + 1) % Core::Hardware::NUM_CPU_CORES, std::memory_order_release); + current_core.store((current_core + 1) % Core::Hardware::NUM_CPU_CORES); system.CoreTiming().ResetTicks(); kernel.Scheduler(current_core).PreemptSingleCore(); + // We've now been scheduled again, and we may have exchanged schedulers. + // Reload the scheduler in case it's different. if (!kernel.Scheduler(current_core).IsIdle()) { idle_count = 0; } } void CpuManager::GuestActivate() { + // Similar to the HorizonKernelMain callback in HOS auto& kernel = system.Kernel(); auto* scheduler = kernel.CurrentScheduler(); @@ -175,19 +184,27 @@ void CpuManager::ShutdownThread() { } void CpuManager::RunThread(std::stop_token token, std::size_t core) { + /// Initialization system.RegisterCoreThread(core); - std::string name = is_multicore ? "CPUCore_" + std::to_string(core) : "CPUThread"; + std::string name; + if (is_multicore) { + name = "CPUCore_" + std::to_string(core); + } else { + name = "CPUThread"; + } MicroProfileOnThreadCreate(name.c_str()); Common::SetCurrentThreadName(name.c_str()); Common::SetCurrentThreadPriority(Common::ThreadPriority::Critical); auto& data = core_data[core]; data.host_context = Common::Fiber::ThreadToFiber(); + // Cleanup SCOPE_EXIT { data.host_context->Exit(); MicroProfileOnThreadExit(); }; + // Running if (!gpu_barrier->Sync(token)) { return; } diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 6e53db3640..f7eae9c598 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -6,7 +6,6 @@ #include #include #include -#include #include "common/assert.h" #include "common/atomic_ops.h" @@ -33,18 +32,17 @@ namespace Core::Memory { namespace { -constexpr size_t PAGE_SIZE = 0x1000; -constexpr size_t PAGE_BITS = 12; -constexpr size_t PAGE_MASK = PAGE_SIZE - 1; - -inline bool AddressSpaceContains(const Common::PageTable& table, const Common::ProcessAddress addr, - const std::size_t size) { +bool AddressSpaceContains(const Common::PageTable& table, const Common::ProcessAddress addr, + const std::size_t size) { const Common::ProcessAddress max_addr = 1ULL << table.GetAddressSpaceBits(); return addr + size >= addr && addr + size <= max_addr; } -} // Anonymous namespace +} // namespace +// Implementation class used to keep the specifics of the memory subsystem hidden +// from outside classes. This also allows modification to the internals of the memory +// subsystem without needing to rebuild all files that make use of the memory interface. struct Memory::Impl { explicit Impl(Core::System& system_) : system{system_} {} @@ -68,11 +66,12 @@ struct Memory::Impl { void MapMemoryRegion(Common::PageTable& page_table, Common::ProcessAddress base, u64 size, Common::PhysicalAddress target, Common::MemoryPermission perms, bool separate_heap) { - ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: {:016X}", size); - ASSERT_MSG((base & PAGE_MASK) == 0, "non-page aligned base: {:016X}", GetInteger(base)); + ASSERT_MSG((size & SUYU_PAGEMASK) == 0, "non-page aligned size: {:016X}", size); + ASSERT_MSG((base & SUYU_PAGEMASK) == 0, "non-page aligned base: {:016X}", GetInteger(base)); ASSERT_MSG(target >= DramMemoryMap::Base, "Out of bounds target: {:016X}", GetInteger(target)); - MapPages(page_table, base / PAGE_SIZE, size / PAGE_SIZE, target, Common::PageType::Memory); + MapPages(page_table, base / SUYU_PAGESIZE, size / SUYU_PAGESIZE, target, + Common::PageType::Memory); if (current_page_table->fastmem_arena) { buffer->Map(GetInteger(base), GetInteger(target) - DramMemoryMap::Base, size, perms, @@ -82,9 +81,10 @@ struct Memory::Impl { void UnmapRegion(Common::PageTable& page_table, Common::ProcessAddress base, u64 size, bool separate_heap) { - ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: {:016X}", size); - ASSERT_MSG((base & PAGE_MASK) == 0, "non-page aligned base: {:016X}", GetInteger(base)); - MapPages(page_table, base / PAGE_SIZE, size / PAGE_SIZE, 0, Common::PageType::Unmapped); + ASSERT_MSG((size & SUYU_PAGEMASK) == 0, "non-page aligned size: {:016X}", size); + ASSERT_MSG((base & SUYU_PAGEMASK) == 0, "non-page aligned base: {:016X}", GetInteger(base)); + MapPages(page_table, base / SUYU_PAGESIZE, size / SUYU_PAGESIZE, 0, + Common::PageType::Unmapped); if (current_page_table->fastmem_arena) { buffer->Unmap(GetInteger(base), size, separate_heap); @@ -93,28 +93,55 @@ struct Memory::Impl { void ProtectRegion(Common::PageTable& page_table, VAddr vaddr, u64 size, Common::MemoryPermission perms) { - ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: {:016X}", size); - ASSERT_MSG((vaddr & PAGE_MASK) == 0, "non-page aligned base: {:016X}", vaddr); + ASSERT_MSG((size & SUYU_PAGEMASK) == 0, "non-page aligned size: {:016X}", size); + ASSERT_MSG((vaddr & SUYU_PAGEMASK) == 0, "non-page aligned base: {:016X}", vaddr); if (!current_page_table->fastmem_arena) { return; } - for (u64 addr = vaddr; addr < vaddr + size; addr += PAGE_SIZE) { + u64 protect_bytes{}; + u64 protect_begin{}; + for (u64 addr = vaddr; addr < vaddr + size; addr += SUYU_PAGESIZE) { const Common::PageType page_type{ - current_page_table->pointers[addr >> PAGE_BITS].Type()}; - if (page_type != Common::PageType::RasterizerCachedMemory) { - buffer->Protect(addr, PAGE_SIZE, perms); + current_page_table->pointers[addr >> SUYU_PAGEBITS].Type()}; + switch (page_type) { + case Common::PageType::RasterizerCachedMemory: + if (protect_bytes > 0) { + buffer->Protect(protect_begin, protect_bytes, perms); + protect_bytes = 0; + } + break; + default: + if (protect_bytes == 0) { + protect_begin = addr; + } + protect_bytes += SUYU_PAGESIZE; } } + + if (protect_bytes > 0) { + buffer->Protect(protect_begin, protect_bytes, perms); + } } - u8* GetPointerFromRasterizerCachedMemory(u64 vaddr) const { + [[nodiscard]] u8* GetPointerFromRasterizerCachedMemory(u64 vaddr) const { const Common::PhysicalAddress paddr{ - current_page_table->backing_addr[vaddr >> PAGE_BITS]}; + current_page_table->backing_addr[vaddr >> SUYU_PAGEBITS]}; if (!paddr) { - return nullptr; + return {}; + } + + return system.DeviceMemory().GetPointer(paddr + vaddr); + } + + [[nodiscard]] u8* GetPointerFromDebugMemory(u64 vaddr) const { + const Common::PhysicalAddress paddr{ + current_page_table->backing_addr[vaddr >> SUYU_PAGEBITS]}; + + if (paddr == 0) { + return {}; } return system.DeviceMemory().GetPointer(paddr + vaddr); @@ -128,7 +155,9 @@ struct Memory::Impl { if ((addr & 1) == 0) { return Read(addr); } else { - return Read(addr) | static_cast(Read(addr + sizeof(u8))) << 8; + const u32 a{Read(addr)}; + const u32 b{Read(addr + sizeof(u8))}; + return static_cast((b << 8) | a); } } @@ -136,7 +165,9 @@ struct Memory::Impl { if ((addr & 3) == 0) { return Read(addr); } else { - return Read16(addr) | static_cast(Read16(addr + sizeof(u16))) << 16; + const u32 a{Read16(addr)}; + const u32 b{Read16(addr + sizeof(u16))}; + return (b << 16) | a; } } @@ -144,7 +175,9 @@ struct Memory::Impl { if ((addr & 7) == 0) { return Read(addr); } else { - return Read32(addr) | static_cast(Read32(addr + sizeof(u32))) << 32; + const u32 a{Read32(addr)}; + const u32 b{Read32(addr + sizeof(u32))}; + return (static_cast(b) << 32) | a; } } @@ -199,7 +232,7 @@ struct Memory::Impl { std::string string; string.reserve(max_length); for (std::size_t i = 0; i < max_length; ++i) { - const char c = Read(vaddr); + const char c = Read(vaddr); if (c == '\0') { break; } @@ -210,72 +243,648 @@ struct Memory::Impl { return string; } - template - T Read(const Common::ProcessAddress vaddr) { - T value; - const u8* const ptr = GetPointerFromRasterizerCachedMemory(GetInteger(vaddr)); - if (ptr) { - std::memcpy(&value, ptr, sizeof(T)); - } else { - LOG_ERROR(HW_Memory, "Unmapped Read{} @ 0x{:016X}", sizeof(T) * 8, GetInteger(vaddr)); - value = 0; + bool WalkBlock(const Common::ProcessAddress addr, const std::size_t size, auto on_unmapped, + auto on_memory, auto on_rasterizer, auto increment) { + const auto& page_table = *current_page_table; + std::size_t remaining_size = size; + std::size_t page_index = addr >> SUYU_PAGEBITS; + std::size_t page_offset = addr & SUYU_PAGEMASK; + bool user_accessible = true; + + if (!AddressSpaceContains(page_table, addr, size)) [[unlikely]] { + on_unmapped(size, addr); + return false; } - return value; + + while (remaining_size) { + const std::size_t copy_amount = + std::min(static_cast(SUYU_PAGESIZE) - page_offset, remaining_size); + const auto current_vaddr = + static_cast((page_index << SUYU_PAGEBITS) + page_offset); + + const auto [pointer, type] = page_table.pointers[page_index].PointerType(); + switch (type) { + case Common::PageType::Unmapped: { + user_accessible = false; + on_unmapped(copy_amount, current_vaddr); + break; + } + case Common::PageType::Memory: { + u8* mem_ptr = + reinterpret_cast(pointer + page_offset + (page_index << SUYU_PAGEBITS)); + on_memory(copy_amount, mem_ptr); + break; + } + case Common::PageType::DebugMemory: { + u8* const mem_ptr{GetPointerFromDebugMemory(current_vaddr)}; + on_memory(copy_amount, mem_ptr); + break; + } + case Common::PageType::RasterizerCachedMemory: { + u8* const host_ptr{GetPointerFromRasterizerCachedMemory(current_vaddr)}; + on_rasterizer(current_vaddr, copy_amount, host_ptr); + break; + } + default: + UNREACHABLE(); + } + + page_index++; + page_offset = 0; + increment(copy_amount); + remaining_size -= copy_amount; + } + + return user_accessible; } + template + bool ReadBlockImpl(const Common::ProcessAddress src_addr, void* dest_buffer, + const std::size_t size) { + return WalkBlock( + src_addr, size, + [src_addr, size, &dest_buffer](const std::size_t copy_amount, + const Common::ProcessAddress current_vaddr) { + LOG_ERROR(HW_Memory, + "Unmapped ReadBlock @ 0x{:016X} (start address = 0x{:016X}, size = {})", + GetInteger(current_vaddr), GetInteger(src_addr), size); + std::memset(dest_buffer, 0, copy_amount); + }, + [&](const std::size_t copy_amount, const u8* const src_ptr) { + std::memcpy(dest_buffer, src_ptr, copy_amount); + }, + [&](const Common::ProcessAddress current_vaddr, const std::size_t copy_amount, + const u8* const host_ptr) { + if constexpr (!UNSAFE) { + HandleRasterizerDownload(GetInteger(current_vaddr), copy_amount); + } + std::memcpy(dest_buffer, host_ptr, copy_amount); + }, + [&](const std::size_t copy_amount) { + dest_buffer = static_cast(dest_buffer) + copy_amount; + }); + } + + bool ReadBlock(const Common::ProcessAddress src_addr, void* dest_buffer, + const std::size_t size) { + return ReadBlockImpl(src_addr, dest_buffer, size); + } + + bool ReadBlockUnsafe(const Common::ProcessAddress src_addr, void* dest_buffer, + const std::size_t size) { + return ReadBlockImpl(src_addr, dest_buffer, size); + } + + const u8* GetSpan(const VAddr src_addr, const std::size_t size) const { + if (current_page_table->blocks[src_addr >> SUYU_PAGEBITS] == + current_page_table->blocks[(src_addr + size) >> SUYU_PAGEBITS]) { + return GetPointerSilent(src_addr); + } + return nullptr; + } + + u8* GetSpan(const VAddr src_addr, const std::size_t size) { + if (current_page_table->blocks[src_addr >> SUYU_PAGEBITS] == + current_page_table->blocks[(src_addr + size) >> SUYU_PAGEBITS]) { + return GetPointerSilent(src_addr); + } + return nullptr; + } + + template + bool WriteBlockImpl(const Common::ProcessAddress dest_addr, const void* src_buffer, + const std::size_t size) { + return WalkBlock( + dest_addr, size, + [dest_addr, size](const std::size_t copy_amount, + const Common::ProcessAddress current_vaddr) { + LOG_ERROR(HW_Memory, + "Unmapped WriteBlock @ 0x{:016X} (start address = 0x{:016X}, size = {})", + GetInteger(current_vaddr), GetInteger(dest_addr), size); + }, + [&](const std::size_t copy_amount, u8* const dest_ptr) { + std::memcpy(dest_ptr, src_buffer, copy_amount); + }, + [&](const Common::ProcessAddress current_vaddr, const std::size_t copy_amount, + u8* const host_ptr) { + if constexpr (!UNSAFE) { + HandleRasterizerWrite(GetInteger(current_vaddr), copy_amount); + } + std::memcpy(host_ptr, src_buffer, copy_amount); + }, + [&](const std::size_t copy_amount) { + src_buffer = static_cast(src_buffer) + copy_amount; + }); + } + + bool WriteBlock(const Common::ProcessAddress dest_addr, const void* src_buffer, + const std::size_t size) { + return WriteBlockImpl(dest_addr, src_buffer, size); + } + + bool WriteBlockUnsafe(const Common::ProcessAddress dest_addr, const void* src_buffer, + const std::size_t size) { + return WriteBlockImpl(dest_addr, src_buffer, size); + } + + bool ZeroBlock(const Common::ProcessAddress dest_addr, const std::size_t size) { + return WalkBlock( + dest_addr, size, + [dest_addr, size](const std::size_t copy_amount, + const Common::ProcessAddress current_vaddr) { + LOG_ERROR(HW_Memory, + "Unmapped ZeroBlock @ 0x{:016X} (start address = 0x{:016X}, size = {})", + GetInteger(current_vaddr), GetInteger(dest_addr), size); + }, + [](const std::size_t copy_amount, u8* const dest_ptr) { + std::memset(dest_ptr, 0, copy_amount); + }, + [&](const Common::ProcessAddress current_vaddr, const std::size_t copy_amount, + u8* const host_ptr) { + HandleRasterizerWrite(GetInteger(current_vaddr), copy_amount); + std::memset(host_ptr, 0, copy_amount); + }, + [](const std::size_t copy_amount) {}); + } + + bool CopyBlock(Common::ProcessAddress dest_addr, Common::ProcessAddress src_addr, + const std::size_t size) { + return WalkBlock( + dest_addr, size, + [&](const std::size_t copy_amount, const Common::ProcessAddress current_vaddr) { + LOG_ERROR(HW_Memory, + "Unmapped CopyBlock @ 0x{:016X} (start address = 0x{:016X}, size = {})", + GetInteger(current_vaddr), GetInteger(src_addr), size); + ZeroBlock(dest_addr, copy_amount); + }, + [&](const std::size_t copy_amount, const u8* const src_ptr) { + WriteBlockImpl(dest_addr, src_ptr, copy_amount); + }, + [&](const Common::ProcessAddress current_vaddr, const std::size_t copy_amount, + u8* const host_ptr) { + HandleRasterizerDownload(GetInteger(current_vaddr), copy_amount); + WriteBlockImpl(dest_addr, host_ptr, copy_amount); + }, + [&](const std::size_t copy_amount) { + dest_addr += copy_amount; + src_addr += copy_amount; + }); + } + + template + Result PerformCacheOperation(Common::ProcessAddress dest_addr, std::size_t size, + Callback&& cb) { + class InvalidMemoryException : public std::exception {}; + + try { + WalkBlock( + dest_addr, size, + [&](const std::size_t block_size, const Common::ProcessAddress current_vaddr) { + LOG_ERROR(HW_Memory, "Unmapped cache maintenance @ {:#018X}", + GetInteger(current_vaddr)); + throw InvalidMemoryException(); + }, + [&](const std::size_t block_size, u8* const host_ptr) {}, + [&](const Common::ProcessAddress current_vaddr, const std::size_t block_size, + u8* const host_ptr) { cb(current_vaddr, block_size); }, + [](const std::size_t block_size) {}); + } catch (InvalidMemoryException&) { + return Kernel::ResultInvalidCurrentMemory; + } + + return ResultSuccess; + } + + Result InvalidateDataCache(Common::ProcessAddress dest_addr, std::size_t size) { + auto on_rasterizer = [&](const Common::ProcessAddress current_vaddr, + const std::size_t block_size) { + // dc ivac: Invalidate to point of coherency + // GPU flush -> CPU invalidate + HandleRasterizerDownload(GetInteger(current_vaddr), block_size); + }; + return PerformCacheOperation(dest_addr, size, on_rasterizer); + } + + Result StoreDataCache(Common::ProcessAddress dest_addr, std::size_t size) { + auto on_rasterizer = [&](const Common::ProcessAddress current_vaddr, + const std::size_t block_size) { + // dc cvac: Store to point of coherency + // CPU flush -> GPU invalidate + HandleRasterizerWrite(GetInteger(current_vaddr), block_size); + }; + return PerformCacheOperation(dest_addr, size, on_rasterizer); + } + + Result FlushDataCache(Common::ProcessAddress dest_addr, std::size_t size) { + auto on_rasterizer = [&](const Common::ProcessAddress current_vaddr, + const std::size_t block_size) { + // dc civac: Store to point of coherency, and invalidate from cache + // CPU flush -> GPU invalidate + HandleRasterizerWrite(GetInteger(current_vaddr), block_size); + }; + return PerformCacheOperation(dest_addr, size, on_rasterizer); + } + + void MarkRegionDebug(u64 vaddr, u64 size, bool debug) { + if (vaddr == 0 || !AddressSpaceContains(*current_page_table, vaddr, size)) { + return; + } + + if (current_page_table->fastmem_arena) { + const auto perm{debug ? Common::MemoryPermission{} + : Common::MemoryPermission::ReadWrite}; + buffer->Protect(vaddr, size, perm); + } + + // Iterate over a contiguous CPU address space, marking/unmarking the region. + // The region is at a granularity of CPU pages. + + const u64 num_pages = ((vaddr + size - 1) >> SUYU_PAGEBITS) - (vaddr >> SUYU_PAGEBITS) + 1; + for (u64 i = 0; i < num_pages; ++i, vaddr += SUYU_PAGESIZE) { + const Common::PageType page_type{ + current_page_table->pointers[vaddr >> SUYU_PAGEBITS].Type()}; + if (debug) { + // Switch page type to debug if now debug + switch (page_type) { + case Common::PageType::Unmapped: + ASSERT_MSG(false, "Attempted to mark unmapped pages as debug"); + break; + case Common::PageType::RasterizerCachedMemory: + case Common::PageType::DebugMemory: + // Page is already marked. + break; + case Common::PageType::Memory: + current_page_table->pointers[vaddr >> SUYU_PAGEBITS].Store( + 0, Common::PageType::DebugMemory); + break; + default: + UNREACHABLE(); + } + } else { + // Switch page type to non-debug if now non-debug + switch (page_type) { + case Common::PageType::Unmapped: + ASSERT_MSG(false, "Attempted to mark unmapped pages as non-debug"); + break; + case Common::PageType::RasterizerCachedMemory: + case Common::PageType::Memory: + // Don't mess with already non-debug or rasterizer memory. + break; + case Common::PageType::DebugMemory: { + u8* const pointer{GetPointerFromDebugMemory(vaddr & ~SUYU_PAGEMASK)}; + current_page_table->pointers[vaddr >> SUYU_PAGEBITS].Store( + reinterpret_cast(pointer) - (vaddr & ~SUYU_PAGEMASK), + Common::PageType::Memory); + break; + } + default: + UNREACHABLE(); + } + } + } + } + + void RasterizerMarkRegionCached(u64 vaddr, u64 size, bool cached) { + if (vaddr == 0 || !AddressSpaceContains(*current_page_table, vaddr, size)) { + return; + } + + if (current_page_table->fastmem_arena) { + Common::MemoryPermission perm{}; + if (!Settings::values.use_reactive_flushing.GetValue() || !cached) { + perm |= Common::MemoryPermission::Read; + } + if (!cached) { + perm |= Common::MemoryPermission::Write; + } + buffer->Protect(vaddr, size, perm); + } + + // Iterate over a contiguous CPU address space, which corresponds to the specified GPU + // address space, marking the region as un/cached. The region is marked un/cached at a + // granularity of CPU pages, hence why we iterate on a CPU page basis (note: GPU page size + // is different). This assumes the specified GPU address region is contiguous as well. + + const u64 num_pages = ((vaddr + size - 1) >> SUYU_PAGEBITS) - (vaddr >> SUYU_PAGEBITS) + 1; + for (u64 i = 0; i < num_pages; ++i, vaddr += SUYU_PAGESIZE) { + const Common::PageType page_type{ + current_page_table->pointers[vaddr >> SUYU_PAGEBITS].Type()}; + if (cached) { + // Switch page type to cached if now cached + switch (page_type) { + case Common::PageType::Unmapped: + // It is not necessary for a process to have this region mapped into its address + // space, for example, a system module need not have a VRAM mapping. + break; + case Common::PageType::DebugMemory: + case Common::PageType::Memory: + current_page_table->pointers[vaddr >> SUYU_PAGEBITS].Store( + 0, Common::PageType::RasterizerCachedMemory); + break; + case Common::PageType::RasterizerCachedMemory: + // There can be more than one GPU region mapped per CPU region, so it's common + // that this area is already marked as cached. + break; + default: + UNREACHABLE(); + } + } else { + // Switch page type to uncached if now uncached + switch (page_type) { + case Common::PageType::Unmapped: // NOLINT(bugprone-branch-clone) + // It is not necessary for a process to have this region mapped into its address + // space, for example, a system module need not have a VRAM mapping. + break; + case Common::PageType::DebugMemory: + case Common::PageType::Memory: + // There can be more than one GPU region mapped per CPU region, so it's common + // that this area is already unmarked as cached. + break; + case Common::PageType::RasterizerCachedMemory: { + u8* const pointer{GetPointerFromRasterizerCachedMemory(vaddr & ~SUYU_PAGEMASK)}; + if (pointer == nullptr) { + // It's possible that this function has been called while updating the + // pagetable after unmapping a VMA. In that case the underlying VMA will no + // longer exist, and we should just leave the pagetable entry blank. + current_page_table->pointers[vaddr >> SUYU_PAGEBITS].Store( + 0, Common::PageType::Unmapped); + } else { + current_page_table->pointers[vaddr >> SUYU_PAGEBITS].Store( + reinterpret_cast(pointer) - (vaddr & ~SUYU_PAGEMASK), + Common::PageType::Memory); + } + break; + } + default: + UNREACHABLE(); + } + } + } + } + + /** + * Maps a region of pages as a specific type. + * + * @param page_table The page table to use to perform the mapping. + * @param base The base address to begin mapping at. + * @param size The total size of the range in bytes. + * @param target The target address to begin mapping from. + * @param type The page type to map the memory as. + */ + void MapPages(Common::PageTable& page_table, Common::ProcessAddress base_address, u64 size, + Common::PhysicalAddress target, Common::PageType type) { + auto base = GetInteger(base_address); + + LOG_DEBUG(HW_Memory, "Mapping {:016X} onto {:016X}-{:016X}", GetInteger(target), + base * SUYU_PAGESIZE, (base + size) * SUYU_PAGESIZE); + + const auto end = base + size; + ASSERT_MSG(end <= page_table.pointers.size(), "out of range mapping at {:016X}", + base + page_table.pointers.size()); + + if (!target) { + ASSERT_MSG(type != Common::PageType::Memory, + "Mapping memory page without a pointer @ {:016x}", base * SUYU_PAGESIZE); + + while (base != end) { + page_table.pointers[base].Store(0, type); + page_table.backing_addr[base] = 0; + page_table.blocks[base] = 0; + base += 1; + } + } else { + auto orig_base = base; + while (base != end) { + auto host_ptr = + reinterpret_cast(system.DeviceMemory().GetPointer(target)) - + (base << SUYU_PAGEBITS); + auto backing = GetInteger(target) - (base << SUYU_PAGEBITS); + page_table.pointers[base].Store(host_ptr, type); + page_table.backing_addr[base] = backing; + page_table.blocks[base] = orig_base << SUYU_PAGEBITS; + + ASSERT_MSG(page_table.pointers[base].Pointer(), + "memory mapping base yield a nullptr within the table"); + + base += 1; + target += SUYU_PAGESIZE; + } + } + } + + [[nodiscard]] u8* GetPointerImpl(u64 vaddr, auto on_unmapped, auto on_rasterizer) const { + // AARCH64 masks the upper 16 bit of all memory accesses + vaddr = vaddr & 0xffffffffffffULL; + + if (!AddressSpaceContains(*current_page_table, vaddr, 1)) [[unlikely]] { + on_unmapped(); + return nullptr; + } + + // Avoid adding any extra logic to this fast-path block + const uintptr_t raw_pointer = current_page_table->pointers[vaddr >> SUYU_PAGEBITS].Raw(); + if (const uintptr_t pointer = Common::PageTable::PageInfo::ExtractPointer(raw_pointer)) { + return reinterpret_cast(pointer + vaddr); + } + switch (Common::PageTable::PageInfo::ExtractType(raw_pointer)) { + case Common::PageType::Unmapped: + on_unmapped(); + return nullptr; + case Common::PageType::Memory: + ASSERT_MSG(false, "Mapped memory page without a pointer @ 0x{:016X}", vaddr); + return nullptr; + case Common::PageType::DebugMemory: + return GetPointerFromDebugMemory(vaddr); + case Common::PageType::RasterizerCachedMemory: { + u8* const host_ptr{GetPointerFromRasterizerCachedMemory(vaddr)}; + on_rasterizer(); + return host_ptr; + } + default: + UNREACHABLE(); + } + return nullptr; + } + + [[nodiscard]] u8* GetPointer(const Common::ProcessAddress vaddr) const { + return GetPointerImpl( + GetInteger(vaddr), + [vaddr]() { + LOG_ERROR(HW_Memory, "Unmapped GetPointer @ 0x{:016X}", GetInteger(vaddr)); + }, + []() {}); + } + + [[nodiscard]] u8* GetPointerSilent(const Common::ProcessAddress vaddr) const { + return GetPointerImpl( + GetInteger(vaddr), []() {}, []() {}); + } + + /** + * Reads a particular data type out of memory at the given virtual address. + * + * @param vaddr The virtual address to read the data type from. + * + * @tparam T The data type to read out of memory. This type *must* be + * trivially copyable, otherwise the behavior of this function + * is undefined. + * + * @returns The instance of T read from the specified virtual address. + */ + template + T Read(Common::ProcessAddress vaddr) { + T result = 0; + const u8* const ptr = GetPointerImpl( + GetInteger(vaddr), + [vaddr]() { + LOG_ERROR(HW_Memory, "Unmapped Read{} @ 0x{:016X}", sizeof(T) * 8, + GetInteger(vaddr)); + }, + [&]() { HandleRasterizerDownload(GetInteger(vaddr), sizeof(T)); }); + if (ptr) { + std::memcpy(&result, ptr, sizeof(T)); + } + return result; + } + + /** + * Writes a particular data type to memory at the given virtual address. + * + * @param vaddr The virtual address to write the data type to. + * + * @tparam T The data type to write to memory. This type *must* be + * trivially copyable, otherwise the behavior of this function + * is undefined. + */ template void Write(Common::ProcessAddress vaddr, const T data) { - u8* const ptr = GetPointerFromRasterizerCachedMemory(GetInteger(vaddr)); + u8* const ptr = GetPointerImpl( + GetInteger(vaddr), + [vaddr, data]() { + LOG_ERROR(HW_Memory, "Unmapped Write{} @ 0x{:016X} = 0x{:016X}", sizeof(T) * 8, + GetInteger(vaddr), static_cast(data)); + }, + [&]() { HandleRasterizerWrite(GetInteger(vaddr), sizeof(T)); }); if (ptr) { std::memcpy(ptr, &data, sizeof(T)); - system.GPU().InvalidateRegion(GetInteger(vaddr), sizeof(T)); - } else { - LOG_ERROR(HW_Memory, "Unmapped Write{} @ 0x{:016X} = 0x{:016X}", sizeof(T) * 8, - GetInteger(vaddr), static_cast(data)); } } template bool WriteExclusive(Common::ProcessAddress vaddr, const T data, const T expected) { - u8* const ptr = GetPointerFromRasterizerCachedMemory(GetInteger(vaddr)); + u8* const ptr = GetPointerImpl( + GetInteger(vaddr), + [vaddr, data]() { + LOG_ERROR(HW_Memory, "Unmapped WriteExclusive{} @ 0x{:016X} = 0x{:016X}", + sizeof(T) * 8, GetInteger(vaddr), static_cast(data)); + }, + [&]() { HandleRasterizerWrite(GetInteger(vaddr), sizeof(T)); }); if (ptr) { - const bool result = Common::AtomicCompareAndSwap(reinterpret_cast(ptr), data, expected); - if (result) { - system.GPU().InvalidateRegion(GetInteger(vaddr), sizeof(T)); + return Common::AtomicCompareAndSwap(reinterpret_cast(ptr), data, expected); + } + return true; + } + + bool WriteExclusive128(Common::ProcessAddress vaddr, const u128 data, const u128 expected) { + u8* const ptr = GetPointerImpl( + GetInteger(vaddr), + [vaddr, data]() { + LOG_ERROR(HW_Memory, "Unmapped WriteExclusive128 @ 0x{:016X} = 0x{:016X}{:016X}", + GetInteger(vaddr), static_cast(data[1]), static_cast(data[0])); + }, + [&]() { HandleRasterizerWrite(GetInteger(vaddr), sizeof(u128)); }); + if (ptr) { + return Common::AtomicCompareAndSwap(reinterpret_cast(ptr), data, expected); + } + return true; + } + + void HandleRasterizerDownload(VAddr v_address, size_t size) { + const auto* p = GetPointerImpl( + v_address, []() {}, []() {}); + if (!gpu_device_memory) [[unlikely]] { + gpu_device_memory = &system.Host1x().MemoryManager(); + } + const size_t core = system.GetCurrentHostThreadID(); + auto& current_area = rasterizer_read_areas[core]; + gpu_device_memory->ApplyOpOnPointer(p, scratch_buffers[core], [&](DAddr address) { + const DAddr end_address = address + size; + if (current_area.start_address <= address && end_address <= current_area.end_address) + [[likely]] { + return; } - return result; - } else { - LOG_ERROR(HW_Memory, "Unmapped WriteExclusive{} @ 0x{:016X} = 0x{:016X}", sizeof(T) * 8, - GetInteger(vaddr), static_cast(data)); - return true; - } + current_area = system.GPU().OnCPURead(address, size); + }); } - bool ReadBlock(const Common::ProcessAddress src_addr, void* dest_buffer, - const std::size_t size) { - const u8* src_ptr = GetPointerFromRasterizerCachedMemory(GetInteger(src_addr)); - if (src_ptr) { - std::memcpy(dest_buffer, src_ptr, size); - return true; + void HandleRasterizerWrite(VAddr v_address, size_t size) { + const auto* p = GetPointerImpl( + v_address, []() {}, []() {}); + constexpr size_t sys_core = Core::Hardware::NUM_CPU_CORES - 1; + const size_t core = std::min(system.GetCurrentHostThreadID(), + sys_core); // any other calls threads go to syscore. + if (!gpu_device_memory) [[unlikely]] { + gpu_device_memory = &system.Host1x().MemoryManager(); } - LOG_ERROR(HW_Memory, "Unmapped ReadBlock @ 0x{:016X}", GetInteger(src_addr)); - return false; + // Guard on sys_core; + if (core == sys_core) [[unlikely]] { + sys_core_guard.lock(); + } + SCOPE_EXIT { + if (core == sys_core) [[unlikely]] { + sys_core_guard.unlock(); + } + }; + gpu_device_memory->ApplyOpOnPointer(p, scratch_buffers[core], [&](DAddr address) { + auto& current_area = rasterizer_write_areas[core]; + PAddr subaddress = address >> SUYU_PAGEBITS; + bool do_collection = current_area.last_address == subaddress; + if (!do_collection) [[unlikely]] { + do_collection = system.GPU().OnCPUWrite(address, size); + if (!do_collection) { + return; + } + current_area.last_address = subaddress; + } + gpu_dirty_managers[core].Collect(address, size); + }); } - bool WriteBlock(const Common::ProcessAddress dest_addr, const void* src_buffer, - const std::size_t size) { - u8* const dest_ptr = GetPointerFromRasterizerCachedMemory(GetInteger(dest_addr)); - if (dest_ptr) { - std::memcpy(dest_ptr, src_buffer, size); - system.GPU().InvalidateRegion(GetInteger(dest_addr), size); - return true; + struct GPUDirtyState { + PAddr last_address; + }; + + void InvalidateGPUMemory(u8* p, size_t size) { + constexpr size_t sys_core = Core::Hardware::NUM_CPU_CORES - 1; + const size_t core = std::min(system.GetCurrentHostThreadID(), + sys_core); // any other calls threads go to syscore. + if (!gpu_device_memory) [[unlikely]] { + gpu_device_memory = &system.Host1x().MemoryManager(); } - LOG_ERROR(HW_Memory, "Unmapped WriteBlock @ 0x{:016X}", GetInteger(dest_addr)); - return false; + // Guard on sys_core; + if (core == sys_core) [[unlikely]] { + sys_core_guard.lock(); + } + SCOPE_EXIT { + if (core == sys_core) [[unlikely]] { + sys_core_guard.unlock(); + } + }; + auto& gpu = system.GPU(); + gpu_device_memory->ApplyOpOnPointer( + p, scratch_buffers[core], [&](DAddr address) { gpu.InvalidateRegion(address, size); }); } Core::System& system; + Tegra::MaxwellDeviceMemoryManager* gpu_device_memory{}; Common::PageTable* current_page_table = nullptr; + std::array + rasterizer_read_areas{}; + std::array rasterizer_write_areas{}; + std::array, Core::Hardware::NUM_CPU_CORES> scratch_buffers{}; + std::span gpu_dirty_managers; + std::mutex sys_core_guard; + std::optional heap_tracker; #ifdef __linux__ Common::HeapTracker* buffer{}; @@ -284,10 +893,16 @@ struct Memory::Impl { #endif }; -Memory::Memory(Core::System& system_) : impl{std::make_unique(system_)} {} +Memory::Memory(Core::System& system_) : system{system_} { + Reset(); +} Memory::~Memory() = default; +void Memory::Reset() { + impl = std::make_unique(system); +} + void Memory::SetCurrentPageTable(Kernel::KProcess& process) { impl->SetCurrentPageTable(process); } @@ -310,20 +925,38 @@ void Memory::ProtectRegion(Common::PageTable& page_table, Common::ProcessAddress bool Memory::IsValidVirtualAddress(const Common::ProcessAddress vaddr) const { const auto& page_table = *impl->current_page_table; - const size_t page = vaddr >> PAGE_BITS; + const size_t page = vaddr >> SUYU_PAGEBITS; if (page >= page_table.pointers.size()) { return false; } const auto [pointer, type] = page_table.pointers[page].PointerType(); - return pointer != 0 || type == Common::PageType::RasterizerCachedMemory; + return pointer != 0 || type == Common::PageType::RasterizerCachedMemory || + type == Common::PageType::DebugMemory; +} + +bool Memory::IsValidVirtualAddressRange(Common::ProcessAddress base, u64 size) const { + Common::ProcessAddress end = base + size; + Common::ProcessAddress page = Common::AlignDown(GetInteger(base), SUYU_PAGESIZE); + + for (; page < end; page += SUYU_PAGESIZE) { + if (!IsValidVirtualAddress(page)) { + return false; + } + } + + return true; } u8* Memory::GetPointer(Common::ProcessAddress vaddr) { - return impl->GetPointerFromRasterizerCachedMemory(GetInteger(vaddr)); + return impl->GetPointer(vaddr); +} + +u8* Memory::GetPointerSilent(Common::ProcessAddress vaddr) { + return impl->GetPointerSilent(vaddr); } const u8* Memory::GetPointer(Common::ProcessAddress vaddr) const { - return impl->GetPointerFromRasterizerCachedMemory(GetInteger(vaddr)); + return impl->GetPointer(vaddr); } u8 Memory::Read8(const Common::ProcessAddress addr) { @@ -374,6 +1007,10 @@ bool Memory::WriteExclusive64(Common::ProcessAddress addr, u64 data, u64 expecte return impl->WriteExclusive64(addr, data, expected); } +bool Memory::WriteExclusive128(Common::ProcessAddress addr, u128 data, u128 expected) { + return impl->WriteExclusive128(addr, data, expected); +} + std::string Memory::ReadCString(Common::ProcessAddress vaddr, std::size_t max_length) { return impl->ReadCString(vaddr, max_length); } @@ -383,9 +1020,93 @@ bool Memory::ReadBlock(const Common::ProcessAddress src_addr, void* dest_buffer, return impl->ReadBlock(src_addr, dest_buffer, size); } +bool Memory::ReadBlockUnsafe(const Common::ProcessAddress src_addr, void* dest_buffer, + const std::size_t size) { + return impl->ReadBlockUnsafe(src_addr, dest_buffer, size); +} + +const u8* Memory::GetSpan(const VAddr src_addr, const std::size_t size) const { + return impl->GetSpan(src_addr, size); +} + +u8* Memory::GetSpan(const VAddr src_addr, const std::size_t size) { + return impl->GetSpan(src_addr, size); +} + bool Memory::WriteBlock(const Common::ProcessAddress dest_addr, const void* src_buffer, const std::size_t size) { return impl->WriteBlock(dest_addr, src_buffer, size); } +bool Memory::WriteBlockUnsafe(const Common::ProcessAddress dest_addr, const void* src_buffer, + const std::size_t size) { + return impl->WriteBlockUnsafe(dest_addr, src_buffer, size); +} + +bool Memory::CopyBlock(Common::ProcessAddress dest_addr, Common::ProcessAddress src_addr, + const std::size_t size) { + return impl->CopyBlock(dest_addr, src_addr, size); +} + +bool Memory::ZeroBlock(Common::ProcessAddress dest_addr, const std::size_t size) { + return impl->ZeroBlock(dest_addr, size); +} + +void Memory::SetGPUDirtyManagers(std::span managers) { + impl->gpu_dirty_managers = managers; +} + +Result Memory::InvalidateDataCache(Common::ProcessAddress dest_addr, const std::size_t size) { + return impl->InvalidateDataCache(dest_addr, size); +} + +Result Memory::StoreDataCache(Common::ProcessAddress dest_addr, const std::size_t size) { + return impl->StoreDataCache(dest_addr, size); +} + +Result Memory::FlushDataCache(Common::ProcessAddress dest_addr, const std::size_t size) { + return impl->FlushDataCache(dest_addr, size); +} + +void Memory::RasterizerMarkRegionCached(Common::ProcessAddress vaddr, u64 size, bool cached) { + impl->RasterizerMarkRegionCached(GetInteger(vaddr), size, cached); +} + +void Memory::MarkRegionDebug(Common::ProcessAddress vaddr, u64 size, bool debug) { + impl->MarkRegionDebug(GetInteger(vaddr), size, debug); +} + +bool Memory::InvalidateNCE(Common::ProcessAddress vaddr, size_t size) { + [[maybe_unused]] bool mapped = true; + [[maybe_unused]] bool rasterizer = false; + + u8* const ptr = impl->GetPointerImpl( + GetInteger(vaddr), + [&] { + LOG_ERROR(HW_Memory, "Unmapped InvalidateNCE for {} bytes @ {:#x}", size, + GetInteger(vaddr)); + mapped = false; + }, + [&] { rasterizer = true; }); + if (rasterizer) { + impl->InvalidateGPUMemory(ptr, size); + } + +#ifdef __linux__ + if (!rasterizer && mapped) { + impl->buffer->DeferredMapSeparateHeap(GetInteger(vaddr)); + } +#endif + + return mapped && ptr != nullptr; +} + +bool Memory::InvalidateSeparateHeap(void* fault_address) { +#ifdef __linux__ + return impl->buffer->DeferredMapSeparateHeap(static_cast(fault_address)); +#else + return false; +#endif +} + } // namespace Core::Memory diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp index dbc4dcf5ca..c816f47fec 100644 --- a/src/video_core/gpu.cpp +++ b/src/video_core/gpu.cpp @@ -40,23 +40,10 @@ struct GPU::Impl { explicit Impl(GPU& gpu_, Core::System& system_, bool is_async_, bool use_nvdec_) : gpu{gpu_}, system{system_}, host1x{system.Host1x()}, use_nvdec{use_nvdec_}, shader_notify{std::make_unique()}, is_async{is_async_}, - gpu_thread{system_, is_async_}, scheduler{std::make_unique(gpu)} { - Initialize(); - } + gpu_thread{system_, is_async_}, scheduler{std::make_unique(gpu)} {} ~Impl() = default; - void Initialize() { - // Initialize the GPU memory manager - memory_manager = std::make_unique(system); - - // Initialize the command buffer - command_buffer.reserve(COMMAND_BUFFER_SIZE); - - // Initialize the fence manager - fence_manager = std::make_unique(); - } - std::shared_ptr CreateChannel(s32 channel_id) { auto channel_state = std::make_shared(channel_id); channels.emplace(channel_id, channel_state); @@ -104,15 +91,14 @@ struct GPU::Impl { /// Flush all current written commands into the host GPU for execution. void FlushCommands() { - if (!command_buffer.empty()) { - rasterizer->ExecuteCommands(command_buffer); - command_buffer.clear(); - } + rasterizer->FlushCommands(); } /// Synchronizes CPU writes with Host GPU memory. void InvalidateGPUCache() { - rasterizer->InvalidateGPUCache(); + std::function callback_writes( + [this](PAddr address, size_t size) { rasterizer->OnCacheInvalidation(address, size); }); + system.GatherGPUDirtyMemory(callback_writes); } /// Signal the ending of command list. @@ -122,10 +108,11 @@ struct GPU::Impl { } /// Request a host GPU memory flush from the CPU. - u64 RequestSyncOperation(std::function&& action) { + template + [[nodiscard]] u64 RequestSyncOperation(Func&& action) { std::unique_lock lck{sync_request_mutex}; const u64 fence = ++last_sync_fence; - sync_requests.emplace_back(std::move(action), fence); + sync_requests.emplace_back(action); return fence; } @@ -143,12 +130,12 @@ struct GPU::Impl { void TickWork() { std::unique_lock lck{sync_request_mutex}; while (!sync_requests.empty()) { - auto& request = sync_requests.front(); + auto request = std::move(sync_requests.front()); + sync_requests.pop_front(); sync_request_mutex.unlock(); - request.first(); + request(); current_sync_fence.fetch_add(1, std::memory_order_release); sync_request_mutex.lock(); - sync_requests.pop_front(); sync_request_cv.notify_all(); } } @@ -235,6 +222,7 @@ struct GPU::Impl { /// This can be used to launch any necessary threads and register any necessary /// core timing events. void Start() { + Settings::UpdateGPUAccuracy(); gpu_thread.StartThread(*renderer, renderer->Context(), *scheduler); } @@ -264,7 +252,7 @@ struct GPU::Impl { /// Notify rasterizer that any caches of the specified region should be flushed to Switch memory void FlushRegion(DAddr addr, u64 size) { - rasterizer->FlushRegion(addr, size); + gpu_thread.FlushRegion(addr, size); } VideoCore::RasterizerDownloadArea OnCPURead(DAddr addr, u64 size) { @@ -284,7 +272,7 @@ struct GPU::Impl { /// Notify rasterizer that any caches of the specified region should be invalidated void InvalidateRegion(DAddr addr, u64 size) { - rasterizer->InvalidateRegion(addr, size); + gpu_thread.InvalidateRegion(addr, size); } bool OnCPUWrite(DAddr addr, u64 size) { @@ -293,7 +281,57 @@ struct GPU::Impl { /// Notify rasterizer that any caches of the specified region should be flushed and invalidated void FlushAndInvalidateRegion(DAddr addr, u64 size) { - rasterizer->FlushAndInvalidateRegion(addr, size); + gpu_thread.FlushAndInvalidateRegion(addr, size); + } + + void RequestComposite(std::vector&& layers, + std::vector&& fences) { + size_t num_fences{fences.size()}; + size_t current_request_counter{}; + { + std::unique_lock lk(request_swap_mutex); + if (free_swap_counters.empty()) { + current_request_counter = request_swap_counters.size(); + request_swap_counters.emplace_back(num_fences); + } else { + current_request_counter = free_swap_counters.front(); + request_swap_counters[current_request_counter] = num_fences; + free_swap_counters.pop_front(); + } + } + const auto wait_fence = + RequestSyncOperation([this, current_request_counter, &layers, &fences, num_fences] { + auto& syncpoint_manager = host1x.GetSyncpointManager(); + if (num_fences == 0) { + renderer->Composite(layers); + } + const auto executer = [this, current_request_counter, layers_copy = layers]() { + { + std::unique_lock lk(request_swap_mutex); + if (--request_swap_counters[current_request_counter] != 0) { + return; + } + free_swap_counters.push_back(current_request_counter); + } + renderer->Composite(layers_copy); + }; + for (size_t i = 0; i < num_fences; i++) { + syncpoint_manager.RegisterGuestAction(fences[i].id, fences[i].value, executer); + } + }); + gpu_thread.TickGPU(); + WaitForSyncOperation(wait_fence); + } + + std::vector GetAppletCaptureBuffer() { + std::vector out; + + const auto wait_fence = + RequestSyncOperation([&] { out = renderer->GetAppletCaptureBuffer(); }); + gpu_thread.TickGPU(); + WaitForSyncOperation(wait_fence); + + return out; } GPU& gpu; @@ -310,12 +348,16 @@ struct GPU::Impl { /// When true, we are about to shut down emulation session, so terminate outstanding tasks std::atomic_bool shutting_down{}; + std::array, Service::Nvidia::MaxSyncPoints> syncpoints{}; + + std::array, Service::Nvidia::MaxSyncPoints> syncpt_interrupts; + std::mutex sync_mutex; std::mutex device_mutex; std::condition_variable sync_cv; - std::list, u64>> sync_requests; + std::list> sync_requests; std::atomic current_sync_fence{}; u64 last_sync_fence{}; std::mutex sync_request_mutex; @@ -331,13 +373,182 @@ struct GPU::Impl { Tegra::Control::ChannelState* current_channel; s32 bound_channel{-1}; - std::unique_ptr memory_manager; - std::vector command_buffer; - std::unique_ptr fence_manager; - - static constexpr size_t COMMAND_BUFFER_SIZE = 4 * 1024 * 1024; + std::deque free_swap_counters; + std::deque request_swap_counters; + std::mutex request_swap_mutex; }; -// ... (rest of the implementation remains the same) +GPU::GPU(Core::System& system, bool is_async, bool use_nvdec) + : impl{std::make_unique(*this, system, is_async, use_nvdec)} {} + +GPU::~GPU() = default; + +std::shared_ptr GPU::AllocateChannel() { + return impl->AllocateChannel(); +} + +void GPU::InitChannel(Control::ChannelState& to_init, u64 program_id) { + impl->InitChannel(to_init, program_id); +} + +void GPU::BindChannel(s32 channel_id) { + impl->BindChannel(channel_id); +} + +void GPU::ReleaseChannel(Control::ChannelState& to_release) { + impl->ReleaseChannel(to_release); +} + +void GPU::InitAddressSpace(Tegra::MemoryManager& memory_manager) { + impl->InitAddressSpace(memory_manager); +} + +void GPU::BindRenderer(std::unique_ptr renderer) { + impl->BindRenderer(std::move(renderer)); +} + +void GPU::FlushCommands() { + impl->FlushCommands(); +} + +void GPU::InvalidateGPUCache() { + impl->InvalidateGPUCache(); +} + +void GPU::OnCommandListEnd() { + impl->OnCommandListEnd(); +} + +u64 GPU::RequestFlush(DAddr addr, std::size_t size) { + return impl->RequestSyncOperation( + [this, addr, size]() { impl->rasterizer->FlushRegion(addr, size); }); +} + +u64 GPU::CurrentSyncRequestFence() const { + return impl->CurrentSyncRequestFence(); +} + +void GPU::WaitForSyncOperation(u64 fence) { + return impl->WaitForSyncOperation(fence); +} + +void GPU::TickWork() { + impl->TickWork(); +} + +/// Gets a mutable reference to the Host1x interface +Host1x::Host1x& GPU::Host1x() { + return impl->host1x; +} + +/// Gets an immutable reference to the Host1x interface. +const Host1x::Host1x& GPU::Host1x() const { + return impl->host1x; +} + +Engines::Maxwell3D& GPU::Maxwell3D() { + return impl->Maxwell3D(); +} + +const Engines::Maxwell3D& GPU::Maxwell3D() const { + return impl->Maxwell3D(); +} + +Engines::KeplerCompute& GPU::KeplerCompute() { + return impl->KeplerCompute(); +} + +const Engines::KeplerCompute& GPU::KeplerCompute() const { + return impl->KeplerCompute(); +} + +Tegra::DmaPusher& GPU::DmaPusher() { + return impl->DmaPusher(); +} + +const Tegra::DmaPusher& GPU::DmaPusher() const { + return impl->DmaPusher(); +} + +VideoCore::RendererBase& GPU::Renderer() { + return impl->Renderer(); +} + +const VideoCore::RendererBase& GPU::Renderer() const { + return impl->Renderer(); +} + +VideoCore::ShaderNotify& GPU::ShaderNotify() { + return impl->ShaderNotify(); +} + +const VideoCore::ShaderNotify& GPU::ShaderNotify() const { + return impl->ShaderNotify(); +} + +void GPU::RequestComposite(std::vector&& layers, + std::vector&& fences) { + impl->RequestComposite(std::move(layers), std::move(fences)); +} + +std::vector GPU::GetAppletCaptureBuffer() { + return impl->GetAppletCaptureBuffer(); +} + +u64 GPU::GetTicks() const { + return impl->GetTicks(); +} + +bool GPU::IsAsync() const { + return impl->IsAsync(); +} + +bool GPU::UseNvdec() const { + return impl->UseNvdec(); +} + +void GPU::RendererFrameEndNotify() { + impl->RendererFrameEndNotify(); +} + +void GPU::Start() { + impl->Start(); +} + +void GPU::NotifyShutdown() { + impl->NotifyShutdown(); +} + +void GPU::ObtainContext() { + impl->ObtainContext(); +} + +void GPU::ReleaseContext() { + impl->ReleaseContext(); +} + +void GPU::PushGPUEntries(s32 channel, Tegra::CommandList&& entries) { + impl->PushGPUEntries(channel, std::move(entries)); +} + +VideoCore::RasterizerDownloadArea GPU::OnCPURead(PAddr addr, u64 size) { + return impl->OnCPURead(addr, size); +} + +void GPU::FlushRegion(DAddr addr, u64 size) { + impl->FlushRegion(addr, size); +} + +void GPU::InvalidateRegion(DAddr addr, u64 size) { + impl->InvalidateRegion(addr, size); +} + +bool GPU::OnCPUWrite(DAddr addr, u64 size) { + return impl->OnCPUWrite(addr, size); +} + +void GPU::FlushAndInvalidateRegion(DAddr addr, u64 size) { + impl->FlushAndInvalidateRegion(addr, size); +} } // namespace Tegra diff --git a/src/video_core/optimized_rasterizer.cpp b/src/video_core/optimized_rasterizer.cpp deleted file mode 100644 index 02631f3c56..0000000000 --- a/src/video_core/optimized_rasterizer.cpp +++ /dev/null @@ -1,221 +0,0 @@ -#include "video_core/optimized_rasterizer.h" -#include "common/settings.h" -#include "video_core/gpu.h" -#include "video_core/memory_manager.h" -#include "video_core/engines/maxwell_3d.h" - -namespace VideoCore { - -OptimizedRasterizer::OptimizedRasterizer(Core::System& system, Tegra::GPU& gpu) - : system{system}, gpu{gpu}, memory_manager{gpu.MemoryManager()} { - InitializeShaderCache(); -} - -OptimizedRasterizer::~OptimizedRasterizer() = default; - -void OptimizedRasterizer::Draw(bool is_indexed, u32 instance_count) { - MICROPROFILE_SCOPE(GPU_Rasterization); - - PrepareRendertarget(); - UpdateDynamicState(); - - if (is_indexed) { - DrawIndexed(instance_count); - } else { - DrawArrays(instance_count); - } -} - -void OptimizedRasterizer::Clear(u32 layer_count) { - MICROPROFILE_SCOPE(GPU_Rasterization); - - PrepareRendertarget(); - ClearFramebuffer(layer_count); -} - -void OptimizedRasterizer::DispatchCompute() { - MICROPROFILE_SCOPE(GPU_Compute); - - PrepareCompute(); - LaunchComputeShader(); -} - -void OptimizedRasterizer::ResetCounter(VideoCommon::QueryType type) { - query_cache.ResetCounter(type); -} - -void OptimizedRasterizer::Query(GPUVAddr gpu_addr, VideoCommon::QueryType type, - VideoCommon::QueryPropertiesFlags flags, u32 payload, u32 subreport) { - query_cache.Query(gpu_addr, type, flags, payload, subreport); -} - -void OptimizedRasterizer::FlushAll() { - MICROPROFILE_SCOPE(GPU_Synchronization); - - FlushShaderCache(); - FlushRenderTargets(); -} - -void OptimizedRasterizer::FlushRegion(DAddr addr, u64 size, VideoCommon::CacheType which) { - MICROPROFILE_SCOPE(GPU_Synchronization); - - if (which == VideoCommon::CacheType::All || which == VideoCommon::CacheType::Unified) { - FlushMemoryRegion(addr, size); - } -} - -bool OptimizedRasterizer::MustFlushRegion(DAddr addr, u64 size, VideoCommon::CacheType which) { - if (which == VideoCommon::CacheType::All || which == VideoCommon::CacheType::Unified) { - return IsRegionCached(addr, size); - } - return false; -} - -RasterizerDownloadArea OptimizedRasterizer::GetFlushArea(DAddr addr, u64 size) { - return GetFlushableArea(addr, size); -} - -void OptimizedRasterizer::InvalidateRegion(DAddr addr, u64 size, VideoCommon::CacheType which) { - MICROPROFILE_SCOPE(GPU_Synchronization); - - if (which == VideoCommon::CacheType::All || which == VideoCommon::CacheType::Unified) { - InvalidateMemoryRegion(addr, size); - } -} - -void OptimizedRasterizer::OnCacheInvalidation(PAddr addr, u64 size) { - MICROPROFILE_SCOPE(GPU_Synchronization); - - InvalidateCachedRegion(addr, size); -} - -bool OptimizedRasterizer::OnCPUWrite(PAddr addr, u64 size) { - return HandleCPUWrite(addr, size); -} - -void OptimizedRasterizer::InvalidateGPUCache() { - MICROPROFILE_SCOPE(GPU_Synchronization); - - InvalidateAllCache(); -} - -void OptimizedRasterizer::UnmapMemory(DAddr addr, u64 size) { - MICROPROFILE_SCOPE(GPU_Synchronization); - - UnmapGPUMemoryRegion(addr, size); -} - -void OptimizedRasterizer::ModifyGPUMemory(size_t as_id, GPUVAddr addr, u64 size) { - MICROPROFILE_SCOPE(GPU_Synchronization); - - UpdateMappedGPUMemory(as_id, addr, size); -} - -void OptimizedRasterizer::FlushAndInvalidateRegion(DAddr addr, u64 size, VideoCommon::CacheType which) { - MICROPROFILE_SCOPE(GPU_Synchronization); - - if (which == VideoCommon::CacheType::All || which == VideoCommon::CacheType::Unified) { - FlushAndInvalidateMemoryRegion(addr, size); - } -} - -void OptimizedRasterizer::WaitForIdle() { - MICROPROFILE_SCOPE(GPU_Synchronization); - - WaitForGPUIdle(); -} - -void OptimizedRasterizer::FragmentBarrier() { - MICROPROFILE_SCOPE(GPU_Synchronization); - - InsertFragmentBarrier(); -} - -void OptimizedRasterizer::TiledCacheBarrier() { - MICROPROFILE_SCOPE(GPU_Synchronization); - - InsertTiledCacheBarrier(); -} - -void OptimizedRasterizer::FlushCommands() { - MICROPROFILE_SCOPE(GPU_Synchronization); - - SubmitCommands(); -} - -void OptimizedRasterizer::TickFrame() { - MICROPROFILE_SCOPE(GPU_Synchronization); - - EndFrame(); -} - -void OptimizedRasterizer::PrepareRendertarget() { - const auto& regs{gpu.Maxwell3D().regs}; - const auto& framebuffer{regs.framebuffer}; - - render_targets.resize(framebuffer.num_color_buffers); - for (std::size_t index = 0; index < framebuffer.num_color_buffers; ++index) { - render_targets[index] = GetColorBuffer(index); - } - - depth_stencil = GetDepthBuffer(); -} - -void OptimizedRasterizer::UpdateDynamicState() { - const auto& regs{gpu.Maxwell3D().regs}; - - UpdateViewport(regs.viewport_transform); - UpdateScissor(regs.scissor_test); - UpdateDepthBias(regs.polygon_offset_units, regs.polygon_offset_clamp, regs.polygon_offset_factor); - UpdateBlendConstants(regs.blend_color); - UpdateStencilFaceMask(regs.stencil_front_func_mask, regs.stencil_back_func_mask); -} - -void OptimizedRasterizer::DrawIndexed(u32 instance_count) { - const auto& draw_state{gpu.Maxwell3D().draw_manager->GetDrawState()}; - const auto& index_buffer{memory_manager.ReadBlockUnsafe(draw_state.index_buffer.Address(), - draw_state.index_buffer.size)}; - - shader_cache.BindComputeShader(); - shader_cache.BindGraphicsShader(); - - DrawElementsInstanced(draw_state.topology, draw_state.index_buffer.count, - draw_state.index_buffer.format, index_buffer.data(), instance_count); -} - -void OptimizedRasterizer::DrawArrays(u32 instance_count) { - const auto& draw_state{gpu.Maxwell3D().draw_manager->GetDrawState()}; - - shader_cache.BindComputeShader(); - shader_cache.BindGraphicsShader(); - - DrawArraysInstanced(draw_state.topology, draw_state.vertex_buffer.first, - draw_state.vertex_buffer.count, instance_count); -} - -void OptimizedRasterizer::ClearFramebuffer(u32 layer_count) { - const auto& regs{gpu.Maxwell3D().regs}; - const auto& clear_state{regs.clear_buffers}; - - if (clear_state.R || clear_state.G || clear_state.B || clear_state.A) { - ClearColorBuffers(clear_state.R, clear_state.G, clear_state.B, clear_state.A, - regs.clear_color[0], regs.clear_color[1], regs.clear_color[2], - regs.clear_color[3], layer_count); - } - - if (clear_state.Z || clear_state.S) { - ClearDepthStencilBuffer(clear_state.Z, clear_state.S, regs.clear_depth, regs.clear_stencil, - layer_count); - } -} - -void OptimizedRasterizer::PrepareCompute() { - shader_cache.BindComputeShader(); -} - -void OptimizedRasterizer::LaunchComputeShader() { - const auto& launch_desc{gpu.KeplerCompute().launch_description}; - DispatchCompute(launch_desc.grid_dim_x, launch_desc.grid_dim_y, launch_desc.grid_dim_z); -} - -} // namespace VideoCore \ No newline at end of file diff --git a/src/video_core/optimized_rasterizer.h b/src/video_core/optimized_rasterizer.h deleted file mode 100644 index 9c9fe1f35e..0000000000 --- a/src/video_core/optimized_rasterizer.h +++ /dev/null @@ -1,73 +0,0 @@ -#pragma once - -#include -#include -#include "common/common_types.h" -#include "video_core/rasterizer_interface.h" -#include "video_core/engines/maxwell_3d.h" - -namespace Core { -class System; -} - -namespace Tegra { -class GPU; -class MemoryManager; -} - -namespace VideoCore { - -class ShaderCache; -class QueryCache; - -class OptimizedRasterizer final : public RasterizerInterface { -public: - explicit OptimizedRasterizer(Core::System& system, Tegra::GPU& gpu); - ~OptimizedRasterizer() override; - - void Draw(bool is_indexed, u32 instance_count) override; - void Clear(u32 layer_count) override; - void DispatchCompute() override; - void ResetCounter(VideoCommon::QueryType type) override; - void Query(GPUVAddr gpu_addr, VideoCommon::QueryType type, - VideoCommon::QueryPropertiesFlags flags, u32 payload, u32 subreport) override; - void FlushAll() override; - void FlushRegion(DAddr addr, u64 size, VideoCommon::CacheType which) override; - bool MustFlushRegion(DAddr addr, u64 size, VideoCommon::CacheType which) override; - RasterizerDownloadArea GetFlushArea(DAddr addr, u64 size) override; - void InvalidateRegion(DAddr addr, u64 size, VideoCommon::CacheType which) override; - void OnCacheInvalidation(PAddr addr, u64 size) override; - bool OnCPUWrite(PAddr addr, u64 size) override; - void InvalidateGPUCache() override; - void UnmapMemory(DAddr addr, u64 size) override; - void ModifyGPUMemory(size_t as_id, GPUVAddr addr, u64 size) override; - void FlushAndInvalidateRegion(DAddr addr, u64 size, VideoCommon::CacheType which) override; - void WaitForIdle() override; - void FragmentBarrier() override; - void TiledCacheBarrier() override; - void FlushCommands() override; - void TickFrame() override; - -private: - void PrepareRendertarget(); - void UpdateDynamicState(); - void DrawIndexed(u32 instance_count); - void DrawArrays(u32 instance_count); - void ClearFramebuffer(u32 layer_count); - void PrepareCompute(); - void LaunchComputeShader(); - - Core::System& system; - Tegra::GPU& gpu; - Tegra::MemoryManager& memory_manager; - - std::unique_ptr shader_cache; - std::unique_ptr query_cache; - - std::vector render_targets; - DepthStencilConfig depth_stencil; - - // Add any additional member variables needed for the optimized rasterizer -}; - -} // namespace VideoCore \ No newline at end of file diff --git a/src/video_core/shader_cache.cpp b/src/video_core/shader_cache.cpp index c32bd88b22..a281f5d541 100644 --- a/src/video_core/shader_cache.cpp +++ b/src/video_core/shader_cache.cpp @@ -3,18 +3,9 @@ #include #include -#include -#include -#include -#include -#include #include #include "common/assert.h" -#include "common/fs/file.h" -#include "common/fs/path_util.h" -#include "common/logging/log.h" -#include "common/thread_worker.h" #include "shader_recompiler/frontend/maxwell/control_flow.h" #include "shader_recompiler/object_pool.h" #include "video_core/control/channel_state.h" @@ -28,288 +19,233 @@ namespace VideoCommon { -constexpr size_t MAX_SHADER_CACHE_SIZE = 1024 * 1024 * 1024; // 1GB - -class ShaderCacheWorker : public Common::ThreadWorker { -public: - explicit ShaderCacheWorker(const std::string& name) : ThreadWorker(name) {} - ~ShaderCacheWorker() = default; - - void CompileShader(ShaderInfo* shader) { - Push([shader]() { - // Compile shader here - // This is a placeholder for the actual compilation process - std::this_thread::sleep_for(std::chrono::milliseconds(10)); - shader->is_compiled.store(true, std::memory_order_release); - }); - } -}; - -class ShaderCache::Impl { -public: - explicit Impl(Tegra::MaxwellDeviceMemoryManager& device_memory_) - : device_memory{device_memory_}, workers{CreateWorkers()} { - LoadCache(); - } - - ~Impl() { - SaveCache(); - } - - void InvalidateRegion(VAddr addr, size_t size) { - std::scoped_lock lock{invalidation_mutex}; - InvalidatePagesInRegion(addr, size); - RemovePendingShaders(); - } - - void OnCacheInvalidation(VAddr addr, size_t size) { - std::scoped_lock lock{invalidation_mutex}; - InvalidatePagesInRegion(addr, size); - } - - void SyncGuestHost() { - std::scoped_lock lock{invalidation_mutex}; - RemovePendingShaders(); - } - - bool RefreshStages(std::array& unique_hashes); - const ShaderInfo* ComputeShader(); - void GetGraphicsEnvironments(GraphicsEnvironments& result, const std::array& unique_hashes); - - ShaderInfo* TryGet(VAddr addr) const { - std::scoped_lock lock{lookup_mutex}; - - const auto it = lookup_cache.find(addr); - if (it == lookup_cache.end()) { - return nullptr; - } - return it->second->data; - } - - void Register(std::unique_ptr data, VAddr addr, size_t size) { - std::scoped_lock lock{invalidation_mutex, lookup_mutex}; - - const VAddr addr_end = addr + size; - Entry* const entry = NewEntry(addr, addr_end, data.get()); - - const u64 page_end = (addr_end + SUYU_PAGESIZE - 1) >> SUYU_PAGEBITS; - for (u64 page = addr >> SUYU_PAGEBITS; page < page_end; ++page) { - invalidation_cache[page].push_back(entry); - } - - storage.push_back(std::move(data)); - - device_memory.UpdatePagesCachedCount(addr, size, 1); - } - -private: - std::vector> CreateWorkers() { - const size_t num_workers = std::thread::hardware_concurrency(); - std::vector> workers; - workers.reserve(num_workers); - for (size_t i = 0; i < num_workers; ++i) { - workers.emplace_back(std::make_unique(fmt::format("ShaderWorker{}", i))); - } - return workers; - } - - void LoadCache() { - const auto cache_dir = Common::FS::GetSuyuPath(Common::FS::SuyuPath::ShaderDir); - std::filesystem::create_directories(cache_dir); - - const auto cache_file = cache_dir / "shader_cache.bin"; - if (!std::filesystem::exists(cache_file)) { - return; - } - - std::ifstream file(cache_file, std::ios::binary); - if (!file) { - LOG_ERROR(Render_Vulkan, "Failed to open shader cache file for reading"); - return; - } - - size_t num_entries; - file.read(reinterpret_cast(&num_entries), sizeof(num_entries)); - - for (size_t i = 0; i < num_entries; ++i) { - VAddr addr; - size_t size; - file.read(reinterpret_cast(&addr), sizeof(addr)); - file.read(reinterpret_cast(&size), sizeof(size)); - - auto info = std::make_unique(); - file.read(reinterpret_cast(info.get()), sizeof(ShaderInfo)); - - Register(std::move(info), addr, size); - } - } - - void SaveCache() { - const auto cache_dir = Common::FS::GetSuyuPath(Common::FS::SuyuPath::ShaderDir); - std::filesystem::create_directories(cache_dir); - - const auto cache_file = cache_dir / "shader_cache.bin"; - std::ofstream file(cache_file, std::ios::binary | std::ios::trunc); - if (!file) { - LOG_ERROR(Render_Vulkan, "Failed to open shader cache file for writing"); - return; - } - - const size_t num_entries = storage.size(); - file.write(reinterpret_cast(&num_entries), sizeof(num_entries)); - - for (const auto& shader : storage) { - const VAddr addr = shader->addr; - const size_t size = shader->size_bytes; - file.write(reinterpret_cast(&addr), sizeof(addr)); - file.write(reinterpret_cast(&size), sizeof(size)); - file.write(reinterpret_cast(shader.get()), sizeof(ShaderInfo)); - } - } - - void InvalidatePagesInRegion(VAddr addr, size_t size) { - const VAddr addr_end = addr + size; - const u64 page_end = (addr_end + SUYU_PAGESIZE - 1) >> SUYU_PAGEBITS; - for (u64 page = addr >> SUYU_PAGEBITS; page < page_end; ++page) { - auto it = invalidation_cache.find(page); - if (it == invalidation_cache.end()) { - continue; - } - InvalidatePageEntries(it->second, addr, addr_end); - } - } - - void RemovePendingShaders() { - if (marked_for_removal.empty()) { - return; - } - // Remove duplicates - std::sort(marked_for_removal.begin(), marked_for_removal.end()); - marked_for_removal.erase(std::unique(marked_for_removal.begin(), marked_for_removal.end()), - marked_for_removal.end()); - - std::vector removed_shaders; - - std::scoped_lock lock{lookup_mutex}; - for (Entry* const entry : marked_for_removal) { - removed_shaders.push_back(entry->data); - - const auto it = lookup_cache.find(entry->addr_start); - ASSERT(it != lookup_cache.end()); - lookup_cache.erase(it); - } - marked_for_removal.clear(); - - if (!removed_shaders.empty()) { - RemoveShadersFromStorage(removed_shaders); - } - } - - void InvalidatePageEntries(std::vector& entries, VAddr addr, VAddr addr_end) { - size_t index = 0; - while (index < entries.size()) { - Entry* const entry = entries[index]; - if (!entry->Overlaps(addr, addr_end)) { - ++index; - continue; - } - - UnmarkMemory(entry); - RemoveEntryFromInvalidationCache(entry); - marked_for_removal.push_back(entry); - } - } - - void RemoveEntryFromInvalidationCache(const Entry* entry) { - const u64 page_end = (entry->addr_end + SUYU_PAGESIZE - 1) >> SUYU_PAGEBITS; - for (u64 page = entry->addr_start >> SUYU_PAGEBITS; page < page_end; ++page) { - const auto entries_it = invalidation_cache.find(page); - ASSERT(entries_it != invalidation_cache.end()); - std::vector& entries = entries_it->second; - - const auto entry_it = std::find(entries.begin(), entries.end(), entry); - ASSERT(entry_it != entries.end()); - entries.erase(entry_it); - } - } - - void UnmarkMemory(Entry* entry) { - if (!entry->is_memory_marked) { - return; - } - entry->is_memory_marked = false; - - const VAddr addr = entry->addr_start; - const size_t size = entry->addr_end - addr; - device_memory.UpdatePagesCachedCount(addr, size, -1); - } - - void RemoveShadersFromStorage(const std::vector& removed_shaders) { - storage.erase( - std::remove_if(storage.begin(), storage.end(), - [&removed_shaders](const std::unique_ptr& shader) { - return std::find(removed_shaders.begin(), removed_shaders.end(), - shader.get()) != removed_shaders.end(); - }), - storage.end()); - } - - Entry* NewEntry(VAddr addr, VAddr addr_end, ShaderInfo* data) { - auto entry = std::make_unique(Entry{addr, addr_end, data}); - Entry* const entry_pointer = entry.get(); - - lookup_cache.emplace(addr, std::move(entry)); - return entry_pointer; - } - - Tegra::MaxwellDeviceMemoryManager& device_memory; - std::vector> workers; - - mutable std::mutex lookup_mutex; - std::mutex invalidation_mutex; - - std::unordered_map> lookup_cache; - std::unordered_map> invalidation_cache; - std::vector> storage; - std::vector marked_for_removal; -}; - -ShaderCache::ShaderCache(Tegra::MaxwellDeviceMemoryManager& device_memory_) - : impl{std::make_unique(device_memory_)} {} - -ShaderCache::~ShaderCache() = default; - void ShaderCache::InvalidateRegion(VAddr addr, size_t size) { - impl->InvalidateRegion(addr, size); + std::scoped_lock lock{invalidation_mutex}; + InvalidatePagesInRegion(addr, size); + RemovePendingShaders(); } void ShaderCache::OnCacheInvalidation(VAddr addr, size_t size) { - impl->OnCacheInvalidation(addr, size); + std::scoped_lock lock{invalidation_mutex}; + InvalidatePagesInRegion(addr, size); } void ShaderCache::SyncGuestHost() { - impl->SyncGuestHost(); + std::scoped_lock lock{invalidation_mutex}; + RemovePendingShaders(); } +ShaderCache::ShaderCache(Tegra::MaxwellDeviceMemoryManager& device_memory_) + : device_memory{device_memory_} {} + bool ShaderCache::RefreshStages(std::array& unique_hashes) { - return impl->RefreshStages(unique_hashes); + auto& dirty{maxwell3d->dirty.flags}; + if (!dirty[VideoCommon::Dirty::Shaders]) { + return last_shaders_valid; + } + dirty[VideoCommon::Dirty::Shaders] = false; + + const GPUVAddr base_addr{maxwell3d->regs.program_region.Address()}; + for (size_t index = 0; index < Tegra::Engines::Maxwell3D::Regs::MaxShaderProgram; ++index) { + if (!maxwell3d->regs.IsShaderConfigEnabled(index)) { + unique_hashes[index] = 0; + continue; + } + const auto& shader_config{maxwell3d->regs.pipelines[index]}; + const auto program{static_cast(index)}; + if (program == Tegra::Engines::Maxwell3D::Regs::ShaderType::Pixel && + !maxwell3d->regs.rasterize_enable) { + unique_hashes[index] = 0; + continue; + } + const GPUVAddr shader_addr{base_addr + shader_config.offset}; + const std::optional cpu_shader_addr{gpu_memory->GpuToCpuAddress(shader_addr)}; + if (!cpu_shader_addr) { + LOG_ERROR(HW_GPU, "Invalid GPU address for shader 0x{:016x}", shader_addr); + last_shaders_valid = false; + return false; + } + const ShaderInfo* shader_info{TryGet(*cpu_shader_addr)}; + if (!shader_info) { + const u32 start_address{shader_config.offset}; + GraphicsEnvironment env{*maxwell3d, *gpu_memory, program, base_addr, start_address}; + shader_info = MakeShaderInfo(env, *cpu_shader_addr); + } + shader_infos[index] = shader_info; + unique_hashes[index] = shader_info->unique_hash; + } + last_shaders_valid = true; + return true; } const ShaderInfo* ShaderCache::ComputeShader() { - return impl->ComputeShader(); + const GPUVAddr program_base{kepler_compute->regs.code_loc.Address()}; + const auto& qmd{kepler_compute->launch_description}; + const GPUVAddr shader_addr{program_base + qmd.program_start}; + const std::optional cpu_shader_addr{gpu_memory->GpuToCpuAddress(shader_addr)}; + if (!cpu_shader_addr) { + LOG_ERROR(HW_GPU, "Invalid GPU address for shader 0x{:016x}", shader_addr); + return nullptr; + } + if (const ShaderInfo* const shader = TryGet(*cpu_shader_addr)) { + return shader; + } + ComputeEnvironment env{*kepler_compute, *gpu_memory, program_base, qmd.program_start}; + return MakeShaderInfo(env, *cpu_shader_addr); } void ShaderCache::GetGraphicsEnvironments(GraphicsEnvironments& result, const std::array& unique_hashes) { - impl->GetGraphicsEnvironments(result, unique_hashes); + size_t env_index{}; + const GPUVAddr base_addr{maxwell3d->regs.program_region.Address()}; + for (size_t index = 0; index < NUM_PROGRAMS; ++index) { + if (unique_hashes[index] == 0) { + continue; + } + const auto program{static_cast(index)}; + auto& env{result.envs[index]}; + const u32 start_address{maxwell3d->regs.pipelines[index].offset}; + env = GraphicsEnvironment{*maxwell3d, *gpu_memory, program, base_addr, start_address}; + env.SetCachedSize(shader_infos[index]->size_bytes); + result.env_ptrs[env_index++] = &env; + } } ShaderInfo* ShaderCache::TryGet(VAddr addr) const { - return impl->TryGet(addr); + std::scoped_lock lock{lookup_mutex}; + + const auto it = lookup_cache.find(addr); + if (it == lookup_cache.end()) { + return nullptr; + } + return it->second->data; } void ShaderCache::Register(std::unique_ptr data, VAddr addr, size_t size) { - impl->Register(std::move(data), addr, size); + std::scoped_lock lock{invalidation_mutex, lookup_mutex}; + + const VAddr addr_end = addr + size; + Entry* const entry = NewEntry(addr, addr_end, data.get()); + + const u64 page_end = (addr_end + SUYU_PAGESIZE - 1) >> SUYU_PAGEBITS; + for (u64 page = addr >> SUYU_PAGEBITS; page < page_end; ++page) { + invalidation_cache[page].push_back(entry); + } + + storage.push_back(std::move(data)); + + device_memory.UpdatePagesCachedCount(addr, size, 1); +} + +void ShaderCache::InvalidatePagesInRegion(VAddr addr, size_t size) { + const VAddr addr_end = addr + size; + const u64 page_end = (addr_end + SUYU_PAGESIZE - 1) >> SUYU_PAGEBITS; + for (u64 page = addr >> SUYU_PAGEBITS; page < page_end; ++page) { + auto it = invalidation_cache.find(page); + if (it == invalidation_cache.end()) { + continue; + } + InvalidatePageEntries(it->second, addr, addr_end); + } +} + +void ShaderCache::RemovePendingShaders() { + if (marked_for_removal.empty()) { + return; + } + // Remove duplicates + std::ranges::sort(marked_for_removal); + marked_for_removal.erase(std::unique(marked_for_removal.begin(), marked_for_removal.end()), + marked_for_removal.end()); + + boost::container::small_vector removed_shaders; + + std::scoped_lock lock{lookup_mutex}; + for (Entry* const entry : marked_for_removal) { + removed_shaders.push_back(entry->data); + + const auto it = lookup_cache.find(entry->addr_start); + ASSERT(it != lookup_cache.end()); + lookup_cache.erase(it); + } + marked_for_removal.clear(); + + if (!removed_shaders.empty()) { + RemoveShadersFromStorage(removed_shaders); + } +} + +void ShaderCache::InvalidatePageEntries(std::vector& entries, VAddr addr, VAddr addr_end) { + size_t index = 0; + while (index < entries.size()) { + Entry* const entry = entries[index]; + if (!entry->Overlaps(addr, addr_end)) { + ++index; + continue; + } + + UnmarkMemory(entry); + RemoveEntryFromInvalidationCache(entry); + marked_for_removal.push_back(entry); + } +} + +void ShaderCache::RemoveEntryFromInvalidationCache(const Entry* entry) { + const u64 page_end = (entry->addr_end + SUYU_PAGESIZE - 1) >> SUYU_PAGEBITS; + for (u64 page = entry->addr_start >> SUYU_PAGEBITS; page < page_end; ++page) { + const auto entries_it = invalidation_cache.find(page); + ASSERT(entries_it != invalidation_cache.end()); + std::vector& entries = entries_it->second; + + const auto entry_it = std::ranges::find(entries, entry); + ASSERT(entry_it != entries.end()); + entries.erase(entry_it); + } +} + +void ShaderCache::UnmarkMemory(Entry* entry) { + if (!entry->is_memory_marked) { + return; + } + entry->is_memory_marked = false; + + const VAddr addr = entry->addr_start; + const size_t size = entry->addr_end - addr; + device_memory.UpdatePagesCachedCount(addr, size, -1); +} + +void ShaderCache::RemoveShadersFromStorage(std::span removed_shaders) { + // Remove them from the cache + std::erase_if(storage, [&removed_shaders](const std::unique_ptr& shader) { + return std::ranges::find(removed_shaders, shader.get()) != removed_shaders.end(); + }); +} + +ShaderCache::Entry* ShaderCache::NewEntry(VAddr addr, VAddr addr_end, ShaderInfo* data) { + auto entry = std::make_unique(Entry{addr, addr_end, data}); + Entry* const entry_pointer = entry.get(); + + lookup_cache.emplace(addr, std::move(entry)); + return entry_pointer; +} + +const ShaderInfo* ShaderCache::MakeShaderInfo(GenericEnvironment& env, VAddr cpu_addr) { + auto info = std::make_unique(); + if (const std::optional cached_hash{env.Analyze()}) { + info->unique_hash = *cached_hash; + info->size_bytes = env.CachedSizeBytes(); + } else { + // Slow path, not really hit on commercial games + // Build a control flow graph to get the real shader size + Shader::ObjectPool flow_block; + Shader::Maxwell::Flow::CFG cfg{env, flow_block, env.StartAddress()}; + info->unique_hash = env.CalculateHash(); + info->size_bytes = env.ReadSizeBytes(); + } + const size_t size_bytes{info->size_bytes}; + const ShaderInfo* const result{info.get()}; + Register(std::move(info), cpu_addr, size_bytes); + return result; } } // namespace VideoCommon From c52427b67681525be78bd4794e45ed5c8858004b Mon Sep 17 00:00:00 2001 From: Samuliak Date: Sat, 5 Oct 2024 08:04:46 +0200 Subject: [PATCH 161/165] mark format functions as const --- src/common/logging/formatter.h | 2 +- src/common/typed_address.h | 6 +++--- src/core/arm/dynarmic/dynarmic_cp15.cpp | 2 +- src/core/hle/service/psc/time/common.h | 4 ++-- src/shader_recompiler/backend/glasm/reg_alloc.h | 14 +++++++------- src/shader_recompiler/frontend/ir/attribute.h | 2 +- src/shader_recompiler/frontend/ir/condition.h | 2 +- src/shader_recompiler/frontend/ir/flow_test.h | 2 +- src/shader_recompiler/frontend/ir/opcodes.h | 4 ++-- src/shader_recompiler/frontend/ir/pred.h | 2 +- src/shader_recompiler/frontend/ir/reg.h | 2 +- src/shader_recompiler/frontend/ir/type.h | 2 +- src/shader_recompiler/frontend/maxwell/location.h | 2 +- src/shader_recompiler/frontend/maxwell/opcodes.h | 2 +- src/video_core/texture_cache/formatter.h | 6 +++--- 15 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/common/logging/formatter.h b/src/common/logging/formatter.h index 88e55505de..16bddde8fe 100644 --- a/src/common/logging/formatter.h +++ b/src/common/logging/formatter.h @@ -14,7 +14,7 @@ template struct fmt::formatter, char>> : formatter> { template - auto format(const T& value, FormatContext& ctx) -> decltype(ctx.out()) { + auto format(const T& value, FormatContext& ctx) const -> decltype(ctx.out()) { return fmt::formatter>::format( static_cast>(value), ctx); } diff --git a/src/common/typed_address.h b/src/common/typed_address.h index d5e743583d..a1deb89a04 100644 --- a/src/common/typed_address.h +++ b/src/common/typed_address.h @@ -262,7 +262,7 @@ struct fmt::formatter { return ctx.begin(); } template - auto format(const Common::PhysicalAddress& addr, FormatContext& ctx) { + auto format(const Common::PhysicalAddress& addr, FormatContext& ctx) const { return fmt::format_to(ctx.out(), "{:#x}", static_cast(addr.GetValue())); } }; @@ -273,7 +273,7 @@ struct fmt::formatter { return ctx.begin(); } template - auto format(const Common::ProcessAddress& addr, FormatContext& ctx) { + auto format(const Common::ProcessAddress& addr, FormatContext& ctx) const { return fmt::format_to(ctx.out(), "{:#x}", static_cast(addr.GetValue())); } }; @@ -284,7 +284,7 @@ struct fmt::formatter { return ctx.begin(); } template - auto format(const Common::VirtualAddress& addr, FormatContext& ctx) { + auto format(const Common::VirtualAddress& addr, FormatContext& ctx) const { return fmt::format_to(ctx.out(), "{:#x}", static_cast(addr.GetValue())); } }; diff --git a/src/core/arm/dynarmic/dynarmic_cp15.cpp b/src/core/arm/dynarmic/dynarmic_cp15.cpp index f3eee0d42a..ee97ac6395 100644 --- a/src/core/arm/dynarmic/dynarmic_cp15.cpp +++ b/src/core/arm/dynarmic/dynarmic_cp15.cpp @@ -22,7 +22,7 @@ struct fmt::formatter { return ctx.begin(); } template - auto format(const Dynarmic::A32::CoprocReg& reg, FormatContext& ctx) { + auto format(const Dynarmic::A32::CoprocReg& reg, FormatContext& ctx) const { return fmt::format_to(ctx.out(), "cp{}", static_cast(reg)); } }; diff --git a/src/core/hle/service/psc/time/common.h b/src/core/hle/service/psc/time/common.h index 3e13144a0d..5474e5a0c9 100644 --- a/src/core/hle/service/psc/time/common.h +++ b/src/core/hle/service/psc/time/common.h @@ -167,7 +167,7 @@ constexpr inline Result GetSpanBetweenTimePoints(s64* out_seconds, const SteadyC template <> struct fmt::formatter : fmt::formatter { template - auto format(Service::PSC::Time::TimeType type, FormatContext& ctx) { + auto format(Service::PSC::Time::TimeType type, FormatContext& ctx) const { const string_view name = [type] { using Service::PSC::Time::TimeType; switch (type) { @@ -270,4 +270,4 @@ struct fmt::formatter time_point.rtc_offset, time_point.diff_scale, time_point.shift_amount, time_point.lower, time_point.upper); } -}; \ No newline at end of file +}; diff --git a/src/shader_recompiler/backend/glasm/reg_alloc.h b/src/shader_recompiler/backend/glasm/reg_alloc.h index bd6e2d929c..207a075f19 100644 --- a/src/shader_recompiler/backend/glasm/reg_alloc.h +++ b/src/shader_recompiler/backend/glasm/reg_alloc.h @@ -184,7 +184,7 @@ struct fmt::formatter { return ctx.begin(); } template - auto format(Shader::Backend::GLASM::Id id, FormatContext& ctx) { + auto format(Shader::Backend::GLASM::Id id, FormatContext& ctx) const { return Shader::Backend::GLASM::FormatTo(ctx, id); } }; @@ -195,7 +195,7 @@ struct fmt::formatter { return ctx.begin(); } template - auto format(const Shader::Backend::GLASM::Register& value, FormatContext& ctx) { + auto format(const Shader::Backend::GLASM::Register& value, FormatContext& ctx) const { if (value.type != Shader::Backend::GLASM::Type::Register) { throw Shader::InvalidArgument("Register value type is not register"); } @@ -209,7 +209,7 @@ struct fmt::formatter { return ctx.begin(); } template - auto format(const Shader::Backend::GLASM::ScalarRegister& value, FormatContext& ctx) { + auto format(const Shader::Backend::GLASM::ScalarRegister& value, FormatContext& ctx) const { if (value.type != Shader::Backend::GLASM::Type::Register) { throw Shader::InvalidArgument("Register value type is not register"); } @@ -223,7 +223,7 @@ struct fmt::formatter { return ctx.begin(); } template - auto format(const Shader::Backend::GLASM::ScalarU32& value, FormatContext& ctx) { + auto format(const Shader::Backend::GLASM::ScalarU32& value, FormatContext& ctx) const { switch (value.type) { case Shader::Backend::GLASM::Type::Void: break; @@ -244,7 +244,7 @@ struct fmt::formatter { return ctx.begin(); } template - auto format(const Shader::Backend::GLASM::ScalarS32& value, FormatContext& ctx) { + auto format(const Shader::Backend::GLASM::ScalarS32& value, FormatContext& ctx) const { switch (value.type) { case Shader::Backend::GLASM::Type::Void: break; @@ -265,7 +265,7 @@ struct fmt::formatter { return ctx.begin(); } template - auto format(const Shader::Backend::GLASM::ScalarF32& value, FormatContext& ctx) { + auto format(const Shader::Backend::GLASM::ScalarF32& value, FormatContext& ctx) const { switch (value.type) { case Shader::Backend::GLASM::Type::Void: break; @@ -286,7 +286,7 @@ struct fmt::formatter { return ctx.begin(); } template - auto format(const Shader::Backend::GLASM::ScalarF64& value, FormatContext& ctx) { + auto format(const Shader::Backend::GLASM::ScalarF64& value, FormatContext& ctx) const { switch (value.type) { case Shader::Backend::GLASM::Type::Void: break; diff --git a/src/shader_recompiler/frontend/ir/attribute.h b/src/shader_recompiler/frontend/ir/attribute.h index 5f039b6f65..407a1f4bc1 100644 --- a/src/shader_recompiler/frontend/ir/attribute.h +++ b/src/shader_recompiler/frontend/ir/attribute.h @@ -250,7 +250,7 @@ struct fmt::formatter { return ctx.begin(); } template - auto format(const Shader::IR::Attribute& attribute, FormatContext& ctx) { + auto format(const Shader::IR::Attribute& attribute, FormatContext& ctx) const { return fmt::format_to(ctx.out(), "{}", Shader::IR::NameOf(attribute)); } }; diff --git a/src/shader_recompiler/frontend/ir/condition.h b/src/shader_recompiler/frontend/ir/condition.h index 1cad46b9b9..0b77b6590b 100644 --- a/src/shader_recompiler/frontend/ir/condition.h +++ b/src/shader_recompiler/frontend/ir/condition.h @@ -52,7 +52,7 @@ struct fmt::formatter { return ctx.begin(); } template - auto format(const Shader::IR::Condition& cond, FormatContext& ctx) { + auto format(const Shader::IR::Condition& cond, FormatContext& ctx) const { return fmt::format_to(ctx.out(), "{}", Shader::IR::NameOf(cond)); } }; diff --git a/src/shader_recompiler/frontend/ir/flow_test.h b/src/shader_recompiler/frontend/ir/flow_test.h index 88f7c9e82e..f758d13127 100644 --- a/src/shader_recompiler/frontend/ir/flow_test.h +++ b/src/shader_recompiler/frontend/ir/flow_test.h @@ -55,7 +55,7 @@ struct fmt::formatter { return ctx.begin(); } template - auto format(const Shader::IR::FlowTest& flow_test, FormatContext& ctx) { + auto format(const Shader::IR::FlowTest& flow_test, FormatContext& ctx) const { return fmt::format_to(ctx.out(), "{}", Shader::IR::NameOf(flow_test)); } }; diff --git a/src/shader_recompiler/frontend/ir/opcodes.h b/src/shader_recompiler/frontend/ir/opcodes.h index e300714f3a..767c5ae15a 100644 --- a/src/shader_recompiler/frontend/ir/opcodes.h +++ b/src/shader_recompiler/frontend/ir/opcodes.h @@ -54,7 +54,7 @@ constexpr Type F64x2{Type::F64x2}; constexpr Type F64x3{Type::F64x3}; constexpr Type F64x4{Type::F64x4}; -constexpr OpcodeMeta META_TABLE[]{ +constexpr OpcodeMeta META_TABLE[] { #define OPCODE(name_token, type_token, ...) \ { \ .name{#name_token}, \ @@ -103,7 +103,7 @@ struct fmt::formatter { return ctx.begin(); } template - auto format(const Shader::IR::Opcode& op, FormatContext& ctx) { + auto format(const Shader::IR::Opcode& op, FormatContext& ctx) const { return fmt::format_to(ctx.out(), "{}", Shader::IR::NameOf(op)); } }; diff --git a/src/shader_recompiler/frontend/ir/pred.h b/src/shader_recompiler/frontend/ir/pred.h index a77c1e2a7a..f3f92b063a 100644 --- a/src/shader_recompiler/frontend/ir/pred.h +++ b/src/shader_recompiler/frontend/ir/pred.h @@ -33,7 +33,7 @@ struct fmt::formatter { return ctx.begin(); } template - auto format(const Shader::IR::Pred& pred, FormatContext& ctx) { + auto format(const Shader::IR::Pred& pred, FormatContext& ctx) const { if (pred == Shader::IR::Pred::PT) { return fmt::format_to(ctx.out(), "PT"); } else { diff --git a/src/shader_recompiler/frontend/ir/reg.h b/src/shader_recompiler/frontend/ir/reg.h index f7cb716a97..610492759d 100644 --- a/src/shader_recompiler/frontend/ir/reg.h +++ b/src/shader_recompiler/frontend/ir/reg.h @@ -319,7 +319,7 @@ struct fmt::formatter { return ctx.begin(); } template - auto format(const Shader::IR::Reg& reg, FormatContext& ctx) { + auto format(const Shader::IR::Reg& reg, FormatContext& ctx) const { if (reg == Shader::IR::Reg::RZ) { return fmt::format_to(ctx.out(), "RZ"); } else if (static_cast(reg) >= 0 && static_cast(reg) < 255) { diff --git a/src/shader_recompiler/frontend/ir/type.h b/src/shader_recompiler/frontend/ir/type.h index 04c8c4ddbe..17b520c6dd 100644 --- a/src/shader_recompiler/frontend/ir/type.h +++ b/src/shader_recompiler/frontend/ir/type.h @@ -54,7 +54,7 @@ struct fmt::formatter { return ctx.begin(); } template - auto format(const Shader::IR::Type& type, FormatContext& ctx) { + auto format(const Shader::IR::Type& type, FormatContext& ctx) const { return fmt::format_to(ctx.out(), "{}", NameOf(type)); } }; diff --git a/src/shader_recompiler/frontend/maxwell/location.h b/src/shader_recompiler/frontend/maxwell/location.h index 0c0477e2db..0dd16723a2 100644 --- a/src/shader_recompiler/frontend/maxwell/location.h +++ b/src/shader_recompiler/frontend/maxwell/location.h @@ -102,7 +102,7 @@ struct fmt::formatter { return ctx.begin(); } template - auto format(const Shader::Maxwell::Location& location, FormatContext& ctx) { + auto format(const Shader::Maxwell::Location& location, FormatContext& ctx) const { return fmt::format_to(ctx.out(), "{:04x}", location.Offset()); } }; diff --git a/src/shader_recompiler/frontend/maxwell/opcodes.h b/src/shader_recompiler/frontend/maxwell/opcodes.h index 72dd143c2a..b3a493ff6a 100644 --- a/src/shader_recompiler/frontend/maxwell/opcodes.h +++ b/src/shader_recompiler/frontend/maxwell/opcodes.h @@ -23,7 +23,7 @@ struct fmt::formatter { return ctx.begin(); } template - auto format(const Shader::Maxwell::Opcode& opcode, FormatContext& ctx) { + auto format(const Shader::Maxwell::Opcode& opcode, FormatContext& ctx) const { return fmt::format_to(ctx.out(), "{}", NameOf(opcode)); } }; diff --git a/src/video_core/texture_cache/formatter.h b/src/video_core/texture_cache/formatter.h index cabbfcb2dd..ea1c2df791 100644 --- a/src/video_core/texture_cache/formatter.h +++ b/src/video_core/texture_cache/formatter.h @@ -13,7 +13,7 @@ template <> struct fmt::formatter : fmt::formatter { template - auto format(VideoCore::Surface::PixelFormat format, FormatContext& ctx) { + auto format(VideoCore::Surface::PixelFormat format, FormatContext& ctx) const { using VideoCore::Surface::PixelFormat; const string_view name = [format] { switch (format) { @@ -234,7 +234,7 @@ struct fmt::formatter : fmt::formatter struct fmt::formatter : fmt::formatter { template - auto format(VideoCommon::ImageType type, FormatContext& ctx) { + auto format(VideoCommon::ImageType type, FormatContext& ctx) const { const string_view name = [type] { using VideoCommon::ImageType; switch (type) { @@ -262,7 +262,7 @@ struct fmt::formatter { } template - auto format(const VideoCommon::Extent3D& extent, FormatContext& ctx) { + auto format(const VideoCommon::Extent3D& extent, FormatContext& ctx) const { return fmt::format_to(ctx.out(), "{{{}, {}, {}}}", extent.width, extent.height, extent.depth); } From 40def7017cbb564fcd80e4724c4fa83f2fdc2f64 Mon Sep 17 00:00:00 2001 From: Samuliak Date: Sat, 5 Oct 2024 09:10:15 +0200 Subject: [PATCH 162/165] include fmt/ranges.h --- src/core/debugger/gdbstub.cpp | 1 + src/core/file_sys/system_archive/ng_word.cpp | 2 +- src/core/hle/service/nfc/common/device.cpp | 1 + src/suyu/main.cpp | 2 ++ 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/core/debugger/gdbstub.cpp b/src/core/debugger/gdbstub.cpp index 27d45fca5f..22bc71e4d4 100644 --- a/src/core/debugger/gdbstub.cpp +++ b/src/core/debugger/gdbstub.cpp @@ -9,6 +9,7 @@ #include #include +#include #include "common/hex_util.h" #include "common/logging/log.h" diff --git a/src/core/file_sys/system_archive/ng_word.cpp b/src/core/file_sys/system_archive/ng_word.cpp index 13ae1999ee..61b0ed2f7b 100644 --- a/src/core/file_sys/system_archive/ng_word.cpp +++ b/src/core/file_sys/system_archive/ng_word.cpp @@ -10,7 +10,7 @@ namespace FileSys::SystemArchive { namespace NgWord1Data { -constexpr std::size_t NUMBER_WORD_TXT_FILES = 0x10; +[[maybe_unused]] constexpr std::size_t NUMBER_WORD_TXT_FILES = 0x10; // Should this archive replacement mysteriously not work on a future game, consider updating. constexpr std::array VERSION_DAT{0x0, 0x0, 0x0, 0x20}; // 11.0.1 System Version diff --git a/src/core/hle/service/nfc/common/device.cpp b/src/core/hle/service/nfc/common/device.cpp index bf29bb354e..652dff0457 100644 --- a/src/core/hle/service/nfc/common/device.cpp +++ b/src/core/hle/service/nfc/common/device.cpp @@ -15,6 +15,7 @@ #endif #include +#include #include "common/fs/file.h" #include "common/fs/fs.h" diff --git a/src/suyu/main.cpp b/src/suyu/main.cpp index fbdea66e78..991ff67768 100644 --- a/src/suyu/main.cpp +++ b/src/suyu/main.cpp @@ -9,6 +9,8 @@ #include #include +#include + #include "core/hle/service/am/applet_manager.h" #include "core/loader/nca.h" #include "core/loader/nro.h" From 26b1d7e87957332198a8b1a3a45929f32ad58a01 Mon Sep 17 00:00:00 2001 From: Samuliak Date: Sat, 5 Oct 2024 12:35:09 +0200 Subject: [PATCH 163/165] enable boost concepts --- CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cbeb2ee689..67bdf6afe9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -279,8 +279,6 @@ endif() # Configure C++ standard # =========================== -# boost asio's concept usage doesn't play nicely with some compilers yet. -add_definitions(-DBOOST_ASIO_DISABLE_CONCEPTS) if (MSVC) add_compile_options($<$:/std:c++20>) From 27769c595bc63b4095997dc72d734f822a31e80f Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Sun, 6 Oct 2024 11:36:27 +0200 Subject: [PATCH 164/165] Restored Hyperlink to sudachi's website now it is back up --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e2cfaa9ded..b3ee2167e3 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ You can also contact any of the developers on the Chat to learn more about the c * __Linux__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __macOS__: [Releases](https://git.suyu.dev/suyu/suyu/releases) * __Android__: [Releases](https://git.suyu.dev/suyu/suyu/releases) -###### We currently do not provide builds for iOS, however if you would like, you could try the experimental Sudachi Emulator and it's bigger project: [Folium](https://apps.apple.com/us/app/folium/id6498623389). +###### We currently do not provide builds for iOS, however if you would like, you could try the experimental [Sudachi Emulator](https://sudachi.emuplace.app/) and it's bigger project: [Folium](https://apps.apple.com/us/app/folium/id6498623389). If you want daily builds then [Click here](https://git.suyu.dev/suyu/suyu/actions). If you don't know how to download the daily builds then [Click here](https://git.suyu.dev/suyu/suyu/raw/branch/dev/img/daily-builds.png) From ee365bad9501c73ff49936e72ec91cd9c3ce5c24 Mon Sep 17 00:00:00 2001 From: chaphidoesstuff Date: Sun, 6 Oct 2024 11:40:15 +0200 Subject: [PATCH 165/165] Fixed missing reddit hyperlink all chat and reddit mentions are hyperlinked, but one mention of the subreddit wasn't, so I hyperlinked it like the others --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b3ee2167e3..6211f5f1c2 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ For Multiplayer, we recommend using the "Yuzu Online" patch, install instruction ## Support -If you have any questions, don't hesitate to ask us in our [Chat](https://chat.suyu.dev) or Subreddit, make an issue or contact a developer. We don't bite! +If you have any questions, don't hesitate to ask us in our [Chat](https://chat.suyu.dev) or [Subreddit](https://www.reddit.com/r/suyu/), make an issue or contact a developer. We don't bite! ## License