Compare commits

...

22 Commits

Author SHA1 Message Date
GreemDev
973c6ba5df UI: RPC: Squeakross: Home Squeak Home image
docs: compat: Squeakross: Home Squeak Home: Playable
2025-06-16 02:06:45 -05:00
GreemDev
6803c91da8 infra: Add package source mappings for Ryujinx.UpdateClient to silence compile warnings 2025-06-16 02:05:11 -05:00
GreemDev
557c2a50b2 infra: Add NuGet config to solution items 2025-06-16 02:04:48 -05:00
GreemDev
77a797f154 Revert "Structural and Memory Safety Improvements, Analyzer Cleanup (ryubing/ryujinx!47)"
This reverts merge request !47
2025-06-15 20:45:26 -05:00
Emiyl
faf9e3cdd7 macOS: Fix MoltenVK config packing (ryubing/ryujinx!65)
See merge request ryubing/ryujinx!65
2025-06-15 18:24:45 -05:00
Godzilaa4
7bc80ed4fe Updated Brazilian Portuguese translation (ryubing/ryujinx!62)
See merge request ryubing/ryujinx!62
2025-06-15 10:28:41 -05:00
WilliamWsyHK
a1d44ec496 Update translation for Traditional Chinese (ryubing/ryujinx!61)
See merge request ryubing/ryujinx!61
2025-06-14 20:06:12 -05:00
GreemDev
bab3beb0ac [ci skip] Forgot closing / lol 2025-06-13 15:51:23 -05:00
GreemDev
aa9e74339b Add support for notifying the update server when a new update has been pushed instead of relying on periodic refreshes 2025-06-13 01:57:54 -05:00
GreemDev
908273d848 [ci skip] UpdateClient package source
https://git.ryujinx.app/ryubing/update-server/-/packages
2025-06-13 01:57:54 -05:00
shinyoyo
b51ad11574 Updated Simplified Chinese translation (ryubing/ryujinx!58)
See merge request ryubing/ryujinx!58
2025-06-11 19:43:50 -05:00
MrKev
ea027d65a7 Structural and Memory Safety Improvements, Analyzer Cleanup (ryubing/ryujinx!47)
See merge request ryubing/ryujinx!47
2025-06-11 17:58:27 -05:00
Coxxs
d03ae9c164 fix: socket blocking flag is inverted when setting it (ryubing/ryujinx!57)
See merge request ryubing/ryujinx!57
2025-06-11 16:44:07 -05:00
Hack茶ん
90e9492f6c Update Korean translation (ryubing/ryujinx!56)
See merge request ryubing/ryujinx!56
2025-06-11 15:37:48 -05:00
mqudsi
512120db04 Work around Escape hotkey race with exit confirmation dialog
See merge request ryubing/ryujinx!54
2025-06-10 22:52:08 -05:00
rockingdice
90582e9e93 fix: crash caused by cursor overflow
See merge request ryubing/ryujinx!53
2025-06-10 16:34:12 -05:00
rockingdice
b97fae08b5 fix: use the correct font family for CJK characters
See merge request ryubing/ryujinx!52
2025-06-10 15:41:39 -05:00
GreemDev
eed6ef632d infra: [ci skip] update CHANGELOG.md 2025-06-09 19:57:31 -05:00
GreemDev
0409c15903 Remove GitHub updater support. 2025-06-09 19:51:53 -05:00
GreemDev
c58272ac20 infra: CI: Remove GitHub release uploading from Stable workflow. 2025-06-09 18:56:28 -05:00
GreemDev
9d83dfd19c misc: [ci skip] Missed the property part of _chosenProfile 2025-06-09 17:59:40 -05:00
GreemDev
ce31a47934 misc: Code styling changes & cleanups 2025-06-09 17:57:26 -05:00
25 changed files with 265 additions and 492 deletions

View File

@ -243,3 +243,7 @@ jobs:
- name: Send notification webhook - name: Send notification webhook
run: | run: |
gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/canary --command=SendUpdateMessage "${{ steps.version_info.outputs.build_version }}|FF4500|${{ secrets.CANARY_DISCORD_WEBHOOK }}|https://avatars.githubusercontent.com/u/192939710?s=200&v=4|false" gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/canary --command=SendUpdateMessage "${{ steps.version_info.outputs.build_version }}|FF4500|${{ secrets.CANARY_DISCORD_WEBHOOK }}|https://avatars.githubusercontent.com/u/192939710?s=200&v=4|false"
- name: Notify update server of new builds
run: |
curl 'https://update.ryujinx.app/api/v1/admin/refresh_cache?rc=canary' -X PATCH -H 'accept: */*' -H 'Authorization: ${{ secrets.UPDATE_SERVER_ADMIN_TOKEN }}'

View File

@ -14,38 +14,6 @@ env:
RELEASE: 1 RELEASE: 1
jobs: jobs:
tag:
name: Create tag
runs-on: ubuntu-24.04
steps:
- name: Get version info
id: version_info
run: |
echo "build_version=${{ env.RYUJINX_BASE_VERSION }}.${{ github.run_number }}" >> $GITHUB_OUTPUT
echo "prev_build_version=${{ env.RYUJINX_BASE_VERSION }}.$((${{ github.run_number }} - 1))" >> $GITHUB_OUTPUT
shell: bash
- name: Create release
uses: ncipollo/release-action@v1
with:
name: ${{ steps.version_info.outputs.build_version }}
tag: ${{ steps.version_info.outputs.build_version }}
body: |
# Stable builds:
| Platform | Artifact |
|--|--|
| Windows 64-bit | [Stable Windows Artifact](https://github.com/${{ secrets.RC_OWNER }}/${{ secrets.RC_STABLE_NAME }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-win_x64.zip) |
| Windows ARM 64-bit | [Stable Windows ARM Artifact](https://github.com/${{ secrets.RC_OWNER }}/${{ secrets.RC_STABLE_NAME }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-win_arm64.zip) |
| Linux 64-bit | [Stable Linux Artifact](https://github.com/${{ secrets.RC_OWNER }}/${{ secrets.RC_STABLE_NAME }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz) |
| Linux ARM 64-bit | [Stable Linux ARM Artifact](https://github.com/${{ secrets.RC_OWNER }}/${{ secrets.RC_STABLE_NAME }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz) |
| macOS | [Stable macOS Artifact](https://github.com/${{ secrets.RC_OWNER }}/${{ secrets.RC_STABLE_NAME }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz) |
**[Full Changelog](https://git.ryujinx.app/ryubing/ryujinx/-/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }})**
omitBodyDuringUpdate: true
owner: ${{ secrets.RC_OWNER }}
repo: ${{ secrets.RC_STABLE_NAME }}
token: ${{ secrets.ALT_RELEASE_TOKEN }}
release: release:
name: Release for ${{ matrix.platform.name }} name: Release for ${{ matrix.platform.name }}
runs-on: ${{ matrix.platform.os }} runs-on: ${{ matrix.platform.os }}
@ -169,30 +137,6 @@ jobs:
gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=UploadGenericPackage "Ryubing|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync" gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=UploadGenericPackage "Ryubing|${{ steps.version_info.outputs.build_version }}|release_output/ryujinx-$BUILD_VERSION-$ARCH_NAME.AppImage.zsync"
shell: bash shell: bash
- name: Pushing new release
uses: ncipollo/release-action@v1
with:
name: ${{ steps.version_info.outputs.build_version }}
artifacts: "release_output/*.tar.gz,release_output/*.zip,release_output/*AppImage*"
tag: ${{ steps.version_info.outputs.build_version }}
body: |
# Stable builds:
| Platform | Artifact |
|--|--|
| Windows 64-bit | [Stable Windows Artifact](https://github.com/${{ secrets.RC_OWNER }}/${{ secrets.RC_STABLE_NAME }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-win_x64.zip) |
| Windows ARM 64-bit | [Stable Windows ARM Artifact](https://github.com/${{ secrets.RC_OWNER }}/${{ secrets.RC_STABLE_NAME }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-win_arm64.zip) |
| Linux 64-bit | [Stable Linux Artifact](https://github.com/${{ secrets.RC_OWNER }}/${{ secrets.RC_STABLE_NAME }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_x64.tar.gz) |
| Linux ARM 64-bit | [Stable Linux ARM Artifact](https://github.com/${{ secrets.RC_OWNER }}/${{ secrets.RC_STABLE_NAME }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-linux_arm64.tar.gz) |
| macOS | [Stable macOS Artifact](https://github.com/${{ secrets.RC_OWNER }}/${{ secrets.RC_STABLE_NAME }}/releases/download/${{ steps.version_info.outputs.build_version }}/ryujinx-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz) |
**[Full Changelog](https://git.ryujinx.app/ryubing/ryujinx/-/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }})**
omitBodyDuringUpdate: true
allowUpdates: true
replacesArtifacts: true
owner: ${{ secrets.RC_OWNER }}
repo: ${{ secrets.RC_STABLE_NAME }}
token: ${{ secrets.ALT_RELEASE_TOKEN }}
macos_release: macos_release:
name: Release MacOS universal name: Release MacOS universal
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
@ -249,26 +193,11 @@ jobs:
run: | run: |
./distribution/macos/create_macos_build_ava.sh . publish_tmp_ava publish ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 0 ./distribution/macos/create_macos_build_ava.sh . publish_tmp_ava publish ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 0
gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=UploadGenericPackage "Ryubing|${{ steps.version_info.outputs.build_version }}|publish/ryujinx-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz" gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=UploadGenericPackage "Ryubing|${{ steps.version_info.outputs.build_version }}|publish/ryujinx-${{ steps.version_info.outputs.build_version }}-macos_universal.app.tar.gz"
- name: Pushing new release
uses: ncipollo/release-action@v1
with:
name: ${{ steps.version_info.outputs.build_version }}
artifacts: "publish/*.tar.gz"
tag: ${{ steps.version_info.outputs.build_version }}
body: ""
omitBodyDuringUpdate: true
allowUpdates: true
replacesArtifacts: true
owner: ${{ secrets.RC_OWNER }}
repo: ${{ secrets.RC_STABLE_NAME }}
token: ${{ secrets.ALT_RELEASE_TOKEN }}
create_gitlab_release: create_gitlab_release:
name: Create GitLab Release name: Create GitLab Release
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
needs: needs:
- tag
- macos_release - macos_release
- release - release
steps: steps:
@ -299,3 +228,7 @@ jobs:
- name: Send notification webhook - name: Send notification webhook
run: | run: |
gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=SendUpdateMessage "${{ steps.version_info.outputs.build_version }}|32cd32|${{ secrets.STABLE_DISCORD_WEBHOOK }}|https://avatars.githubusercontent.com/u/192939710?s=200&v=4|false" gli --access-token=${{ secrets.GITLAB_TOKEN }} --project=ryubing/ryujinx --command=SendUpdateMessage "${{ steps.version_info.outputs.build_version }}|32cd32|${{ secrets.STABLE_DISCORD_WEBHOOK }}|https://avatars.githubusercontent.com/u/192939710?s=200&v=4|false"
- name: Notify update server of new builds
run: |
curl 'https://update.ryujinx.app/api/v1/admin/refresh_cache?rc=stable' -X PATCH -H 'accept: */*' -H 'Authorization: ${{ secrets.UPDATE_SERVER_ADMIN_TOKEN }}'

View File

@ -2,20 +2,17 @@
All updates to this Ryujinx branch will be documented in this file. All updates to this Ryujinx branch will be documented in this file.
## [1.3.2](<https://git.ryujinx.app/ryubing/ryujinx/-/releases/1.3.2>) - 2025-06-09
## [1.3.1](<https://git.ryujinx.app/ryubing/ryujinx/-/releases/1.3.1>) - 2025-04-23 ## [1.3.1](<https://git.ryujinx.app/ryubing/ryujinx/-/releases/1.3.1>) - 2025-04-23
A list of notable changes can be found on the release linked in the version number above.
## [1.2.86](<https://github.com/Ryubing/Stable-Releases/releases/tag/1.2.86>) - 2025-03-13 ## [1.2.86](<https://github.com/Ryubing/Stable-Releases/releases/tag/1.2.86>) - 2025-03-13
A list of notable changes can be found on the release linked in the version number above.
## [1.2.82](<https://web.archive.org/web/20250312010534/https://github.com/Ryubing/Ryujinx/releases/tag/1.2.82>) - 2025-02-16 ## [1.2.82](<https://web.archive.org/web/20250312010534/https://github.com/Ryubing/Ryujinx/releases/tag/1.2.82>) - 2025-02-16
A list of notable changes can be found on the release linked in the version number above.
## [1.2.80-81](<https://web.archive.org/web/20250302064257/https://github.com/Ryubing/Ryujinx/releases/tag/1.2.81>) - 2025-01-22 ## [1.2.80-81](<https://web.archive.org/web/20250302064257/https://github.com/Ryubing/Ryujinx/releases/tag/1.2.81>) - 2025-01-22
A list of notable changes can be found on the release linked in the version number above.
## [1.2.78](<https://web.archive.org/web/20250301174537/https://github.com/Ryubing/Ryujinx/releases/tag/1.2.78>) - 2024-12-19 ## [1.2.78](<https://web.archive.org/web/20250301174537/https://github.com/Ryubing/Ryujinx/releases/tag/1.2.78>) - 2024-12-19
A list of notable changes can be found on the release linked in the version number above.
## [1.2.73-1.2.76](<https://web.archive.org/web/20250209202612/https://github.com/Ryubing/Ryujinx/releases/tag/1.2.76>) - 2024-11-19 ## [1.2.73-1.2.76](<https://web.archive.org/web/20250209202612/https://github.com/Ryubing/Ryujinx/releases/tag/1.2.76>) - 2024-11-19
A list of notable changes can be found on the release linked in the version number above. A list of notable changes can be found on the release linked in the version number above.
@ -254,4 +251,4 @@ Added Low-power PPTC mode strings to the translation files.
- Autoload DLC/Updates from dir ([#12](https://github.com/GreemDev/Ryujinx/pull/12)). - Autoload DLC/Updates from dir ([#12](https://github.com/GreemDev/Ryujinx/pull/12)).
- Changed executable icon to rainbow logo. - Changed executable icon to rainbow logo.
- Extract Data > Logo now also extracts the square thumbnail you see for the game in the UI. - Extract Data > Logo now also extracts the square thumbnail you see for the game in the UI.
- The "use random UUID hack" checkbox in the Amiibo screen now remembers its last state when you reopen the window in a given session. - The "use random UUID hack" checkbox in the Amiibo screen now remembers its last state when you reopen the window in a given session.

View File

@ -77,6 +77,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Horizon.Kernel.Gene
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.HLE.Generators", "src\Ryujinx.HLE.Generators\Ryujinx.HLE.Generators.csproj", "{B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.HLE.Generators", "src\Ryujinx.HLE.Generators\Ryujinx.HLE.Generators.csproj", "{B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryujinx.BuildValidationTasks", "src\Ryujinx.BuildValidationTasks\Ryujinx.BuildValidationTasks.csproj", "{4A89A234-4F19-497D-A576-DDE8CDFC5B22}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{36F870C1-3E5F-485F-B426-F0645AF78751}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{36F870C1-3E5F-485F-B426-F0645AF78751}"
ProjectSection(SolutionItems) = preProject ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig .editorconfig = .editorconfig
@ -84,10 +86,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
.github\workflows\canary.yml = .github\workflows\canary.yml .github\workflows\canary.yml = .github\workflows\canary.yml
Directory.Packages.props = Directory.Packages.props Directory.Packages.props = Directory.Packages.props
.github\workflows\release.yml = .github\workflows\release.yml .github\workflows\release.yml = .github\workflows\release.yml
nuget.config = nuget.config
EndProjectSection EndProjectSection
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryujinx.BuildValidationTasks", "src\Ryujinx.BuildValidationTasks\Ryujinx.BuildValidationTasks.csproj", "{4A89A234-4F19-497D-A576-DDE8CDFC5B22}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU

View File

@ -187,7 +187,7 @@
"ko_KR": "소프트웨어", "ko_KR": "소프트웨어",
"no_NO": "Programvare", "no_NO": "Programvare",
"pl_PL": "Oprogramowanie", "pl_PL": "Oprogramowanie",
"pt_BR": "", "pt_BR": "Programa",
"ru_RU": "Программное обеспечение", "ru_RU": "Программное обеспечение",
"sv_SE": "Programvara", "sv_SE": "Programvara",
"th_TH": "ซอฟต์แวร์", "th_TH": "ซอฟต์แวร์",
@ -2094,7 +2094,7 @@
"tr_TR": "Toplam Oyun Süresi: {0}", "tr_TR": "Toplam Oyun Süresi: {0}",
"uk_UA": "", "uk_UA": "",
"zh_CN": "总游戏时间: {0}", "zh_CN": "总游戏时间: {0}",
"zh_TW": "" "zh_TW": "總遊戲時間: {0}"
} }
}, },
{ {
@ -2537,7 +2537,7 @@
"ko_KR": "PPTC 디렉터리 열기", "ko_KR": "PPTC 디렉터리 열기",
"no_NO": "Åpne PPTC mappe", "no_NO": "Åpne PPTC mappe",
"pl_PL": "Otwórz katalog PPTC", "pl_PL": "Otwórz katalog PPTC",
"pt_BR": "Abrir Diretório de PPTC Cache", "pt_BR": "Abrir Diretório de Cache PPTC",
"ru_RU": "Открыть папку PPTC", "ru_RU": "Открыть папку PPTC",
"sv_SE": "Öppna PPTC-katalog", "sv_SE": "Öppna PPTC-katalog",
"th_TH": "เปิดไดเรกทอรี่ PPTC", "th_TH": "เปิดไดเรกทอรี่ PPTC",
@ -2912,7 +2912,7 @@
"ko_KR": "사용자 정의 구성 만들기", "ko_KR": "사용자 정의 구성 만들기",
"no_NO": "Opprett egendefinert konfigurasjon", "no_NO": "Opprett egendefinert konfigurasjon",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Criar Configuração Custumizada",
"ru_RU": "Задать индивидуальные параметры", "ru_RU": "Задать индивидуальные параметры",
"sv_SE": "Skapa anpassad konfiguration", "sv_SE": "Skapa anpassad konfiguration",
"th_TH": "", "th_TH": "",
@ -2937,7 +2937,7 @@
"ko_KR": "사용자 정의 구성 편집", "ko_KR": "사용자 정의 구성 편집",
"no_NO": "Rediger egendefinert konfigurasjon", "no_NO": "Rediger egendefinert konfigurasjon",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Editar Configuração Customizada",
"ru_RU": "Изменить индивидуальные параметры", "ru_RU": "Изменить индивидуальные параметры",
"sv_SE": "Redigera anpassad konfiguration", "sv_SE": "Redigera anpassad konfiguration",
"th_TH": "", "th_TH": "",
@ -3012,7 +3012,7 @@
"ko_KR": "선택한 게임에 대한 기존 독립 구성 편집", "ko_KR": "선택한 게임에 대한 기존 독립 구성 편집",
"no_NO": "Rediger din eksisterende uavhengige konfigurasjon for det valgte spillet", "no_NO": "Rediger din eksisterende uavhengige konfigurasjon for det valgte spillet",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Editar sua configuração independente existente para o jogo selecionado",
"ru_RU": "Отредактировать существующие независимые параметры для выбранной игры.", "ru_RU": "Отредактировать существующие независимые параметры для выбранной игры.",
"sv_SE": "Redigera din befintliga oberoende konfiguration för det valda spelet", "sv_SE": "Redigera din befintliga oberoende konfiguration för det valda spelet",
"th_TH": "", "th_TH": "",
@ -3162,7 +3162,7 @@
"ko_KR": "앱의 모드가 포함된 디렉터리 열기", "ko_KR": "앱의 모드가 포함된 디렉터리 열기",
"no_NO": "Åpner mappen som inneholder programmets modifikasjoner", "no_NO": "Åpner mappen som inneholder programmets modifikasjoner",
"pl_PL": "Otwiera katalog zawierający mody dla danej aplikacji", "pl_PL": "Otwiera katalog zawierający mody dla danej aplikacji",
"pt_BR": "Abre a pasta que contém os mods da aplicação ", "pt_BR": "Abre a pasta que contém os mods da aplicação",
"ru_RU": "Открывает папку, содержащую моды для приложений и игр", "ru_RU": "Открывает папку, содержащую моды для приложений и игр",
"sv_SE": "Öppnar katalogen som innehåller applikationens Mods", "sv_SE": "Öppnar katalogen som innehåller applikationens Mods",
"th_TH": "เปิดไดเร็กทอรี่ Mods ของแอปพลิเคชัน", "th_TH": "เปิดไดเร็กทอรี่ Mods ของแอปพลิเคชัน",
@ -3987,7 +3987,7 @@
"ko_KR": "원래 UI 스타일 표시(다시 시작 필요)", "ko_KR": "원래 UI 스타일 표시(다시 시작 필요)",
"no_NO": "Vis original UI-stil (krever omstart)", "no_NO": "Vis original UI-stil (krever omstart)",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Mostrar Estilo Original da Interface (Requer Reinicialização)",
"ru_RU": "Включить оригинальный интерфейса (требуется перезагрузка)", "ru_RU": "Включить оригинальный интерфейса (требуется перезагрузка)",
"sv_SE": "Visa ursprunglig gränssnittsstil (kräver omstart)", "sv_SE": "Visa ursprunglig gränssnittsstil (kräver omstart)",
"th_TH": "", "th_TH": "",
@ -4012,7 +4012,7 @@
"ko_KR": "Ryujinx 1.1.1403을 연상시키는 이전 Avalonia Ryujinx UI를 표시합니다. 이 기능은 Windows가 아닌 플랫폼에서는 기본적으로 활성화됩니다.\n 클래식 스타일의 타이틀 바가 돌아왔고 주요 창 레이아웃 재작업이 역전되었습니다. 이 툴팁 위의 설정 탐색 배치와 같은 작업입니다.", "ko_KR": "Ryujinx 1.1.1403을 연상시키는 이전 Avalonia Ryujinx UI를 표시합니다. 이 기능은 Windows가 아닌 플랫폼에서는 기본적으로 활성화됩니다.\n 클래식 스타일의 타이틀 바가 돌아왔고 주요 창 레이아웃 재작업이 역전되었습니다. 이 툴팁 위의 설정 탐색 배치와 같은 작업입니다.",
"no_NO": "Vis det eldre Avalonia Ryujinx-grensesnittet som minner om Ryujinx 1.1.1403. Dette er aktivert som standard på plattformer som ikke er Windows.\nTittellinjen i klassisk stil er tilbake, og store omarbeidinger av vindusoppsettet er reversert, for eksempel plasseringen av innstillingsnavigasjonen over dette verktøytipset.", "no_NO": "Vis det eldre Avalonia Ryujinx-grensesnittet som minner om Ryujinx 1.1.1403. Dette er aktivert som standard på plattformer som ikke er Windows.\nTittellinjen i klassisk stil er tilbake, og store omarbeidinger av vindusoppsettet er reversert, for eksempel plasseringen av innstillingsnavigasjonen over dette verktøytipset.",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Mostrar a Interface Avalonia antiga do Ryujinx 1.1.1403. Esta versão é ativada por padrão nas plataformas que não sejam Windows. \nO estilo clássico da Barra de Título retorna e grande parte das mudanças do Layout de janela são revertidas; assim como as configurações de posicionamento da navegação acima dessa descrição.",
"ru_RU": "Показать старый пользовательский интерфейс Avalonia Ryujinx, напоминающий Ryujinx 1.1.1403. Включено по умолчанию на платформах, отличных от Windows.\nСтрока заголовка в классическом стиле вернётся на место, а основные изменения в оформлении окна будут отменены; например, расположение навигации по настройкам над этой всплывающей подсказкой.", "ru_RU": "Показать старый пользовательский интерфейс Avalonia Ryujinx, напоминающий Ryujinx 1.1.1403. Включено по умолчанию на платформах, отличных от Windows.\nСтрока заголовка в классическом стиле вернётся на место, а основные изменения в оформлении окна будут отменены; например, расположение навигации по настройкам над этой всплывающей подсказкой.",
"sv_SE": "Visa det gamla Ryuijinx-gränssnittet baserat på Avalonia som påminner om version 1.1.1403. Detta är aktiverat som standard på plattformat som inte är Windows.\nDen klassiska titelfältet är tillbaka och de stora omarbetningarna av fönsterlayouten är omvända, till exempel placeringen av inställningsnavigeringen ovanför detta verktygstips.", "sv_SE": "Visa det gamla Ryuijinx-gränssnittet baserat på Avalonia som påminner om version 1.1.1403. Detta är aktiverat som standard på plattformat som inte är Windows.\nDen klassiska titelfältet är tillbaka och de stora omarbetningarna av fönsterlayouten är omvända, till exempel placeringen av inställningsnavigeringen ovanför detta verktygstips.",
"th_TH": "", "th_TH": "",
@ -5087,7 +5087,7 @@
"ko_KR": "터보 모드 배수 :", "ko_KR": "터보 모드 배수 :",
"no_NO": "Multiplikator i turbomodus:", "no_NO": "Multiplikator i turbomodus:",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Multiplicador do Modo Turbo",
"ru_RU": "", "ru_RU": "",
"sv_SE": "Multiplikator för turboläge:", "sv_SE": "Multiplikator för turboläge:",
"th_TH": "", "th_TH": "",
@ -5112,7 +5112,7 @@
"ko_KR": "터보 모드 배수 목표 값입니다.\n\n모르면 200으로 두세요.", "ko_KR": "터보 모드 배수 목표 값입니다.\n\n모르면 200으로 두세요.",
"no_NO": "Målverdien for multiplikatoren i turbomodus. \n\nLa syå på 200 hvis du er usikker.", "no_NO": "Målverdien for multiplikatoren i turbomodus. \n\nLa syå på 200 hvis du er usikker.",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "O valor do Multiplicador do Modo Turbo. Deixe em 200 se não tiver certeza.",
"ru_RU": "", "ru_RU": "",
"sv_SE": "Målvärdet för multiplikatorn i turboläget. \n\nLämna den på 200 om du är osäker.", "sv_SE": "Målvärdet för multiplikatorn i turboläget. \n\nLämna den på 200 om du är osäker.",
"th_TH": "", "th_TH": "",
@ -5137,7 +5137,7 @@
"ko_KR": "터보 모드는 게임이 프레임 속도에 민감하지 않을 때 효과적으로 속도를 높이거나 낮추는 에뮬레이터 기능입니다.\n이 기능은 Ryujinx 키보드 단축키 설정에서 구성할 수 있는 단축키를 사용하여 게임 내에서 전환할 수 있습니다.\n\n모르면 200으로 두세요.", "ko_KR": "터보 모드는 게임이 프레임 속도에 민감하지 않을 때 효과적으로 속도를 높이거나 낮추는 에뮬레이터 기능입니다.\n이 기능은 Ryujinx 키보드 단축키 설정에서 구성할 수 있는 단축키를 사용하여 게임 내에서 전환할 수 있습니다.\n\n모르면 200으로 두세요.",
"no_NO": "Turbo-modus er en emulatorfunksjon som effektivt øker eller senker hastigheten når et spill ikke er følsom for bildefrekvens.\nDu kan slå på denne funksjonen i spillet med en hurtigtast, som kan konfigureres i Ryujinx Keyboard Hotkeys-innstillingene.\n\nLa den stå på 200 hvis du er usikker.", "no_NO": "Turbo-modus er en emulatorfunksjon som effektivt øker eller senker hastigheten når et spill ikke er følsom for bildefrekvens.\nDu kan slå på denne funksjonen i spillet med en hurtigtast, som kan konfigureres i Ryujinx Keyboard Hotkeys-innstillingene.\n\nLa den stå på 200 hvis du er usikker.",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "O Modo Turbo é um recurso do emulador que efetivamente aumenta ou dimimui a velocidade de um jogo quando o mesmo não é sensivel à taxa de quadros. \nVocê pode ativar esse recurso dentro do jogo com uma tecla de atalho, configurável nas Configurações de Teclas de Atalho do Ryujinx. \n\nDeixe em 200 se não tiver certeza.",
"ru_RU": "", "ru_RU": "",
"sv_SE": "Turboläget är en emulatorfunktion som effektivt ökar eller sänker hastigheten när ett spel inte är känsligt för bildfrekvens.\nDu kan växla denna funktion i spelet med en snabbtangent, konfigurerbar i Ryujinx inställningar för snabbtangenter.\n\nLämna den på 200 om du är osäker.", "sv_SE": "Turboläget är en emulatorfunktion som effektivt ökar eller sänker hastigheten när ett spel inte är känsligt för bildfrekvens.\nDu kan växla denna funktion i spelet med en snabbtangent, konfigurerbar i Ryujinx inställningar för snabbtangenter.\n\nLämna den på 200 om du är osäker.",
"th_TH": "", "th_TH": "",
@ -5312,7 +5312,7 @@
"ko_KR": "핵", "ko_KR": "핵",
"no_NO": "", "no_NO": "",
"pl_PL": "Hacki", "pl_PL": "Hacki",
"pt_BR": "", "pt_BR": "Trapaças",
"ru_RU": "Хаки", "ru_RU": "Хаки",
"sv_SE": "Hack", "sv_SE": "Hack",
"th_TH": "แฮ็ก", "th_TH": "แฮ็ก",
@ -6112,7 +6112,7 @@
"ko_KR": "개발자 옵션", "ko_KR": "개발자 옵션",
"no_NO": "Utvikleralternativer", "no_NO": "Utvikleralternativer",
"pl_PL": "Opcje programisty", "pl_PL": "Opcje programisty",
"pt_BR": "Opções do desenvolvedor", "pt_BR": "Opções do Desenvolvedor",
"ru_RU": "Параметры разработчика", "ru_RU": "Параметры разработчика",
"sv_SE": "Utvecklarinställningar", "sv_SE": "Utvecklarinställningar",
"th_TH": "ตัวเลือกนักพัฒนา", "th_TH": "ตัวเลือกนักพัฒนา",
@ -6237,7 +6237,7 @@
"ko_KR": "조각 기록 활성화", "ko_KR": "조각 기록 활성화",
"no_NO": "Aktiver Stub-logger", "no_NO": "Aktiver Stub-logger",
"pl_PL": "Wlącz Skróty Logów", "pl_PL": "Wlącz Skróty Logów",
"pt_BR": "Habilitar logs de Stub", "pt_BR": "Habilitar Logs de Stub",
"ru_RU": "Включить журнал-заглушку", "ru_RU": "Включить журнал-заглушку",
"sv_SE": "Aktivera stubbloggar", "sv_SE": "Aktivera stubbloggar",
"th_TH": "เปิดใช้งานการบันทึกประวัติ", "th_TH": "เปิดใช้งานการบันทึกประวัติ",
@ -6262,7 +6262,7 @@
"ko_KR": "정보 기록 활성화", "ko_KR": "정보 기록 활성화",
"no_NO": "Aktiver informasjonslogger", "no_NO": "Aktiver informasjonslogger",
"pl_PL": "Włącz Logi Informacyjne", "pl_PL": "Włącz Logi Informacyjne",
"pt_BR": "Habilitar logs de Informação", "pt_BR": "Habilitar Logs de Informação",
"ru_RU": "Включить информационный журнал", "ru_RU": "Включить информационный журнал",
"sv_SE": "Aktivera informationsloggar", "sv_SE": "Aktivera informationsloggar",
"th_TH": "เปิดใช้งานการบันทึกประวัติการใช้งาน", "th_TH": "เปิดใช้งานการบันทึกประวัติการใช้งาน",
@ -6462,7 +6462,7 @@
"ko_KR": "개발자 옵션", "ko_KR": "개발자 옵션",
"no_NO": "Utvikleralternativer", "no_NO": "Utvikleralternativer",
"pl_PL": "Opcje programisty (UWAGA: wpływa na wydajność)", "pl_PL": "Opcje programisty (UWAGA: wpływa na wydajność)",
"pt_BR": "Opções do desenvolvedor", "pt_BR": "Opções do Desenvolvedor",
"ru_RU": "Параметры разработчика", "ru_RU": "Параметры разработчика",
"sv_SE": "Utvecklarinställningar", "sv_SE": "Utvecklarinställningar",
"th_TH": "ตัวเลือกนักพัฒนา", "th_TH": "ตัวเลือกนักพัฒนา",
@ -7212,14 +7212,14 @@
"ko_KR": "발견된 구성 :\n\n이름 : \t{0}\n가이드 : \t{1}\n\n 컨트롤러 연결 대기 중...", "ko_KR": "발견된 구성 :\n\n이름 : \t{0}\n가이드 : \t{1}\n\n 컨트롤러 연결 대기 중...",
"no_NO": "", "no_NO": "",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Configuração encontrada:\n\nNome:\t{0}\nGUID:\t{1}\n\n Aguardando conexão do controle...",
"ru_RU": "", "ru_RU": "",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
"uk_UA": "", "uk_UA": "",
"zh_CN": "发现配置:\n\n名称:\t{0}\nGUID:\t{1}\n\n 正在等待控制器连接...", "zh_CN": "发现配置:\n\n名称:\t{0}\nGUID:\t{1}\n\n 正在等待控制器连接...",
"zh_TW": "" "zh_TW": "找到控制器的配置:\n\n名稱:\t{0}\nGUID:\t{1}\n\n 正在等待控制器連線..."
} }
}, },
{ {
@ -10912,7 +10912,7 @@
"ko_KR": "좌측 스틱 버튼", "ko_KR": "좌측 스틱 버튼",
"no_NO": "Venstre Styrespak Trykk", "no_NO": "Venstre Styrespak Trykk",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Botão Analógico Esquerdo",
"ru_RU": "Кнопка лев. стика", "ru_RU": "Кнопка лев. стика",
"sv_SE": "L-spakknapp", "sv_SE": "L-spakknapp",
"th_TH": "", "th_TH": "",
@ -10937,7 +10937,7 @@
"ko_KR": "우측 스틱 버튼", "ko_KR": "우측 스틱 버튼",
"no_NO": "Høyre Styrespak Trykk", "no_NO": "Høyre Styrespak Trykk",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Botão Analógico Direito",
"ru_RU": "Кнопка пр. стика", "ru_RU": "Кнопка пр. стика",
"sv_SE": "R-spakknapp", "sv_SE": "R-spakknapp",
"th_TH": "", "th_TH": "",
@ -10962,7 +10962,7 @@
"ko_KR": "좌측 숄더", "ko_KR": "좌측 숄더",
"no_NO": "Venstre Skulder", "no_NO": "Venstre Skulder",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Ombro Esquerdo",
"ru_RU": "Левый бампер", "ru_RU": "Левый бампер",
"sv_SE": "Vänster kantknapp", "sv_SE": "Vänster kantknapp",
"th_TH": "", "th_TH": "",
@ -10987,7 +10987,7 @@
"ko_KR": "우측 숄더", "ko_KR": "우측 숄더",
"no_NO": "Høyre Skulder", "no_NO": "Høyre Skulder",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Ombro Direito",
"ru_RU": "Правый бампер", "ru_RU": "Правый бампер",
"sv_SE": "Höger kantknapp", "sv_SE": "Höger kantknapp",
"th_TH": "", "th_TH": "",
@ -11012,7 +11012,7 @@
"ko_KR": "좌측 트리거", "ko_KR": "좌측 트리거",
"no_NO": "Venstre utløser", "no_NO": "Venstre utløser",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Gatilho Esquerdo",
"ru_RU": "Левый триггер", "ru_RU": "Левый триггер",
"sv_SE": "Vänster avtryckare", "sv_SE": "Vänster avtryckare",
"th_TH": "", "th_TH": "",
@ -11037,7 +11037,7 @@
"ko_KR": "우측 트리거", "ko_KR": "우측 트리거",
"no_NO": "Høyre utløser", "no_NO": "Høyre utløser",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Gatilho Direito",
"ru_RU": "Правый триггер", "ru_RU": "Правый триггер",
"sv_SE": "Höger avtryckare", "sv_SE": "Höger avtryckare",
"th_TH": "", "th_TH": "",
@ -11062,7 +11062,7 @@
"ko_KR": "↑", "ko_KR": "↑",
"no_NO": "Opp", "no_NO": "Opp",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Cima",
"ru_RU": "Вверх", "ru_RU": "Вверх",
"sv_SE": "Upp", "sv_SE": "Upp",
"th_TH": "", "th_TH": "",
@ -11087,7 +11087,7 @@
"ko_KR": "↓", "ko_KR": "↓",
"no_NO": "Ned", "no_NO": "Ned",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Baixo",
"ru_RU": "Вниз", "ru_RU": "Вниз",
"sv_SE": "Ner", "sv_SE": "Ner",
"th_TH": "", "th_TH": "",
@ -11112,7 +11112,7 @@
"ko_KR": "←", "ko_KR": "←",
"no_NO": "Venstre", "no_NO": "Venstre",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Esquerda",
"ru_RU": "Влево", "ru_RU": "Влево",
"sv_SE": "Vänster", "sv_SE": "Vänster",
"th_TH": "", "th_TH": "",
@ -11137,7 +11137,7 @@
"ko_KR": "→", "ko_KR": "→",
"no_NO": "Høyre", "no_NO": "Høyre",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Direita",
"ru_RU": "Вправо", "ru_RU": "Вправо",
"sv_SE": "Höger", "sv_SE": "Höger",
"th_TH": "", "th_TH": "",
@ -11212,7 +11212,7 @@
"ko_KR": "가이드", "ko_KR": "가이드",
"no_NO": "Veiledning", "no_NO": "Veiledning",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Guia",
"ru_RU": "Кнопка меню", "ru_RU": "Кнопка меню",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
@ -11387,7 +11387,7 @@
"ko_KR": "좌측 트리거 0", "ko_KR": "좌측 트리거 0",
"no_NO": "Venstre utløser 0", "no_NO": "Venstre utløser 0",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Gatilho Esquerdo 0",
"ru_RU": "Левый триггер 0", "ru_RU": "Левый триггер 0",
"sv_SE": "Vänster avtryckare 0", "sv_SE": "Vänster avtryckare 0",
"th_TH": "", "th_TH": "",
@ -11412,7 +11412,7 @@
"ko_KR": "우측 트리거 0", "ko_KR": "우측 트리거 0",
"no_NO": "Høyre utløser 0", "no_NO": "Høyre utløser 0",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Gatilho Direito 0",
"ru_RU": "Правый триггер 0", "ru_RU": "Правый триггер 0",
"sv_SE": "Höger avtryckare 0", "sv_SE": "Höger avtryckare 0",
"th_TH": "", "th_TH": "",
@ -11437,7 +11437,7 @@
"ko_KR": "좌측 트리거 1", "ko_KR": "좌측 트리거 1",
"no_NO": "Venstre utløser 1", "no_NO": "Venstre utløser 1",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": " Gatilho Esquerdo 1",
"ru_RU": "Левый триггер 1", "ru_RU": "Левый триггер 1",
"sv_SE": "Vänster avtryckare 1", "sv_SE": "Vänster avtryckare 1",
"th_TH": "", "th_TH": "",
@ -11462,7 +11462,7 @@
"ko_KR": "우측 트리거 1", "ko_KR": "우측 트리거 1",
"no_NO": "Høyre utløser 1", "no_NO": "Høyre utløser 1",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Gatilho Direito 1",
"ru_RU": "Правый триггер 1", "ru_RU": "Правый триггер 1",
"sv_SE": "Höger avtryckare 1", "sv_SE": "Höger avtryckare 1",
"th_TH": "", "th_TH": "",
@ -11487,7 +11487,7 @@
"ko_KR": "좌측 스틱", "ko_KR": "좌측 스틱",
"no_NO": "Venstre styrespak", "no_NO": "Venstre styrespak",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Analógico Esquerdo",
"ru_RU": "Левый стик", "ru_RU": "Левый стик",
"sv_SE": "Vänster spak", "sv_SE": "Vänster spak",
"th_TH": "", "th_TH": "",
@ -11512,7 +11512,7 @@
"ko_KR": "우측 스틱", "ko_KR": "우측 스틱",
"no_NO": "Høyre styrespak", "no_NO": "Høyre styrespak",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Analógico Direito",
"ru_RU": "Правый стик", "ru_RU": "Правый стик",
"sv_SE": "Höger spak", "sv_SE": "Höger spak",
"th_TH": "", "th_TH": "",
@ -11787,7 +11787,7 @@
"ko_KR": "사용자 지정 프로필 이미지를 가져오거나 시스템 펌웨어에서 아바타 선택 가능", "ko_KR": "사용자 지정 프로필 이미지를 가져오거나 시스템 펌웨어에서 아바타 선택 가능",
"no_NO": "Du kan importere et tilpasset profilbilde, eller velge en avatar fra system fastvare", "no_NO": "Du kan importere et tilpasset profilbilde, eller velge en avatar fra system fastvare",
"pl_PL": "Możesz zaimportować niestandardowy obraz profilu lub wybrać awatar z firmware'u systemowego", "pl_PL": "Możesz zaimportować niestandardowy obraz profilu lub wybrać awatar z firmware'u systemowego",
"pt_BR": "Você pode importar uma imagem customizada, ou selecionar um avatar do firmware", "pt_BR": "Você pode importar uma imagem customizada, ou selecionar um avatar do Firmware",
"ru_RU": "Вы можете импортировать собственное изображение или выбрать аватар из системной прошивки.", "ru_RU": "Вы можете импортировать собственное изображение или выбрать аватар из системной прошивки.",
"sv_SE": "Du kan importera en anpassad profilbild eller välja en avatar från systemets firmware", "sv_SE": "Du kan importera en anpassad profilbild eller välja en avatar från systemets firmware",
"th_TH": "คุณสามารถนำเข้ารูปโปรไฟล์ที่กำหนดเองได้ หรือ เลือกรูปที่มีจากระบบ", "th_TH": "คุณสามารถนำเข้ารูปโปรไฟล์ที่กำหนดเองได้ หรือ เลือกรูปที่มีจากระบบ",
@ -13087,7 +13087,7 @@
"ko_KR": "업데이트가 취소되었습니다!", "ko_KR": "업데이트가 취소되었습니다!",
"no_NO": "Avbryter oppdatering!", "no_NO": "Avbryter oppdatering!",
"pl_PL": "Anulowanie aktualizacji!", "pl_PL": "Anulowanie aktualizacji!",
"pt_BR": "Cancelando atualização!", "pt_BR": "Atualização Cancelada!",
"ru_RU": "Отмена обновления...", "ru_RU": "Отмена обновления...",
"sv_SE": "Avbryter uppdatering!", "sv_SE": "Avbryter uppdatering!",
"th_TH": "ยกเลิกการอัพเดต!", "th_TH": "ยกเลิกการอัพเดต!",
@ -13123,53 +13123,28 @@
} }
}, },
{ {
"ID": "DialogUpdaterFailedToGetVersionMessage", "ID": "DialogUpdaterConvertFailedServerMessage",
"Translations": { "Translations": {
"ar_SA": "حدث خطأ أثناء محاولة الحصول على معلومات الإصدار من إصدار غيت هاب. يمكن أن يحدث هذا إذا تم تجميع إصدار جديد بواسطة إجراءات غيت هاب. جرب مجددا بعد دقائق.", "ar_SA": "",
"de_DE": "Beim Versuch, Veröffentlichungs-Info von GitHub Release zu erhalten, ist ein Fehler aufgetreten. Dies kann aufgrund einer neuen Veröffentlichung, die gerade von GitHub Actions kompiliert wird, verursacht werden.", "de_DE": "",
"el_GR": "Προέκυψε ένα σφάλμα στη λήψη πληροφοριών έκδοσης από τα GitHub Releases. Αυτό δύναται να συμβεί αν μία έκδοση χτίζεται αυτή τη στιγμή στα GitHub Actions. Παρακαλούμε προσπαθήστε αργότερα.", "el_GR": "",
"en_US": "An error occurred while trying to retrieve release information from GitHub. This may happen if a new release is currently being compiled by GitHub Actions. Please try again in a few minutes.", "en_US": "Failed to convert the Ryujinx version received from the update server.",
"es_ES": "Se ha producido un error al intentar obtener información de liberación de GitHub Release. Esto puede ser causado si una nueva versión está siendo compilada por GitHub Actions. Inténtalo de nuevo en unos minutos.", "es_ES": "",
"fr_FR": "Une erreur s'est produite lors de la tentative d'obtention des informations de publication de la version GitHub. Cela peut survenir lorsqu'une nouvelle version est en cours de compilation par GitHub Actions. Réessayez dans quelques minutes.", "fr_FR": "La conversion de la version de Ryujinx reçue du serveur a échoué.",
"he_IL": "אירעה שגיאה בעת ניסיון לקבל עדכונים מ-גיטהב. זה יכול להיגרם אם הגרסה המעודכנת האחרונה נוצרה על ידי פעולות של גיטהב. נסה שוב בעוד מספר דקות.", "he_IL": "",
"it_IT": "Si è verificato un errore durante il tentativo di recuperare le informazioni sulla versione da GitHub Release. Ciò può verificarsi se una nuova versione è in fase di compilazione da GitHub Actions. Riprova tra qualche minuto.", "it_IT": "",
"ja_JP": "Github からのリリース情報取得時にエラーが発生しました. Github Actions でリリースファイルを作成中かもしれません. 後ほどもう一度試してみてください.", "ja_JP": "",
"ko_KR": "GitHub에서 릴리스 정보를 검색하는 동안 오류가 발생했습니다. 현재 GitHub Actions에서 새 릴리스를 컴파일하는 중일 때 발생할 수 있습니다. 몇 분 후에 다시 시도해 주세요.", "ko_KR": "업데이트 서버에서 받은 Ryujinx 버전을 변환하는 데 실패했습니다.",
"no_NO": "En feil oppstod ved forsøk på å få utgivelsesinformasjon fra GitHub Utgivelse. Dette kan forårsakes hvis en ny utgave blir samlet av GitHub Handlinger. Prøv igjen om noen minutter.", "no_NO": "Kunne ikke konvertere Ryujinx-versjonen som ble mottatt fra oppdateringsserveren.",
"pl_PL": "Wystąpił błąd podczas próby uzyskania informacji o obecnej wersji z GitHub Release. Może to być spowodowane nową wersją kompilowaną przez GitHub Actions. Spróbuj ponownie za kilka minut.", "pl_PL": "",
"pt_BR": "Ocorreu um erro ao tentar obter as informações de atualização do GitHub Release. Isso pode ser causado se uma nova versão estiver sendo compilado pelas Ações do GitHub. Tente novamente em alguns minutos.", "pt_BR": "Falha em atualizar a versão do Ryujinx recebida do servidor de atualização.",
"ru_RU": "Произошла ошибка при попытке получить информацию о выпуске от GitHub Release. Это может быть вызвано тем, что в данный момент в GitHub Actions компилируется новый релиз. Повторите попытку позже.", "ru_RU": "",
"sv_SE": "Ett fel inträffade vid försök att hämta information om utgåvan från GitHub. Detta kan hända om en ny utgåva har kompilerats av GitHub Actions. Försök igen om några minuter.", "sv_SE": "",
"th_TH": "เกิดข้อผิดพลาดขณะพยายามรับข้อมูลเวอร์ชั่นจาก GitHub Release ปัญหานี้อาจเกิดขึ้นได้หากมีการรวบรวมเวอร์ชั่นใหม่โดย GitHub โปรดลองอีกครั้งในอีกไม่กี่นาทีข้างหน้า", "th_TH": "",
"tr_TR": "GitHub tarafından sürüm bilgileri alınırken bir hata oluştu. Eğer yeni sürüm için hazırlıklar yapılıyorsa bu hatayı almanız olasıdır. Lütfen birkaç dakika sonra tekrar deneyiniz.", "tr_TR": "",
"uk_UA": "Під час спроби отримати інформацію про випуск із GitHub Release сталася помилка. Це може бути спричинено, якщо новий випуск компілюється GitHub Actions. Повторіть спробу через кілька хвилин.", "uk_UA": "",
"zh_CN": "尝试从 Github 获取版本信息时无效,可能由于 GitHub Actions 正在编译新版本。\n请过一会再试。", "zh_CN": "无法转换从更新服务器接收的 Ryujinx 版本。",
"zh_TW": "嘗試從 GitHub Release 取得發布資訊時發生錯誤。如果 GitHub Actions 正在編譯新版本,則可能會出現這種情況。請幾分鐘後再試一次。" "zh_TW": "無法轉換從更新何服器接收的 Ryujinx 版本。"
}
},
{
"ID": "DialogUpdaterConvertFailedGithubMessage",
"Translations": {
"ar_SA": "فشل تحويل إصدار ريوجينكس المستلم من إصدار غيت هاب.",
"de_DE": "Fehler beim Konvertieren der erhaltenen Ryujinx-Version von GitHub Release.",
"el_GR": "Αποτυχία μετατροπής της ληφθείσας έκδοσης Ryujinx από την έκδοση GitHub.",
"en_US": "Failed to convert the Ryujinx version received from GitHub.",
"es_ES": "No se pudo convertir la versión de Ryujinx recibida de GitHub Release.",
"fr_FR": "Impossible de convertir la version reçue de Ryujinx depuis GitHub Release.",
"he_IL": "המרת גרסת ריוג'ינקס שהתקבלה מ-עדכון הגרסאות של גיטהב נכשלה.",
"it_IT": "La conversione della versione di Ryujinx ricevuta da GitHub Release è fallita.",
"ja_JP": "Github から取得した Ryujinx バージョンの変換に失敗しました.",
"ko_KR": "GitHub에서 받은 Ryujinx 버전을 변환하지 못했습니다.",
"no_NO": "Kan ikke konvertere mottatt Ryujinx-versjon fra GitHub Utgivelse.",
"pl_PL": "Nie udało się przekonwertować otrzymanej wersji Ryujinx z Github Release.",
"pt_BR": "Falha ao converter a versão Ryujinx recebida do GitHub.",
"ru_RU": "Не удалось преобразовать полученную версию Ryujinx из GitHub Release.",
"sv_SE": "Misslyckades med att konvertera mottagen Ryujinx-version från GitHub.",
"th_TH": "ไม่สามารถแปลงเวอร์ชั่น Ryujinx ที่ได้รับจาก GitHub Release",
"tr_TR": "Github Release'den alınan Ryujinx sürümü dönüştürülemedi.",
"uk_UA": "Не вдалося конвертувати отриману версію Ryujinx із випуску GitHub.",
"zh_CN": "无法切换至从 GitHub 接收到的新版 Ryujinx 模拟器。",
"zh_TW": "無法轉換從 GitHub Release 接收到的 Ryujinx 版本。"
} }
}, },
{ {
@ -16584,17 +16559,17 @@
"he_IL": "", "he_IL": "",
"it_IT": "", "it_IT": "",
"ja_JP": "", "ja_JP": "",
"ko_KR": "", "ko_KR": "사용자 지정 설정에서 이 옵션을 활성화하면 전역 입력 구성이 사용됩니다.\n\n전역 설정에서 필요에 따라 활성화하거나 비활성화할 수 있습니다. 이 설정은 새로 생성된 모든 사용자 지정 구성에 상속됩니다.",
"no_NO": "", "no_NO": "",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Se esta opção está ativada nas configurações customizadas, as configurações globais de entrada serão usadas.\n\nNas configurações globais: você pode ativar ou desativá-las se necessário; está configuração será herdada por qualquer nova configuração customizada criada.",
"ru_RU": "Если эта опция включена в пользовательских настройках, будет использована глобальная конфигурация ввода.\n\nВ глобальных настройках: переключите эту опцию по своему усмотрению, это будет унаследовано для вновь созданых пользовательских конфигураций", "ru_RU": "Если эта опция включена в пользовательских настройках, будет использована глобальная конфигурация ввода.\n\nВ глобальных настройках: переключите эту опцию по своему усмотрению, это будет унаследовано для вновь созданых пользовательских конфигураций",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
"uk_UA": "", "uk_UA": "",
"zh_CN": "", "zh_CN": "如果在自定义设置中启用了此选项,则将使用全局输入配置。\n\n在全局设置中: 您可以根据需要启用或禁用它;之后创建的任何自定义配置都将继承此设置。",
"zh_TW": "" "zh_TW": "如果在自訂設定啟用了此選項,則將使用全域輸入配置。\n\n在全域設定中你可以根據需要啟用或停用它之後建立的任何自訂配置都將繼承此設定。"
} }
}, },
{ {
@ -18569,7 +18544,7 @@
"tr_TR": "", "tr_TR": "",
"uk_UA": "", "uk_UA": "",
"zh_CN": "{0} FPS ({1}毫秒)", "zh_CN": "{0} FPS ({1}毫秒)",
"zh_TW": "" "zh_TW": "{0} FPS ({1}毫秒)"
} }
}, },
{ {
@ -23087,7 +23062,7 @@
"ko_KR": "근린", "ko_KR": "근린",
"no_NO": "Nærmeste", "no_NO": "Nærmeste",
"pl_PL": "Najbliższe", "pl_PL": "Najbliższe",
"pt_BR": "", "pt_BR": "Mais Próximo",
"ru_RU": "Ступенчатая", "ru_RU": "Ступенчатая",
"sv_SE": "Närmaste", "sv_SE": "Närmaste",
"th_TH": "ใกล้สุด", "th_TH": "ใกล้สุด",
@ -23462,14 +23437,14 @@
"ko_KR": "변경 로그 보기", "ko_KR": "변경 로그 보기",
"no_NO": "", "no_NO": "",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Ver Registro",
"ru_RU": "", "ru_RU": "",
"sv_SE": "", "sv_SE": "",
"th_TH": "ด", "th_TH": "ด",
"tr_TR": "", "tr_TR": "",
"uk_UA": "", "uk_UA": "",
"zh_CN": "查看更新日志", "zh_CN": "查看更新日志",
"zh_TW": "" "zh_TW": "檢視更新日誌"
} }
}, },
{ {
@ -24337,7 +24312,7 @@
"ko_KR": "터보 모드 :", "ko_KR": "터보 모드 :",
"no_NO": "", "no_NO": "",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Modo Turbo:",
"ru_RU": "", "ru_RU": "",
"sv_SE": "Turboläge:", "sv_SE": "Turboläge:",
"th_TH": "", "th_TH": "",
@ -24362,7 +24337,7 @@
"ko_KR": "터보 모드 단축키입니다.\nRyujinx CPU 설정에서 터보 모드의 동작을 구성합니다.\n\n모르면 바인딩 해제 상태로 두세요.", "ko_KR": "터보 모드 단축키입니다.\nRyujinx CPU 설정에서 터보 모드의 동작을 구성합니다.\n\n모르면 바인딩 해제 상태로 두세요.",
"no_NO": "Hurtigtasten for turbo-modus.\nKonfigurer oppførselen til turbo-modus i Ryujinx CPU-innstillinger.\n\nLa være ubundet hvis du er usikker.", "no_NO": "Hurtigtasten for turbo-modus.\nKonfigurer oppførselen til turbo-modus i Ryujinx CPU-innstillinger.\n\nLa være ubundet hvis du er usikker.",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Tecla de atalho do Modo Turbo.\nConfigure o comportamento do Modo Turbo nas configurações de CPU do Ryujinx.\n\nDeixe Não Atribuído se não tiver certeza.",
"ru_RU": "", "ru_RU": "",
"sv_SE": "Snabbtangenten för turboläge.\nKonfigurera beteendet för turboläge i Ryujinx CPU-inställningar.\n\nLämna Obunden om du är osäker.", "sv_SE": "Snabbtangenten för turboläge.\nKonfigurera beteendet för turboläge i Ryujinx CPU-inställningar.\n\nLämna Obunden om du är osäker.",
"th_TH": "", "th_TH": "",
@ -24387,7 +24362,7 @@
"ko_KR": "누르고 있는 동안만", "ko_KR": "누르고 있는 동안만",
"no_NO": "Bare mens du trykker på", "no_NO": "Bare mens du trykker på",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Somente enquanto pressionado.",
"ru_RU": "", "ru_RU": "",
"sv_SE": "Endast när du trycker ner", "sv_SE": "Endast när du trycker ner",
"th_TH": "", "th_TH": "",
@ -24437,7 +24412,7 @@
"ko_KR": "호환성 목록 - {0}개 항목", "ko_KR": "호환성 목록 - {0}개 항목",
"no_NO": "Kompatibilitetsliste - {0} oppføringer", "no_NO": "Kompatibilitetsliste - {0} oppføringer",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Lista de Compatibilidade - {0} registros",
"ru_RU": "Список совместимости — записей: {0}", "ru_RU": "Список совместимости — записей: {0}",
"sv_SE": "Kompatibilitetslista - {0} poster", "sv_SE": "Kompatibilitetslista - {0} poster",
"th_TH": "", "th_TH": "",
@ -24512,7 +24487,7 @@
"ko_KR": "어카이브 {0} 호환성 항목...", "ko_KR": "어카이브 {0} 호환성 항목...",
"no_NO": "Søk i {0} kompatibilitetsoppføringer...", "no_NO": "Søk i {0} kompatibilitetsoppføringer...",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Procurando {0} registros de compatibilidade...",
"ru_RU": "Поиск среди {0} записей о совместимости...", "ru_RU": "Поиск среди {0} записей о совместимости...",
"sv_SE": "Sök i {0} kompatibilitetsposter...", "sv_SE": "Sök i {0} kompatibilitetsposter...",
"th_TH": "", "th_TH": "",
@ -24937,7 +24912,7 @@
"ko_KR": "사용자 정의 설정", "ko_KR": "사용자 정의 설정",
"no_NO": "Tilpasset konfigurasjon", "no_NO": "Tilpasset konfigurasjon",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "Configurações Customizadas",
"ru_RU": "Индивидуальные параметры", "ru_RU": "Индивидуальные параметры",
"sv_SE": "Anpassad konfiguration", "sv_SE": "Anpassad konfiguration",
"th_TH": "", "th_TH": "",

View File

@ -2746,6 +2746,7 @@
01005D701264A000,"SpyHack",,playable,2021-04-15 10:53:51 01005D701264A000,"SpyHack",,playable,2021-04-15 10:53:51
010077B00E046000,"Spyro™ Reignited Trilogy",nvdec;UE4,playable,2022-09-11 18:38:33 010077B00E046000,"Spyro™ Reignited Trilogy",nvdec;UE4,playable,2022-09-11 18:38:33
0100085012A0E000,"Squeakers",,playable,2020-12-13 12:13:05 0100085012A0E000,"Squeakers",,playable,2020-12-13 12:13:05
0100E1D01EB2E000,"Squeakross: Home Squeak Home",,playable,2025-06-16 02:02:00
010009300D31C000,"Squidgies Takeover",,playable,2020-07-20 22:28:08 010009300D31C000,"Squidgies Takeover",,playable,2020-07-20 22:28:08
0100FCD0102EC000,"Squidlit",,playable,2020-08-06 12:38:32 0100FCD0102EC000,"Squidlit",,playable,2020-08-06 12:38:32
0100EBF00E702000,"STAR OCEAN First Departure R",nvdec,playable,2021-07-05 19:29:16 0100EBF00E702000,"STAR OCEAN First Departure R",nvdec,playable,2021-07-05 19:29:16

1 title_id game_name labels status last_updated
2746 01005D701264A000 SpyHack playable 2021-04-15 10:53:51
2747 010077B00E046000 Spyro™ Reignited Trilogy nvdec;UE4 playable 2022-09-11 18:38:33
2748 0100085012A0E000 Squeakers playable 2020-12-13 12:13:05
2749 0100E1D01EB2E000 Squeakross: Home Squeak Home playable 2025-06-16 02:02:00
2750 010009300D31C000 Squidgies Takeover playable 2020-07-20 22:28:08
2751 0100FCD0102EC000 Squidlit playable 2020-08-06 12:38:32
2752 0100EBF00E702000 STAR OCEAN First Departure R nvdec playable 2021-07-05 19:29:16

View File

@ -6,5 +6,18 @@
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" /> <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
<!-- Only needed when using pre-release versions of Ryujinx.LibHac. --> <!-- Only needed when using pre-release versions of Ryujinx.LibHac. -->
<!--<add key="LibHacAlpha" value="https://git.ryujinx.app/api/v4/projects/17/packages/nuget/index.json" />--> <!--<add key="LibHacAlpha" value="https://git.ryujinx.app/api/v4/projects/17/packages/nuget/index.json" />-->
<add key="Ryujinx.UpdateClient" value="https://git.ryujinx.app/api/v4/projects/71/packages/nuget/index.json" />
</packageSources> </packageSources>
<packageSourceMapping>
<!-- key value for <packageSource> should match key values from <packageSources> element -->
<packageSource key="nuget.org">
<package pattern="*" />
</packageSource>
<packageSource key="Ryujinx.UpdateClient">
<package pattern="Ryujinx.UpdateClient" />
</packageSource>
<!--<packageSource key="LibHacAlpha">
<package pattern="Ryujinx.LibHac" />
</packageSource>-->
</packageSourceMapping>
</configuration> </configuration>

View File

@ -195,6 +195,7 @@ namespace Ryujinx.Common
"01008d100d43e000", // Saints Row IV "01008d100d43e000", // Saints Row IV
"0100de600beee000", // Saints Row: The Third - The Full Package "0100de600beee000", // Saints Row: The Third - The Full Package
"01001180021fa000", // Shovel Knight: Specter of Torment "01001180021fa000", // Shovel Knight: Specter of Torment
"0100e1D01eb2e000", // Squeakross: Home Squeak Home
"0100e65002bb8000", // Stardew Valley "0100e65002bb8000", // Stardew Valley
"0100d7a01b7a2000", // Star Wars: Bounty Hunter "0100d7a01b7a2000", // Star Wars: Bounty Hunter
"0100800015926000", // Suika Game "0100800015926000", // Suika Game

View File

@ -377,7 +377,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
bool cursorVisible = false; bool cursorVisible = false;
if (state.CursorBegin != state.CursorEnd) if (state.CursorBegin != state.CursorEnd && state.CursorEnd <= state.InputText.Length)
{ {
Debug.Assert(state.InputText.Length > 0); Debug.Assert(state.InputText.Length > 0);

View File

@ -885,7 +885,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
// F_SETFL // F_SETFL
else if (cmd == 0x4) else if (cmd == 0x4)
{ {
socket.Blocking = (arg & 0x800) != 0; socket.Blocking = (arg & 0x800) == 0;
result = 0; result = 0;
} }
else else

View File

@ -25,7 +25,6 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Threading.Tasks; using System.Threading.Tasks;
using Silk.NET.Vulkan;
namespace Ryujinx.Ava namespace Ryujinx.Ava
{ {
@ -36,7 +35,7 @@ namespace Ryujinx.Ava
public static string Version { get; private set; } public static string Version { get; private set; }
public static string ConfigurationPath { get; private set; } public static string ConfigurationPath { get; private set; }
public static string GlobalConfigurationPath { get; private set; } public static string GlobalConfigurationPath { get; private set; }
public static bool UseExtraConfig{ get; private set; } public static bool UseExtraConfig { get; set; }
public static bool PreviewerDetached { get; private set; } public static bool PreviewerDetached { get; private set; }
public static bool UseHardwareAcceleration { get; private set; } public static bool UseHardwareAcceleration { get; private set; }
public static string BackendThreadingArg { get; private set; } public static string BackendThreadingArg { get; private set; }
@ -162,7 +161,7 @@ namespace Ryujinx.Ava
} }
public static string GetDirGameUserConfig(string gameId, bool rememberGlobalDir = false, bool changeFolderForGame = false) public static string GetDirGameUserConfig(string gameId, bool changeFolderForGame = false)
{ {
if (string.IsNullOrEmpty(gameId)) if (string.IsNullOrEmpty(gameId))
{ {
@ -180,12 +179,7 @@ namespace Ryujinx.Ava
return gameDir; return gameDir;
} }
public static void SetUseExtraConfig(bool value) public static void ReloadConfig()
{
UseExtraConfig = value;
}
public static void ReloadConfig(bool rememberGlobalDir = false)
{ {
string localConfigurationPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ReleaseInformation.ConfigName); string localConfigurationPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ReleaseInformation.ConfigName);

View File

@ -1152,6 +1152,24 @@ namespace Ryujinx.Ava.Systems
_dialogShown = true; _dialogShown = true;
// The hard-coded hotkey mapped to exit is Escape, but it's also the same key
// that causes the dialog we launch to close (without doing anything). In release
// mode, a race is observed that between ShowExitPrompt() appearing on KeyDown
// and the ContentDialog we create seeing the key state before KeyUp. Merely waiting
// for the key to no longer be pressed appears to be insufficient.
// NB: Using _keyboardInterface.IsPressed(Key.Escape) does not currently work.
if (OperatingSystem.IsWindows())
{
while (GetAsyncKeyState(0x1B) != 0)
{
await Task.Delay(100);
}
}
else
{
await Task.Delay(250);
}
shouldExit = await ContentDialogHelper.CreateStopEmulationDialog(); shouldExit = await ContentDialogHelper.CreateStopEmulationDialog();
_dialogShown = false; _dialogShown = false;

View File

@ -556,7 +556,7 @@ namespace Ryujinx.Ava.Systems.AppLibrary
data.Favorite = appMetadata.Favorite; data.Favorite = appMetadata.Favorite;
data.TimePlayed = appMetadata.TimePlayed; data.TimePlayed = appMetadata.TimePlayed;
data.LastPlayed = appMetadata.LastPlayed; data.LastPlayed = appMetadata.LastPlayed;
data.HasIndependentConfiguration = File.Exists(Program.GetDirGameUserConfig(data.IdBaseString, false, false)); // Just check user config data.HasIndependentConfiguration = File.Exists(Program.GetDirGameUserConfig(data.IdBaseString)); // Just check user config
} }
data.FileExtension = Path.GetExtension(applicationPath).TrimStart('.').ToUpper(); data.FileExtension = Path.GetExtension(applicationPath).TrimStart('.').ToUpper();

View File

@ -1,190 +0,0 @@
using Gommon;
using Ryujinx.Ava.Common.Locale;
using Ryujinx.Ava.Common.Models.Github;
using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Common;
using Ryujinx.Common.Helper;
using Ryujinx.Common.Logging;
using Ryujinx.Common.Utilities;
using System;
using System.Net.Http;
using System.Net.Http.Json;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
namespace Ryujinx.Ava.Systems
{
internal static partial class Updater
{
private static GitHubReleaseChannels.Channel? _currentGitHubReleaseChannel;
private static async Task<Optional<(Version Current, Version Incoming)>> CheckGitHubVersionAsync(bool showVersionUpToDate = false)
{
if (!Version.TryParse(Program.Version, out Version currentVersion))
{
Logger.Error?.Print(LogClass.Application, $"Failed to convert the current {RyujinxApp.FullAppName} version!");
await ContentDialogHelper.CreateWarningDialog(
LocaleManager.Instance[LocaleKeys.DialogUpdaterConvertFailedMessage],
LocaleManager.Instance[LocaleKeys.DialogUpdaterCancelUpdateMessage]);
_running = false;
return default;
}
Logger.Info?.Print(LogClass.Application, "Checking for updates from GitHub.");
// Get latest version number from GitHub API
try
{
using HttpClient jsonClient = ConstructHttpClient();
if (_currentGitHubReleaseChannel == null)
{
GitHubReleaseChannels releaseChannels = await GitHubReleaseChannels.GetAsync(jsonClient);
_currentGitHubReleaseChannel = ReleaseInformation.IsCanaryBuild
? releaseChannels.Canary
: releaseChannels.Stable;
Logger.Info?.Print(LogClass.Application, $"Loaded GitHub release channel for '{(ReleaseInformation.IsCanaryBuild ? "canary" : "stable")}'");
_changelogUrlFormat = _currentGitHubReleaseChannel.Value.UrlFormat;
}
string fetchedJson = await jsonClient.GetStringAsync(_currentGitHubReleaseChannel.Value.GetLatestReleaseApiUrl());
GithubReleasesJsonResponse fetched = JsonHelper.Deserialize(fetchedJson, _ghSerializerContext.GithubReleasesJsonResponse);
_buildVer = fetched.TagName;
foreach (GithubReleaseAssetJsonResponse asset in fetched.Assets)
{
if (asset.Name.StartsWith("ryujinx") && asset.Name.EndsWith(_platformExt))
{
_buildUrl = asset.BrowserDownloadUrl;
if (asset.State != "uploaded")
{
if (showVersionUpToDate)
{
UserResult userResult = await ContentDialogHelper.CreateUpdaterUpToDateInfoDialog(
LocaleManager.Instance[LocaleKeys.DialogUpdaterAlreadyOnLatestVersionMessage],
string.Empty);
if (userResult is UserResult.Ok)
{
OpenHelper.OpenUrl(_changelogUrlFormat.Format(currentVersion));
}
}
Logger.Info?.Print(LogClass.Application, "Up to date.");
_running = false;
return default;
}
break;
}
}
// If build not done, assume no new update is available.
if (_buildUrl is null)
{
if (showVersionUpToDate)
{
UserResult userResult = await ContentDialogHelper.CreateUpdaterUpToDateInfoDialog(
LocaleManager.Instance[LocaleKeys.DialogUpdaterAlreadyOnLatestVersionMessage],
string.Empty);
if (userResult is UserResult.Ok)
{
OpenHelper.OpenUrl(_changelogUrlFormat.Format(currentVersion));
}
}
Logger.Info?.Print(LogClass.Application, "Up to date.");
_running = false;
return default;
}
}
catch (Exception exception)
{
Logger.Error?.Print(LogClass.Application, exception.Message);
await ContentDialogHelper.CreateErrorDialog(
LocaleManager.Instance[LocaleKeys.DialogUpdaterFailedToGetVersionMessage]);
_running = false;
return default;
}
if (!Version.TryParse(_buildVer, out Version newVersion))
{
Logger.Error?.Print(LogClass.Application, $"Failed to convert the received {RyujinxApp.FullAppName} version from GitHub!");
await ContentDialogHelper.CreateWarningDialog(
LocaleManager.Instance[LocaleKeys.DialogUpdaterConvertFailedGithubMessage],
LocaleManager.Instance[LocaleKeys.DialogUpdaterCancelUpdateMessage]);
_running = false;
return default;
}
return (currentVersion, newVersion);
}
}
public readonly struct GitHubReleaseChannels
{
public static async Task<GitHubReleaseChannels> GetAsync(HttpClient httpClient)
{
ReleaseChannelPair releaseChannelPair = await httpClient.GetFromJsonAsync("https://ryujinx.app/api/release-channels", ReleaseChannelPairContext.Default.ReleaseChannelPair);
return new GitHubReleaseChannels(releaseChannelPair);
}
internal GitHubReleaseChannels(ReleaseChannelPair channelPair)
{
Stable = new Channel(channelPair.Stable);
Canary = new Channel(channelPair.Canary);
}
public readonly Channel Stable;
public readonly Channel Canary;
public readonly struct Channel
{
public Channel(string raw)
{
string[] parts = raw.Split('/');
Owner = parts[0];
Repo = parts[1];
}
public readonly string Owner;
public readonly string Repo;
public string UrlFormat => $"https://github.com/{ToString()}/releases/{{0}}";
public override string ToString() => $"{Owner}/{Repo}";
public string GetLatestReleaseApiUrl() =>
$"https://api.github.com/repos/{ToString()}/releases/latest";
}
}
[JsonSerializable(typeof(ReleaseChannelPair))]
partial class ReleaseChannelPairContext : JsonSerializerContext;
class ReleaseChannelPair
{
[JsonPropertyName("stable")]
public string Stable { get; set; }
[JsonPropertyName("canary")]
public string Canary { get; set; }
}
}

View File

@ -41,7 +41,7 @@ namespace Ryujinx.Ava.Systems
return $"https://update.ryujinx.app/latest/query?os={os}&arch={arch}&rc={rc}"; return $"https://update.ryujinx.app/latest/query?os={os}&arch={arch}&rc={rc}";
} }
private static async Task<Optional<(Version Current, Version Incoming)>> CheckGitLabVersionAsync(bool showVersionUpToDate = false) public static async Task<Optional<(Version Current, Version Incoming)>> CheckVersionAsync(bool showVersionUpToDate = false)
{ {
if (!Version.TryParse(Program.Version, out Version currentVersion)) if (!Version.TryParse(Program.Version, out Version currentVersion))
{ {
@ -68,12 +68,9 @@ namespace Ryujinx.Ava.Systems
Logger.Info?.Print(LogClass.Application, $"Checking for updates from {updateUrl}."); Logger.Info?.Print(LogClass.Application, $"Checking for updates from {updateUrl}.");
// Get latest version number from GitLab API // Get latest version number from update.ryujinx.app API
using HttpClient jsonClient = ConstructHttpClient(); using HttpClient jsonClient = ConstructHttpClient();
// GitLab instance is located in Ukraine. Connection times will vary across the world.
jsonClient.Timeout = TimeSpan.FromSeconds(10);
try try
{ {
UpdaterResponse response = UpdaterResponse response =
@ -85,9 +82,10 @@ namespace Ryujinx.Ava.Systems
} }
catch (Exception e) catch (Exception e)
{ {
throw new AggregateException( Logger.Error?.Print(LogClass.Application, $"An error occurred when parsing JSON response from API ({e.GetType().AsFullNamePrettyString()}): {e.Message}");
$"An error occurred when parsing JSON response from API ({e.GetType().AsFullNamePrettyString()}): {e.Message}",
e); _running = false;
return default;
} }
// If build URL not found, assume no new update is available. // If build URL not found, assume no new update is available.
@ -116,10 +114,10 @@ namespace Ryujinx.Ava.Systems
if (!Version.TryParse(_buildVer, out Version newVersion)) if (!Version.TryParse(_buildVer, out Version newVersion))
{ {
Logger.Error?.Print(LogClass.Application, Logger.Error?.Print(LogClass.Application,
$"Failed to convert the received {RyujinxApp.FullAppName} version from GitLab!"); $"Failed to convert the received {RyujinxApp.FullAppName} version from the update server!");
await ContentDialogHelper.CreateWarningDialog( await ContentDialogHelper.CreateWarningDialog(
LocaleManager.Instance[LocaleKeys.DialogUpdaterConvertFailedGithubMessage], LocaleManager.Instance[LocaleKeys.DialogUpdaterConvertFailedServerMessage],
LocaleManager.Instance[LocaleKeys.DialogUpdaterCancelUpdateMessage]); LocaleManager.Instance[LocaleKeys.DialogUpdaterCancelUpdateMessage]);
_running = false; _running = false;

View File

@ -31,9 +31,6 @@ namespace Ryujinx.Ava.Systems
{ {
internal static partial class Updater internal static partial class Updater
{ {
private static readonly GithubReleasesJsonSerializerContext _ghSerializerContext = new(JsonHelper.GetDefaultSerializerOptions());
private static readonly string _platformExt = BuildPlatformExtension();
private static readonly string _homeDir = AppDomain.CurrentDomain.BaseDirectory; private static readonly string _homeDir = AppDomain.CurrentDomain.BaseDirectory;
private static readonly string _updateDir = Path.Combine(Path.GetTempPath(), "Ryujinx", "update"); private static readonly string _updateDir = Path.Combine(Path.GetTempPath(), "Ryujinx", "update");
private static readonly string _updatePublishDir = Path.Combine(_updateDir, "publish"); private static readonly string _updatePublishDir = Path.Combine(_updateDir, "publish");
@ -48,25 +45,6 @@ namespace Ryujinx.Ava.Systems
private static readonly string[] _windowsDependencyDirs = []; private static readonly string[] _windowsDependencyDirs = [];
private static string _changelogUrlFormat = null; private static string _changelogUrlFormat = null;
public static async Task<Optional<(Version, Version)>> CheckVersionAsync(bool showVersionUpToDate = false)
{
Optional<(Version, Version)> versionTuple;
try
{
versionTuple = await CheckGitLabVersionAsync(showVersionUpToDate);
}
catch (Exception e)
{
Logger.Error?.PrintMsg(LogClass.Application, "Update checking from GitLab failed; falling back to GitHub.");
Logger.Error?.PrintMsg(LogClass.Application, e.Message);
versionTuple = await CheckGitHubVersionAsync(showVersionUpToDate);
}
return versionTuple;
}
public static async Task BeginUpdateAsync(bool showVersionUpToDate = false) public static async Task BeginUpdateAsync(bool showVersionUpToDate = false)
{ {

View File

@ -2,29 +2,104 @@ using Avalonia.Media;
using Ryujinx.Ava.UI.Windows; using Ryujinx.Ava.UI.Windows;
using Ryujinx.HLE.UI; using Ryujinx.HLE.UI;
using System; using System;
using System.Globalization;
namespace Ryujinx.Ava.UI.Applet namespace Ryujinx.Ava.UI.Applet
{ {
class AvaloniaHostUITheme(MainWindow parent) : IHostUITheme class AvaloniaHostUITheme : IHostUITheme
{ {
public string FontFamily { get; } = OperatingSystem.IsWindows() && OperatingSystem.IsWindowsVersionAtLeast(10, 0, 22000) ? "Segoe UI Variable" : parent.FontFamily.Name; private readonly MainWindow _parent;
public ThemeColor DefaultBackgroundColor { get; } = BrushToThemeColor(parent.Background); public string FontFamily { get; }
public ThemeColor DefaultForegroundColor { get; } = BrushToThemeColor(parent.Foreground); public ThemeColor DefaultBackgroundColor { get; }
public ThemeColor DefaultBorderColor { get; } = BrushToThemeColor(parent.BorderBrush); public ThemeColor DefaultForegroundColor { get; }
public ThemeColor SelectionBackgroundColor { get; } = BrushToThemeColor(parent.ViewControls.SearchBox.SelectionBrush); public ThemeColor DefaultBorderColor { get; }
public ThemeColor SelectionForegroundColor { get; } = BrushToThemeColor(parent.ViewControls.SearchBox.SelectionForegroundBrush); public ThemeColor SelectionBackgroundColor { get; }
public ThemeColor SelectionForegroundColor { get; }
public AvaloniaHostUITheme(MainWindow parent)
{
_parent = parent;
// Initialize font property
FontFamily = GetSystemFontFamily();
// Initialize all properties that depend on parent
DefaultBackgroundColor = BrushToThemeColor(parent.Background);
DefaultForegroundColor = BrushToThemeColor(parent.Foreground);
DefaultBorderColor = BrushToThemeColor(parent.BorderBrush);
SelectionBackgroundColor = BrushToThemeColor(parent.ViewControls.SearchBox.SelectionBrush);
SelectionForegroundColor = BrushToThemeColor(parent.ViewControls.SearchBox.SelectionForegroundBrush);
}
private string GetSystemFontFamily()
{
if (OperatingSystem.IsWindows())
{
return GetWindowsFontByLanguage();
}
else if (OperatingSystem.IsMacOS())
{
return GetMacOSFontByLanguage();
}
else // Linux and other platforms
{
return GetLinuxFontByLanguage();
}
}
private string GetWindowsFontByLanguage()
{
var culture = CultureInfo.CurrentUICulture;
string langCode = culture.Name;
return culture.TwoLetterISOLanguageName switch
{
"zh" => langCode == "zh-CN" || langCode == "zh-Hans" || langCode == "zh-SG"
? "Microsoft YaHei UI" // Simplified Chinese
: "Microsoft JhengHei UI", // Traditional Chinese
"ja" => "Yu Gothic UI", // Japanese
"ko" => "Malgun Gothic", // Korean
_ => OperatingSystem.IsWindowsVersionAtLeast(10, 0, 22000)
? "Segoe UI Variable" // Other languages - Windows 11+
: _parent.FontFamily.Name // Fallback to parent window font
};
}
private string GetMacOSFontByLanguage()
{
return CultureInfo.CurrentUICulture.TwoLetterISOLanguageName switch
{
"zh" => "PingFang SC", // Chinese (both simplified and traditional)
"ja" => "Hiragino Sans", // Japanese
"ko" => "Apple SD Gothic Neo", // Korean
_ => _parent.FontFamily.Name // Fallback to parent window font
};
}
private string GetLinuxFontByLanguage()
{
return CultureInfo.CurrentUICulture.TwoLetterISOLanguageName switch
{
"zh" => "Noto Sans CJK SC", // Chinese
"ja" => "Noto Sans CJK JP", // Japanese
"ko" => "Noto Sans CJK KR", // Korean
_ => _parent.FontFamily.Name // Fallback to parent window font
};
}
private static ThemeColor BrushToThemeColor(IBrush brush) private static ThemeColor BrushToThemeColor(IBrush brush)
{ {
if (brush is SolidColorBrush solidColor) if (brush is SolidColorBrush solidColor)
{ {
return new ThemeColor((float)solidColor.Color.A / 255, return new ThemeColor(
(float)solidColor.Color.A / 255,
(float)solidColor.Color.R / 255, (float)solidColor.Color.R / 255,
(float)solidColor.Color.G / 255, (float)solidColor.Color.G / 255,
(float)solidColor.Color.B / 255); (float)solidColor.Color.B / 255
);
} }
return new ThemeColor(); return new ThemeColor();
} }
} }

View File

@ -110,5 +110,8 @@ namespace Ryujinx.Ava.UI.Helpers
[LibraryImport("user32.dll", SetLastError = true)] [LibraryImport("user32.dll", SetLastError = true)]
public static partial nint SetWindowLongPtrW(nint hWnd, int nIndex, nint value); public static partial nint SetWindowLongPtrW(nint hWnd, int nIndex, nint value);
[LibraryImport("user32.dll", SetLastError = true)]
public static partial ushort GetAsyncKeyState(int nVirtKey);
} }
} }

View File

@ -50,6 +50,9 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
private string _controllerImage; private string _controllerImage;
private int _device; private int _device;
private object _configViewModel; private object _configViewModel;
private bool _isChangeTrackingActive;
private string _chosenProfile;
[ObservableProperty] private bool _isModified;
[ObservableProperty] private string _profileName; [ObservableProperty] private string _profileName;
[ObservableProperty] private bool _notificationIsVisible; // Automatically call the NotificationView property with OnPropertyChanged() [ObservableProperty] private bool _notificationIsVisible; // Automatically call the NotificationView property with OnPropertyChanged()
[ObservableProperty] private string _notificationText; // Automatically call the NotificationText property with OnPropertyChanged() [ObservableProperty] private string _notificationText; // Automatically call the NotificationText property with OnPropertyChanged()
@ -84,9 +87,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
public AvaloniaList<string> ProfilesList { get; set; } public AvaloniaList<string> ProfilesList { get; set; }
public AvaloniaList<string> DeviceList { get; set; } public AvaloniaList<string> DeviceList { get; set; }
public bool _useExtraConfig; public bool UseGlobalConfig;
public bool _useGlobalInput;
// XAML Flags // XAML Flags
public bool ShowSettings => _device > 0; public bool ShowSettings => _device > 0;
@ -98,31 +99,16 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
public bool HasLed => SelectedGamepad.Features.HasFlag(GamepadFeaturesFlag.Led); public bool HasLed => SelectedGamepad.Features.HasFlag(GamepadFeaturesFlag.Led);
public bool CanClearLed => SelectedGamepad.Name.ContainsIgnoreCase("DualSense"); public bool CanClearLed => SelectedGamepad.Name.ContainsIgnoreCase("DualSense");
public bool _isChangeTrackingActive;
public bool _isModified;
public bool IsModified
{
get => _isModified;
set
{
_isModified = value;
OnPropertyChanged();
}
}
public event Action NotifyChangesEvent; public event Action NotifyChangesEvent;
public string _profileChoose; public string ChosenProfile
public string ProfileChoose
{ {
get => _profileChoose; get => _chosenProfile;
set set
{ {
// When you select a profile, the settings from the profile will be applied. // When you select a profile, the settings from the profile will be applied.
// To save the settings, you still need to click the apply button // To save the settings, you still need to click the apply button
_profileChoose = value; _chosenProfile = value;
LoadProfile(); LoadProfile();
OnPropertyChanged(); OnPropertyChanged();
} }
@ -294,14 +280,12 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
public InputConfig Config { get; set; } public InputConfig Config { get; set; }
public InputViewModel(UserControl owner, bool UseGlobalInput = false) : this() public InputViewModel(UserControl owner, bool useGlobal = false) : this()
{ {
if (Program.PreviewerDetached) if (Program.PreviewerDetached)
{ {
_mainWindow = RyujinxApp.MainWindow; _mainWindow = RyujinxApp.MainWindow;
_useExtraConfig = Program.UseExtraConfig;
AvaloniaKeyboardDriver = new AvaloniaKeyboardDriver(owner); AvaloniaKeyboardDriver = new AvaloniaKeyboardDriver(owner);
_mainWindow.InputManager.GamepadDriver.OnGamepadConnected += HandleOnGamepadConnected; _mainWindow.InputManager.GamepadDriver.OnGamepadConnected += HandleOnGamepadConnected;
@ -309,7 +293,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
_mainWindow.ViewModel.AppHost?.NpadManager.BlockInputUpdates(); _mainWindow.ViewModel.AppHost?.NpadManager.BlockInputUpdates();
_useGlobalInput = UseGlobalInput; UseGlobalConfig = useGlobal;
_isLoaded = false; _isLoaded = false;
@ -347,7 +331,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
private void LoadConfiguration(InputConfig inputConfig = null) private void LoadConfiguration(InputConfig inputConfig = null)
{ {
if (_useGlobalInput && _useExtraConfig) if (UseGlobalConfig && Program.UseExtraConfig)
{ {
Config = inputConfig ?? ConfigurationState.InstanceExtra.Hid.InputConfig.Value.FirstOrDefault(inputConfig => inputConfig.PlayerIndex == _playerId); Config = inputConfig ?? ConfigurationState.InstanceExtra.Hid.InputConfig.Value.FirstOrDefault(inputConfig => inputConfig.PlayerIndex == _playerId);
} }
@ -919,7 +903,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
LoadProfiles(); LoadProfiles();
ProfileChoose = ProfileName; // Show new profile ChosenProfile = ProfileName; // Show new profile
} }
else else
{ {
@ -953,7 +937,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
LoadProfiles(); LoadProfiles();
ProfileChoose = ProfilesList[0].ToString(); // Show default profile ChosenProfile = ProfilesList[0].ToString(); // Show default profile
} }
} }
@ -983,7 +967,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
List<InputConfig> newConfig = []; List<InputConfig> newConfig = [];
if (_useGlobalInput && _useExtraConfig) if (UseGlobalConfig && Program.UseExtraConfig)
{ {
newConfig.AddRange(ConfigurationState.InstanceExtra.Hid.InputConfig.Value); newConfig.AddRange(ConfigurationState.InstanceExtra.Hid.InputConfig.Value);
} }
@ -1035,7 +1019,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
// NOTE: Do not modify InputConfig.Value directly as other code depends on the on-change event. // NOTE: Do not modify InputConfig.Value directly as other code depends on the on-change event.
_mainWindow.ViewModel.AppHost?.NpadManager.ReloadConfiguration(newConfig, ConfigurationState.Instance.Hid.EnableKeyboard, ConfigurationState.Instance.Hid.EnableMouse); _mainWindow.ViewModel.AppHost?.NpadManager.ReloadConfiguration(newConfig, ConfigurationState.Instance.Hid.EnableKeyboard, ConfigurationState.Instance.Hid.EnableMouse);
if (_useGlobalInput && _useExtraConfig) if (UseGlobalConfig && Program.UseExtraConfig)
{ {
// In User Settings when "Use Global Input" is enabled, it saves global input to global setting // In User Settings when "Use Global Input" is enabled, it saves global input to global setting
ConfigurationState.InstanceExtra.Hid.InputConfig.Value = newConfig; ConfigurationState.InstanceExtra.Hid.InputConfig.Value = newConfig;
@ -1046,12 +1030,6 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
ConfigurationState.Instance.Hid.InputConfig.Value = newConfig; ConfigurationState.Instance.Hid.InputConfig.Value = newConfig;
ConfigurationState.Instance.ToFileFormat().SaveConfig(Program.ConfigurationPath); ConfigurationState.Instance.ToFileFormat().SaveConfig(Program.ConfigurationPath);
} }
}
public void NotifyChange(string property)
{
OnPropertyChanged(property);
} }
public void NotifyChanges() public void NotifyChanges()

View File

@ -1575,16 +1575,14 @@ namespace Ryujinx.Ava.UI.ViewModels
public bool InitializeUserConfig(ApplicationData application) public bool InitializeUserConfig(ApplicationData application)
{ {
// Code where conditions will be met before loading the user configuration (Global Config) // Code where conditions will be met before loading the user configuration (Global Config)
string BackendThreadingInit = Program.BackendThreadingArg; string backendThreadingInit = Program.BackendThreadingArg ?? ConfigurationState.Instance.Graphics.BackendThreading.Value.ToString();
BackendThreadingInit ??= ConfigurationState.Instance.Graphics.BackendThreading.Value.ToString();
// If a configuration is found in the "/games/xxxxxxxxxxxxxx" folder, the program will load the user setting. // If a configuration is found in the "/games/xxxxxxxxxxxxxx" folder, the program will load the user setting.
string idGame = application.IdBaseString; string idGame = application.IdBaseString;
if (ConfigurationFileFormat.TryLoad(Program.GetDirGameUserConfig(idGame), out ConfigurationFileFormat configurationFileFormat)) if (ConfigurationFileFormat.TryLoad(Program.GetDirGameUserConfig(idGame), out ConfigurationFileFormat configurationFileFormat))
{ {
// Loads the user configuration, having previously changed the global configuration to the user configuration // Loads the user configuration, having previously changed the global configuration to the user configuration
ConfigurationState.Instance.Load(configurationFileFormat, Program.GetDirGameUserConfig(idGame, true, true), idGame); ConfigurationState.Instance.Load(configurationFileFormat, Program.GetDirGameUserConfig(idGame, true), idGame);
if (ConfigurationFileFormat.TryLoad(Program.GlobalConfigurationPath, out ConfigurationFileFormat configurationFileFormatExtra)) if (ConfigurationFileFormat.TryLoad(Program.GlobalConfigurationPath, out ConfigurationFileFormat configurationFileFormatExtra))
{ {
@ -1595,15 +1593,13 @@ namespace Ryujinx.Ava.UI.ViewModels
} }
// Code where conditions will be executed after loading user configuration // Code where conditions will be executed after loading user configuration
if (ConfigurationState.Instance.Graphics.BackendThreading.Value.ToString() != BackendThreadingInit) if (ConfigurationState.Instance.Graphics.BackendThreading.Value.ToString() != backendThreadingInit)
{ {
Rebooter.RebootAppWithGame(application.Path,
List<string> Arguments = new() [
{ "--bt",
"--bt", ConfigurationState.Instance.Graphics.BackendThreading.Value.ToString() // BackendThreading ConfigurationState.Instance.Graphics.BackendThreading.Value.ToString()
}; ]);
Rebooter.RebootAppWithGame(application.Path, Arguments);
return true; return true;
} }
@ -1998,7 +1994,7 @@ namespace Ryujinx.Ava.UI.ViewModels
// just checking for file presence // just checking for file presence
viewModel.SelectedApplication.HasIndependentConfiguration = File.Exists( viewModel.SelectedApplication.HasIndependentConfiguration = File.Exists(
Program.GetDirGameUserConfig(viewModel.SelectedApplication.IdString, false, false)); Program.GetDirGameUserConfig(viewModel.SelectedApplication.IdString));
viewModel.RefreshView(); viewModel.RefreshView();
}); });

View File

@ -147,19 +147,19 @@ namespace Ryujinx.Ava.UI.ViewModels
public bool DisableInputWhenOutOfFocus { get; set; } public bool DisableInputWhenOutOfFocus { get; set; }
public int FocusLostActionType { get; set; } public int FocusLostActionType { get; set; }
public bool EnableConfigGlobal public bool UseGlobalInputConfig
{ {
get => _useInputGlobalConfig; get => _useInputGlobalConfig;
set set
{ {
_useInputGlobalConfig = value; _useInputGlobalConfig = value;
LocalGlobalInputSwitchEvent?.Invoke(_useInputGlobalConfig); LocalGlobalInputSwitchEvent?.Invoke(_useInputGlobalConfig);
OnPropertyChanged(nameof(PanelOpacityInput)); OnPropertyChanged(nameof(InputPanelOpacity));
OnPropertyChanged(); OnPropertyChanged();
} }
} }
public double PanelOpacityInput => EnableConfigGlobal ? 0.5 : 1; public double InputPanelOpacity => UseGlobalInputConfig ? 0.5 : 1;
public VSyncMode VSyncMode public VSyncMode VSyncMode
{ {
@ -387,7 +387,7 @@ namespace Ryujinx.Ava.UI.ViewModels
public bool IsInvalidLdnPassphraseVisible { get; set; } public bool IsInvalidLdnPassphraseVisible { get; set; }
public SettingsViewModel(VirtualFileSystem virtualFileSystem, ContentManager contentManager) : this(false) public SettingsViewModel(VirtualFileSystem virtualFileSystem, ContentManager contentManager) : this()
{ {
_virtualFileSystem = virtualFileSystem; _virtualFileSystem = virtualFileSystem;
_contentManager = contentManager; _contentManager = contentManager;
@ -408,7 +408,7 @@ namespace Ryujinx.Ava.UI.ViewModels
string gameName, string gameName,
string gameId, string gameId,
byte[] gameIconData, byte[] gameIconData,
bool enableToLoadCustomConfig) : this(enableToLoadCustomConfig) bool customConfig) : this()
{ {
_virtualFileSystem = virtualFileSystem; _virtualFileSystem = virtualFileSystem;
_contentManager = contentManager; _contentManager = contentManager;
@ -424,11 +424,11 @@ namespace Ryujinx.Ava.UI.ViewModels
_gameTitle = gameName; _gameTitle = gameName;
_gameId = gameId; _gameId = gameId;
if (enableToLoadCustomConfig) // During the game. If there is no user config, then load the global config window if (customConfig) // During the game. If there is no user config, then load the global config window
{ {
string gameDir = Program.GetDirGameUserConfig(gameId, true, true); string gameDir = Program.GetDirGameUserConfig(gameId, true);
Program.SetUseExtraConfig(true); Program.UseExtraConfig = true;
if (ConfigurationFileFormat.TryLoad(Program.GlobalConfigurationPath, out ConfigurationFileFormat configurationFileFormatExtra)) if (ConfigurationFileFormat.TryLoad(Program.GlobalConfigurationPath, out ConfigurationFileFormat configurationFileFormatExtra))
{ {
@ -451,7 +451,7 @@ namespace Ryujinx.Ava.UI.ViewModels
} }
} }
public SettingsViewModel(bool noLoadGlobalConfig = false) public SettingsViewModel()
{ {
GameDirectories = []; GameDirectories = [];
AutoloadDirectories = []; AutoloadDirectories = [];
@ -603,7 +603,7 @@ namespace Ryujinx.Ava.UI.ViewModels
}; };
// Input // Input
EnableConfigGlobal = config.System.UseInputGlobalConfig; UseGlobalInputConfig = config.System.UseInputGlobalConfig;
EnableDockedMode = config.System.EnableDockedMode; EnableDockedMode = config.System.EnableDockedMode;
EnableKeyboard = config.Hid.EnableKeyboard; EnableKeyboard = config.Hid.EnableKeyboard;
EnableMouse = config.Hid.EnableMouse; EnableMouse = config.Hid.EnableMouse;
@ -710,7 +710,7 @@ namespace Ryujinx.Ava.UI.ViewModels
}; };
// Input // Input
config.System.UseInputGlobalConfig.Value = EnableConfigGlobal; config.System.UseInputGlobalConfig.Value = UseGlobalInputConfig;
config.System.EnableDockedMode.Value = EnableDockedMode; config.System.EnableDockedMode.Value = EnableDockedMode;
config.Hid.EnableKeyboard.Value = EnableKeyboard; config.Hid.EnableKeyboard.Value = EnableKeyboard;
config.Hid.EnableMouse.Value = EnableMouse; config.Hid.EnableMouse.Value = EnableMouse;
@ -840,7 +840,7 @@ namespace Ryujinx.Ava.UI.ViewModels
public void DeleteConfigGame() public void DeleteConfigGame()
{ {
string gameDir = Program.GetDirGameUserConfig(GameId, false, false); string gameDir = Program.GetDirGameUserConfig(GameId);
if (File.Exists(gameDir)) if (File.Exists(gameDir))
{ {

View File

@ -100,7 +100,7 @@
Name="ProfileBox" Name="ProfileBox"
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"
VerticalAlignment="Center" VerticalAlignment="Center"
SelectedItem="{Binding ProfileChoose, Mode=TwoWay}" SelectedItem="{Binding ChosenProfile, Mode=TwoWay}"
SelectionChanged="ComboBox_SelectionChanged" SelectionChanged="ComboBox_SelectionChanged"
ItemsSource="{Binding ProfilesList}" ItemsSource="{Binding ProfilesList}"
Text="{Binding ProfileName, Mode=TwoWay}" /> Text="{Binding ProfileName, Mode=TwoWay}" />
@ -203,7 +203,6 @@
</StackPanel> </StackPanel>
<ContentControl IsVisible="{Binding NotificationIsVisible}"> <ContentControl IsVisible="{Binding NotificationIsVisible}">
<ContentControl.Content> <ContentControl.Content>
<StackPanel> <StackPanel>
<TextBlock <TextBlock
Margin="5,20,0,0" Margin="5,20,0,0"

View File

@ -15,7 +15,7 @@ namespace Ryujinx.Ava.UI.Views.Input
public InputView() public InputView()
{ {
ViewModel = new InputViewModel(this, ConfigurationState.Instance.System.UseInputGlobalConfig.Value); ViewModel = new InputViewModel(this, ConfigurationState.Instance.System.UseInputGlobalConfig);
InitializeComponent(); InitializeComponent();
} }
@ -27,9 +27,8 @@ namespace Ryujinx.Ava.UI.Views.Input
public void ToggleLocalGlobalInput(bool enableConfigGlobal) public void ToggleLocalGlobalInput(bool enableConfigGlobal)
{ {
Dispose(); Dispose();
ViewModel = new InputViewModel(this, enableConfigGlobal); // Create new Input Page with other input configs ViewModel = new InputViewModel(this, enableConfigGlobal); // Create new Input Page with global input configs
InitializeComponent(); InitializeComponent();
} }

View File

@ -44,7 +44,7 @@
<CheckBox <CheckBox
ToolTip.Tip="{ext:Locale UseGlobalInputTooltip}" ToolTip.Tip="{ext:Locale UseGlobalInputTooltip}"
MinWidth="0" MinWidth="0"
IsChecked="{Binding EnableConfigGlobal}"> IsChecked="{Binding UseGlobalInputConfig}">
<TextBlock <TextBlock
Text="{ext:Locale SettingsTabInputUseGlobalInput}" /> Text="{ext:Locale SettingsTabInputUseGlobalInput}" />
</CheckBox> </CheckBox>

View File

@ -46,7 +46,7 @@ namespace Ryujinx.Ava.UI.Windows
private void Load() private void Load()
{ {
Pages.Children.Clear(); Pages.Children.Clear();
NavPanel.SelectionChanged += NavPanelOnSelectionChanged; NavPanel.SelectionChanged += NavPanelOnSelectionChanged;
NavPanel.SelectedItem = NavPanel.MenuItems.ElementAt(0); NavPanel.SelectedItem = NavPanel.MenuItems.ElementAt(0);
} }
@ -97,7 +97,7 @@ namespace Ryujinx.Ava.UI.Windows
protected override void OnClosing(WindowClosingEventArgs e) protected override void OnClosing(WindowClosingEventArgs e)
{ {
Program.SetUseExtraConfig(false); Program.UseExtraConfig = false;
InputPage.Dispose(); // You need to unload the gamepad settings, otherwise the controls will be blocked InputPage.Dispose(); // You need to unload the gamepad settings, otherwise the controls will be blocked
base.OnClosing(e); base.OnClosing(e);
} }