mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2025-07-31 01:59:59 -06:00
Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
4d311dfc1a | |||
5b6e3521d8 | |||
e1dda4cef1 | |||
169126e511 | |||
4c237c4793 |
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@ -6,7 +6,7 @@ on:
|
|||||||
env:
|
env:
|
||||||
POWERSHELL_TELEMETRY_OPTOUT: 1
|
POWERSHELL_TELEMETRY_OPTOUT: 1
|
||||||
DOTNET_CLI_TELEMETRY_OPTOUT: 1
|
DOTNET_CLI_TELEMETRY_OPTOUT: 1
|
||||||
RYUJINX_BASE_VERSION: "1.1.0"
|
RYUJINX_BASE_VERSION: "1.2.0"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
6
.github/workflows/nightly_pr_comment.yml
vendored
6
.github/workflows/nightly_pr_comment.yml
vendored
@ -9,7 +9,6 @@ jobs:
|
|||||||
pr_comment:
|
pr_comment:
|
||||||
if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success'
|
if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: ${{ fromJSON(vars.JOB_TIMEOUT) }}
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/github-script@v6
|
- uses: actions/github-script@v6
|
||||||
with:
|
with:
|
||||||
@ -39,24 +38,19 @@ jobs:
|
|||||||
return core.error(`No artifacts found`);
|
return core.error(`No artifacts found`);
|
||||||
}
|
}
|
||||||
let body = `Download the artifacts for this pull request:\n`;
|
let body = `Download the artifacts for this pull request:\n`;
|
||||||
let hidden_gtk_artifacts = `\n\n <details><summary>Old GUI (GTK3)</summary>\n`;
|
|
||||||
let hidden_headless_artifacts = `\n\n <details><summary>GUI-less (SDL2)</summary>\n`;
|
let hidden_headless_artifacts = `\n\n <details><summary>GUI-less (SDL2)</summary>\n`;
|
||||||
let hidden_debug_artifacts = `\n\n <details><summary>Only for Developers</summary>\n`;
|
let hidden_debug_artifacts = `\n\n <details><summary>Only for Developers</summary>\n`;
|
||||||
for (const art of artifacts) {
|
for (const art of artifacts) {
|
||||||
if(art.name.includes('Debug')) {
|
if(art.name.includes('Debug')) {
|
||||||
hidden_debug_artifacts += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`;
|
hidden_debug_artifacts += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`;
|
||||||
} else if(art.name.includes('gtk-ryujinx')) {
|
|
||||||
hidden_gtk_artifacts += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`;
|
|
||||||
} else if(art.name.includes('sdl2-ryujinx-headless')) {
|
} else if(art.name.includes('sdl2-ryujinx-headless')) {
|
||||||
hidden_headless_artifacts += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`;
|
hidden_headless_artifacts += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`;
|
||||||
} else {
|
} else {
|
||||||
body += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`;
|
body += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
hidden_gtk_artifacts += `\n</details>`;
|
|
||||||
hidden_headless_artifacts += `\n</details>`;
|
hidden_headless_artifacts += `\n</details>`;
|
||||||
hidden_debug_artifacts += `\n</details>`;
|
hidden_debug_artifacts += `\n</details>`;
|
||||||
body += hidden_gtk_artifacts;
|
|
||||||
body += hidden_headless_artifacts;
|
body += hidden_headless_artifacts;
|
||||||
body += hidden_debug_artifacts;
|
body += hidden_debug_artifacts;
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ namespace Ryujinx.Common.Logging
|
|||||||
public readonly struct Log
|
public readonly struct Log
|
||||||
{
|
{
|
||||||
private static readonly string _homeDir = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
|
private static readonly string _homeDir = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
|
||||||
private static readonly string _homeDirRedacted = Path.Combine(Directory.GetParent(_homeDir).FullName, "[redacted]");
|
private static readonly string _homeDirRedacted = Path.Combine(Directory.GetParent(_homeDir)!.FullName, "[redacted]");
|
||||||
|
|
||||||
internal readonly LogLevel Level;
|
internal readonly LogLevel Level;
|
||||||
|
|
||||||
@ -233,7 +233,7 @@ namespace Ryujinx.Common.Logging
|
|||||||
case LogLevel.AccessLog : AccessLog = enabled ? new Log(LogLevel.AccessLog) : new Log?(); break;
|
case LogLevel.AccessLog : AccessLog = enabled ? new Log(LogLevel.AccessLog) : new Log?(); break;
|
||||||
case LogLevel.Stub : Stub = enabled ? new Log(LogLevel.Stub) : new Log?(); break;
|
case LogLevel.Stub : Stub = enabled ? new Log(LogLevel.Stub) : new Log?(); break;
|
||||||
case LogLevel.Trace : Trace = enabled ? new Log(LogLevel.Trace) : new Log?(); break;
|
case LogLevel.Trace : Trace = enabled ? new Log(LogLevel.Trace) : new Log?(); break;
|
||||||
default: throw new ArgumentException("Unknown Log Level");
|
default: throw new ArgumentException("Unknown Log Level", nameof(logLevel));
|
||||||
#pragma warning restore IDE0055
|
#pragma warning restore IDE0055
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,19 +3,11 @@ using System.Threading;
|
|||||||
|
|
||||||
namespace Ryujinx.Common
|
namespace Ryujinx.Common
|
||||||
{
|
{
|
||||||
public class ObjectPool<T>
|
public class ObjectPool<T>(Func<T> factory, int size)
|
||||||
where T : class
|
where T : class
|
||||||
{
|
{
|
||||||
private T _firstItem;
|
private T _firstItem;
|
||||||
private readonly T[] _items;
|
private readonly T[] _items = new T[size - 1];
|
||||||
|
|
||||||
private readonly Func<T> _factory;
|
|
||||||
|
|
||||||
public ObjectPool(Func<T> factory, int size)
|
|
||||||
{
|
|
||||||
_items = new T[size - 1];
|
|
||||||
_factory = factory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public T Allocate()
|
public T Allocate()
|
||||||
{
|
{
|
||||||
@ -43,7 +35,7 @@ namespace Ryujinx.Common
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return _factory();
|
return factory();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Release(T obj)
|
public void Release(T obj)
|
||||||
|
@ -47,15 +47,9 @@ namespace Ryujinx.Common
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ReactiveEventArgs<T>
|
public class ReactiveEventArgs<T>(T oldValue, T newValue)
|
||||||
{
|
{
|
||||||
public T OldValue { get; }
|
public T OldValue { get; } = oldValue;
|
||||||
public T NewValue { get; }
|
public T NewValue { get; } = newValue;
|
||||||
|
|
||||||
public ReactiveEventArgs(T oldValue, T newValue)
|
|
||||||
{
|
|
||||||
OldValue = oldValue;
|
|
||||||
NewValue = newValue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -158,10 +158,7 @@ namespace Ryujinx.HLE.HOS.Applets.Error
|
|||||||
|
|
||||||
if (message == "")
|
if (message == "")
|
||||||
{
|
{
|
||||||
message = "An error has occured.\n\n"
|
message = "An error has occured.\n\nPlease try again later.";
|
||||||
+ "Please try again later.\n\n"
|
|
||||||
+ "If the problem persists, please refer to the Ryujinx website.\n"
|
|
||||||
+ "www.ryujinx.org";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
string[] buttons = GetButtonsText(module, description, "DlgBtn");
|
string[] buttons = GetButtonsText(module, description, "DlgBtn");
|
||||||
|
@ -659,7 +659,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.Applicati
|
|||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(filePath))
|
if (string.IsNullOrWhiteSpace(filePath))
|
||||||
{
|
{
|
||||||
throw new InvalidSystemResourceException("JIT (010000000000003B) system title not found! The JIT will not work, provide the system archive to fix this error. (See https://github.com/Ryujinx/Ryujinx#requirements for more information)");
|
throw new InvalidSystemResourceException("JIT (010000000000003B) system title not found! The JIT will not work, provide the system archive to fix this error. (See https://github.com/GreemDev/Ryujinx#requirements for more information)");
|
||||||
}
|
}
|
||||||
|
|
||||||
context.Device.LoadNca(filePath);
|
context.Device.LoadNca(filePath);
|
||||||
|
@ -105,7 +105,7 @@ namespace Ryujinx.HLE.HOS.Services.Sdb.Pl
|
|||||||
titleName = "Unknown";
|
titleName = "Unknown";
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new InvalidSystemResourceException($"{titleName} ({fontTitle:x8}) system title not found! This font will not work, provide the system archive to fix this error. (See https://github.com/Ryujinx/Ryujinx#requirements for more information)");
|
throw new InvalidSystemResourceException($"{titleName} ({fontTitle:x8}) system title not found! This font will not work, provide the system archive to fix this error. (See https://github.com/GreemDev/Ryujinx#requirements for more information)");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -23,7 +23,7 @@ namespace Ryujinx.HLE.HOS.Services.Ssl
|
|||||||
{
|
{
|
||||||
private const long CertStoreTitleId = 0x0100000000000800;
|
private const long CertStoreTitleId = 0x0100000000000800;
|
||||||
|
|
||||||
private const string CertStoreTitleMissingErrorMessage = "CertStore system title not found! SSL CA retrieving will not work, provide the system archive to fix this error. (See https://github.com/Ryujinx/Ryujinx/wiki/Ryujinx-Setup-&-Configuration-Guide#initial-setup-continued---installation-of-firmware for more information)";
|
private const string CertStoreTitleMissingErrorMessage = "CertStore system title not found! SSL CA retrieving will not work, provide the system archive to fix this error.";
|
||||||
|
|
||||||
private static BuiltInCertificateManager _instance;
|
private static BuiltInCertificateManager _instance;
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone
|
|||||||
{
|
{
|
||||||
private const long TimeZoneBinaryTitleId = 0x010000000000080E;
|
private const long TimeZoneBinaryTitleId = 0x010000000000080E;
|
||||||
|
|
||||||
private const string TimeZoneSystemTitleMissingErrorMessage = "TimeZoneBinary system title not found! TimeZone conversions will not work, provide the system archive to fix this error. (See https://github.com/Ryujinx/Ryujinx/wiki/Ryujinx-Setup-&-Configuration-Guide#initial-setup-continued---installation-of-firmware for more information)";
|
private const string TimeZoneSystemTitleMissingErrorMessage = "TimeZoneBinary system title not found! TimeZone conversions will not work, provide the system archive to fix this error.";
|
||||||
|
|
||||||
private VirtualFileSystem _virtualFileSystem;
|
private VirtualFileSystem _virtualFileSystem;
|
||||||
private IntegrityCheckLevel _fsIntegrityCheckLevel;
|
private IntegrityCheckLevel _fsIntegrityCheckLevel;
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
using DiscordRPC;
|
using DiscordRPC;
|
||||||
using Humanizer;
|
using Humanizer;
|
||||||
|
using LibHac.Bcat;
|
||||||
using Ryujinx.Common;
|
using Ryujinx.Common;
|
||||||
|
using Ryujinx.HLE.Loaders.Processes;
|
||||||
using Ryujinx.UI.App.Common;
|
using Ryujinx.UI.App.Common;
|
||||||
using Ryujinx.UI.Common.Configuration;
|
using Ryujinx.UI.Common.Configuration;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@ -13,7 +15,7 @@ namespace Ryujinx.UI.Common
|
|||||||
{
|
{
|
||||||
public static Timestamps StartedAt { get; set; }
|
public static Timestamps StartedAt { get; set; }
|
||||||
|
|
||||||
private const string Description = "A simple, experimental Nintendo Switch emulator.";
|
private static readonly string _description = $"{ReleaseInformation.ReleaseChannelOwner}/{ReleaseInformation.ReleaseChannelRepo} {ReleaseInformation.Version}";
|
||||||
private const string ApplicationId = "1293250299716173864";
|
private const string ApplicationId = "1293250299716173864";
|
||||||
|
|
||||||
private const int ApplicationByteLimit = 128;
|
private const int ApplicationByteLimit = 128;
|
||||||
@ -29,7 +31,7 @@ namespace Ryujinx.UI.Common
|
|||||||
Assets = new Assets
|
Assets = new Assets
|
||||||
{
|
{
|
||||||
LargeImageKey = "ryujinx",
|
LargeImageKey = "ryujinx",
|
||||||
LargeImageText = Description
|
LargeImageText = TruncateToByteLength(_description)
|
||||||
},
|
},
|
||||||
Details = "Main Menu",
|
Details = "Main Menu",
|
||||||
State = "Idling",
|
State = "Idling",
|
||||||
@ -62,38 +64,34 @@ namespace Ryujinx.UI.Common
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static readonly string[] _discordGameAssets = [
|
public static void SwitchToPlayingState(ApplicationMetadata appMeta, ProcessResult procRes)
|
||||||
"0100f2c0115b6000", // Tears of the Kingdom
|
|
||||||
"0100744001588000", // Cars 3: Driven to Win
|
|
||||||
|
|
||||||
];
|
|
||||||
|
|
||||||
public static void SwitchToPlayingState(string titleId, ApplicationMetadata appMeta)
|
|
||||||
{
|
{
|
||||||
_discordClient?.SetPresence(new RichPresence
|
_discordClient?.SetPresence(new RichPresence
|
||||||
{
|
{
|
||||||
Assets = new Assets
|
Assets = new Assets
|
||||||
{
|
{
|
||||||
LargeImageKey = _discordGameAssets.Contains(titleId.ToLower()) ? titleId : "game",
|
LargeImageKey = _discordGameAssets.Contains(procRes.ProgramIdText.ToLower()) ? procRes.ProgramIdText : "game",
|
||||||
LargeImageText = TruncateToByteLength(appMeta.Title, ApplicationByteLimit),
|
LargeImageText = TruncateToByteLength($"{appMeta.Title} | {procRes.DisplayVersion}"),
|
||||||
SmallImageKey = "ryujinx",
|
SmallImageKey = "ryujinx",
|
||||||
SmallImageText = Description
|
SmallImageText = TruncateToByteLength(_description)
|
||||||
},
|
},
|
||||||
Details = TruncateToByteLength($"Playing {appMeta.Title}", ApplicationByteLimit),
|
Details = TruncateToByteLength($"Playing {appMeta.Title}"),
|
||||||
State = $"Total play time: {appMeta.TimePlayed.Humanize(2, false)}",
|
State = appMeta.LastPlayed.HasValue
|
||||||
|
? $"Total play time: {appMeta.TimePlayed.Humanize(2, false)}"
|
||||||
|
: "Never played",
|
||||||
Timestamps = Timestamps.Now
|
Timestamps = Timestamps.Now
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string TruncateToByteLength(string input, int byteLimit)
|
private static string TruncateToByteLength(string input)
|
||||||
{
|
{
|
||||||
if (Encoding.UTF8.GetByteCount(input) <= byteLimit)
|
if (Encoding.UTF8.GetByteCount(input) <= ApplicationByteLimit)
|
||||||
{
|
{
|
||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find the length to trim the string to guarantee we have space for the trailing ellipsis.
|
// Find the length to trim the string to guarantee we have space for the trailing ellipsis.
|
||||||
int trimLimit = byteLimit - Encoding.UTF8.GetByteCount(Ellipsis);
|
int trimLimit = ApplicationByteLimit - Encoding.UTF8.GetByteCount(Ellipsis);
|
||||||
|
|
||||||
// Make sure the string is long enough to perform the basic trim.
|
// Make sure the string is long enough to perform the basic trim.
|
||||||
// Amount of bytes != Length of the string
|
// Amount of bytes != Length of the string
|
||||||
@ -116,5 +114,49 @@ namespace Ryujinx.UI.Common
|
|||||||
{
|
{
|
||||||
_discordClient?.Dispose();
|
_discordClient?.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static readonly string[] _discordGameAssets = [
|
||||||
|
"01002da013484000", // The Legend of Zelda: Skyward Sword HD
|
||||||
|
"01007ef00011e000", // The Legend of Zelda: Breath of the Wild
|
||||||
|
"0100f2c0115b6000", // The Legend of Zelda: Tears of the Kingdom
|
||||||
|
"01008cf01baac000", // The Legend of Zelda: Echoes of Wisdom
|
||||||
|
|
||||||
|
"0100000000010000", // SUPER MARIO ODYSSEY
|
||||||
|
"010015100b514000", // Super Mario Bros. Wonder
|
||||||
|
"0100152000022000", // Mario Kart 8 Deluxe
|
||||||
|
"010049900f546000", // Super Mario 3D All-Stars
|
||||||
|
"010028600ebda000", // Super Mario 3D World + Bowser's Fury
|
||||||
|
"0100ecd018ebe000", // Paper Mario: The Thousand-Year Door
|
||||||
|
|
||||||
|
"01008f6008c5e000", // Pokémon Violet
|
||||||
|
"0100abf008968000", // Pokémon Sword
|
||||||
|
"01008db008c2c000", // Pokémon Shield
|
||||||
|
"0100000011d90000", // Pokémon Brilliant Diamond
|
||||||
|
"01001f5010dfa000", // Pokémon Legends: Arceus
|
||||||
|
|
||||||
|
"0100aa80194b0000", // Pikmin 1
|
||||||
|
"0100d680194b2000", // Pikmin 2
|
||||||
|
"0100f4c009322000", // Pikmin 3 Deluxe
|
||||||
|
"0100b7c00933a000", // Pikmin
|
||||||
|
|
||||||
|
"0100c2500fc20000", // Splatoon 3
|
||||||
|
"0100ba0018500000", // Splatoon 3: Splatfest World Premiere
|
||||||
|
"0100744001588000", // Cars 3: Driven to Win
|
||||||
|
"01006f8002326000", // Animal Crossing: New Horizons
|
||||||
|
"0100853015e86000", // No Man's Sky
|
||||||
|
"01008d100d43e000", // Saints Row IV
|
||||||
|
"0100de600beee000", // Saints Row: The Third - The Full Package
|
||||||
|
"0100d7a01b7a2000", // Star Wars: Bounty Hunter
|
||||||
|
"0100dbf01000a000", // Burnout Paradise Remastered
|
||||||
|
"0100e46006708000", // Terraria
|
||||||
|
"010056e00853a000", // A Hat in Time
|
||||||
|
"01006a800016e000", // Super Smash Bros. Ultimate
|
||||||
|
"01007bb017812000", // Portal
|
||||||
|
"0100abd01785c000", // Portal 2
|
||||||
|
"01008e200c5c2000", // Muse Dash
|
||||||
|
"01001180021fa000", // Shovel Knight: Specter of Torment
|
||||||
|
"010012101468c000", // Metroid Prime Remastered
|
||||||
|
"0100c9a00ece6000", // Nintendo 64 - Nintendo Switch Online
|
||||||
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@ namespace Ryujinx.UI.Common.Helper
|
|||||||
{
|
{
|
||||||
public static partial class FileAssociationHelper
|
public static partial class FileAssociationHelper
|
||||||
{
|
{
|
||||||
private static readonly string[] _fileExtensions = { ".nca", ".nro", ".nso", ".nsp", ".xci" };
|
private static readonly string[] _fileExtensions = [".nca", ".nro", ".nso", ".nsp", ".xci"];
|
||||||
|
|
||||||
[SupportedOSPlatform("linux")]
|
[SupportedOSPlatform("linux")]
|
||||||
private static readonly string _mimeDbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".local", "share", "mime");
|
private static readonly string _mimeDbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".local", "share", "mime");
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 51 KiB |
Binary file not shown.
Before Width: | Height: | Size: 29 KiB |
Binary file not shown.
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 24 KiB |
Binary file not shown.
Before Width: | Height: | Size: 18 KiB |
Binary file not shown.
Before Width: | Height: | Size: 19 KiB |
@ -18,9 +18,7 @@
|
|||||||
<None Remove="Resources\Logo_Amiibo.png" />
|
<None Remove="Resources\Logo_Amiibo.png" />
|
||||||
<None Remove="Resources\Logo_Discord.png" />
|
<None Remove="Resources\Logo_Discord.png" />
|
||||||
<None Remove="Resources\Logo_GitHub.png" />
|
<None Remove="Resources\Logo_GitHub.png" />
|
||||||
<None Remove="Resources\Logo_Patreon.png" />
|
|
||||||
<None Remove="Resources\Logo_Ryujinx.png" />
|
<None Remove="Resources\Logo_Ryujinx.png" />
|
||||||
<None Remove="Resources\Logo_Twitter.png" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -39,10 +37,6 @@
|
|||||||
<EmbeddedResource Include="Resources\Logo_Discord_Light.png" />
|
<EmbeddedResource Include="Resources\Logo_Discord_Light.png" />
|
||||||
<EmbeddedResource Include="Resources\Logo_GitHub_Dark.png" />
|
<EmbeddedResource Include="Resources\Logo_GitHub_Dark.png" />
|
||||||
<EmbeddedResource Include="Resources\Logo_GitHub_Light.png" />
|
<EmbeddedResource Include="Resources\Logo_GitHub_Light.png" />
|
||||||
<EmbeddedResource Include="Resources\Logo_Patreon_Dark.png" />
|
|
||||||
<EmbeddedResource Include="Resources\Logo_Patreon_Light.png" />
|
|
||||||
<EmbeddedResource Include="Resources\Logo_Twitter_Dark.png" />
|
|
||||||
<EmbeddedResource Include="Resources\Logo_Twitter_Light.png" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup Condition="'$(RuntimeIdentifier)' == 'linux-x64' OR '$(RuntimeIdentifier)' == 'linux-arm64' OR '$(RuntimeIdentifier)' == ''">
|
<ItemGroup Condition="'$(RuntimeIdentifier)' == 'linux-x64' OR '$(RuntimeIdentifier)' == 'linux-arm64' OR '$(RuntimeIdentifier)' == ''">
|
||||||
|
@ -33,17 +33,13 @@ namespace Ryujinx.UI.Common.SystemInfo
|
|||||||
public static SystemInfo Gather()
|
public static SystemInfo Gather()
|
||||||
{
|
{
|
||||||
if (OperatingSystem.IsWindows())
|
if (OperatingSystem.IsWindows())
|
||||||
{
|
|
||||||
return new WindowsSystemInfo();
|
return new WindowsSystemInfo();
|
||||||
}
|
|
||||||
else if (OperatingSystem.IsLinux())
|
if (OperatingSystem.IsLinux())
|
||||||
{
|
|
||||||
return new LinuxSystemInfo();
|
return new LinuxSystemInfo();
|
||||||
}
|
|
||||||
else if (OperatingSystem.IsMacOS())
|
if (OperatingSystem.IsMacOS())
|
||||||
{
|
|
||||||
return new MacOSSystemInfo();
|
return new MacOSSystemInfo();
|
||||||
}
|
|
||||||
|
|
||||||
Logger.Error?.Print(LogClass.Application, "SystemInfo unsupported on this platform");
|
Logger.Error?.Print(LogClass.Application, "SystemInfo unsupported on this platform");
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ namespace Ryujinx.UI.Common.SystemInfo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Environment.GetEnvironmentVariable("PROCESSOR_IDENTIFIER").Trim();
|
return Environment.GetEnvironmentVariable("PROCESSOR_IDENTIFIER")?.Trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
@ -71,8 +71,7 @@ namespace Ryujinx.Ava
|
|||||||
|
|
||||||
if (result == UserResult.Yes)
|
if (result == UserResult.Yes)
|
||||||
{
|
{
|
||||||
var path = Environment.ProcessPath;
|
_ = Process.Start(Environment.ProcessPath!, CommandLineState.Arguments);
|
||||||
var proc = Process.Start(path, CommandLineState.Arguments);
|
|
||||||
desktop.Shutdown();
|
desktop.Shutdown();
|
||||||
Environment.Exit(0);
|
Environment.Exit(0);
|
||||||
}
|
}
|
||||||
@ -113,7 +112,7 @@ namespace Ryujinx.Ava
|
|||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
Logger.Warning?.Print(LogClass.Application, "Failed to Apply Theme. A restart is needed to apply the selected theme");
|
Logger.Warning?.Print(LogClass.Application, "Failed to apply theme. A restart is needed to apply the selected theme.");
|
||||||
|
|
||||||
ShowRestartDialog();
|
ShowRestartDialog();
|
||||||
}
|
}
|
||||||
|
@ -785,12 +785,11 @@ namespace Ryujinx.Ava
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ApplicationMetadata appMeta = ApplicationLibrary.LoadAndSaveMetaData(Device.Processes.ActiveApplication.ProgramIdText, appMetadata =>
|
ApplicationMetadata appMeta = ApplicationLibrary.LoadAndSaveMetaData(Device.Processes.ActiveApplication.ProgramIdText,
|
||||||
{
|
appMetadata => appMetadata.UpdatePreGame()
|
||||||
appMetadata.UpdatePreGame();
|
);
|
||||||
});
|
|
||||||
|
|
||||||
DiscordIntegrationModule.SwitchToPlayingState(Device.Processes.ActiveApplication.ProgramIdText, appMeta);
|
DiscordIntegrationModule.SwitchToPlayingState(appMeta, Device.Processes.ActiveApplication);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -825,7 +824,7 @@ namespace Ryujinx.Ava
|
|||||||
{
|
{
|
||||||
renderer = new VulkanRenderer(
|
renderer = new VulkanRenderer(
|
||||||
Vk.GetApi(),
|
Vk.GetApi(),
|
||||||
(RendererHost.EmbeddedWindow as EmbeddedWindowVulkan).CreateSurface,
|
(RendererHost.EmbeddedWindow as EmbeddedWindowVulkan)!.CreateSurface,
|
||||||
VulkanHelper.GetRequiredInstanceExtensions,
|
VulkanHelper.GetRequiredInstanceExtensions,
|
||||||
ConfigurationState.Instance.Graphics.PreferredGpu.Value);
|
ConfigurationState.Instance.Graphics.PreferredGpu.Value);
|
||||||
}
|
}
|
||||||
@ -845,36 +844,39 @@ namespace Ryujinx.Ava
|
|||||||
Logger.Info?.PrintMsg(LogClass.Gpu, $"Backend Threading ({threadingMode}): {isGALThreaded}");
|
Logger.Info?.PrintMsg(LogClass.Gpu, $"Backend Threading ({threadingMode}): {isGALThreaded}");
|
||||||
|
|
||||||
// Initialize Configuration.
|
// Initialize Configuration.
|
||||||
var memoryConfiguration = ConfigurationState.Instance.System.ExpandRam.Value ? MemoryConfiguration.MemoryConfiguration8GiB : MemoryConfiguration.MemoryConfiguration4GiB;
|
var memoryConfiguration = ConfigurationState.Instance.System.ExpandRam
|
||||||
|
? MemoryConfiguration.MemoryConfiguration8GiB
|
||||||
|
: MemoryConfiguration.MemoryConfiguration4GiB;
|
||||||
|
|
||||||
HLEConfiguration configuration = new(VirtualFileSystem,
|
Device = new Switch(new HLEConfiguration(
|
||||||
_viewModel.LibHacHorizonManager,
|
VirtualFileSystem,
|
||||||
ContentManager,
|
_viewModel.LibHacHorizonManager,
|
||||||
_accountManager,
|
ContentManager,
|
||||||
_userChannelPersistence,
|
_accountManager,
|
||||||
renderer,
|
_userChannelPersistence,
|
||||||
InitializeAudio(),
|
renderer,
|
||||||
memoryConfiguration,
|
InitializeAudio(),
|
||||||
_viewModel.UiHandler,
|
memoryConfiguration,
|
||||||
(SystemLanguage)ConfigurationState.Instance.System.Language.Value,
|
_viewModel.UiHandler,
|
||||||
(RegionCode)ConfigurationState.Instance.System.Region.Value,
|
(SystemLanguage)ConfigurationState.Instance.System.Language.Value,
|
||||||
ConfigurationState.Instance.Graphics.EnableVsync,
|
(RegionCode)ConfigurationState.Instance.System.Region.Value,
|
||||||
ConfigurationState.Instance.System.EnableDockedMode,
|
ConfigurationState.Instance.Graphics.EnableVsync,
|
||||||
ConfigurationState.Instance.System.EnablePtc,
|
ConfigurationState.Instance.System.EnableDockedMode,
|
||||||
ConfigurationState.Instance.System.EnableInternetAccess,
|
ConfigurationState.Instance.System.EnablePtc,
|
||||||
ConfigurationState.Instance.System.EnableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None,
|
ConfigurationState.Instance.System.EnableInternetAccess,
|
||||||
ConfigurationState.Instance.System.FsGlobalAccessLogMode,
|
ConfigurationState.Instance.System.EnableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None,
|
||||||
ConfigurationState.Instance.System.SystemTimeOffset,
|
ConfigurationState.Instance.System.FsGlobalAccessLogMode,
|
||||||
ConfigurationState.Instance.System.TimeZone,
|
ConfigurationState.Instance.System.SystemTimeOffset,
|
||||||
ConfigurationState.Instance.System.MemoryManagerMode,
|
ConfigurationState.Instance.System.TimeZone,
|
||||||
ConfigurationState.Instance.System.IgnoreMissingServices,
|
ConfigurationState.Instance.System.MemoryManagerMode,
|
||||||
ConfigurationState.Instance.Graphics.AspectRatio,
|
ConfigurationState.Instance.System.IgnoreMissingServices,
|
||||||
ConfigurationState.Instance.System.AudioVolume,
|
ConfigurationState.Instance.Graphics.AspectRatio,
|
||||||
ConfigurationState.Instance.System.UseHypervisor,
|
ConfigurationState.Instance.System.AudioVolume,
|
||||||
ConfigurationState.Instance.Multiplayer.LanInterfaceId.Value,
|
ConfigurationState.Instance.System.UseHypervisor,
|
||||||
ConfigurationState.Instance.Multiplayer.Mode);
|
ConfigurationState.Instance.Multiplayer.LanInterfaceId,
|
||||||
|
ConfigurationState.Instance.Multiplayer.Mode
|
||||||
Device = new Switch(configuration);
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static IHardwareDeviceDriver InitializeAudio()
|
private static IHardwareDeviceDriver InitializeAudio()
|
||||||
|
@ -6,33 +6,23 @@ using System;
|
|||||||
|
|
||||||
namespace Ryujinx.Ava.Common.Locale
|
namespace Ryujinx.Ava.Common.Locale
|
||||||
{
|
{
|
||||||
internal class LocaleExtension : MarkupExtension
|
internal class LocaleExtension(LocaleKeys key) : MarkupExtension
|
||||||
{
|
{
|
||||||
public LocaleExtension(LocaleKeys key)
|
public LocaleKeys Key { get; } = key;
|
||||||
{
|
|
||||||
Key = key;
|
|
||||||
}
|
|
||||||
|
|
||||||
public LocaleKeys Key { get; }
|
|
||||||
|
|
||||||
public override object ProvideValue(IServiceProvider serviceProvider)
|
public override object ProvideValue(IServiceProvider serviceProvider)
|
||||||
{
|
{
|
||||||
LocaleKeys keyToUse = Key;
|
|
||||||
|
|
||||||
var builder = new CompiledBindingPathBuilder();
|
var builder = new CompiledBindingPathBuilder();
|
||||||
|
|
||||||
builder
|
builder.Property(
|
||||||
.Property(new ClrPropertyInfo("Item",
|
new ClrPropertyInfo("Item",
|
||||||
obj => (LocaleManager.Instance[keyToUse]),
|
_ => LocaleManager.Instance[Key],
|
||||||
null,
|
null,
|
||||||
typeof(string)), (weakRef, iPropInfo) =>
|
typeof(string)
|
||||||
{
|
),
|
||||||
return PropertyInfoAccessorFactory.CreateInpcPropertyAccessor(weakRef, iPropInfo);
|
PropertyInfoAccessorFactory.CreateInpcPropertyAccessor);
|
||||||
});
|
|
||||||
|
|
||||||
var path = builder.Build();
|
var binding = new CompiledBindingExtension(builder.Build())
|
||||||
|
|
||||||
var binding = new CompiledBindingExtension(path)
|
|
||||||
{
|
{
|
||||||
Source = LocaleManager.Instance
|
Source = LocaleManager.Instance
|
||||||
};
|
};
|
||||||
|
@ -57,40 +57,32 @@ namespace Ryujinx.Ava.Common.Locale
|
|||||||
{
|
{
|
||||||
// Check if the localized string needs to be formatted.
|
// Check if the localized string needs to be formatted.
|
||||||
if (_dynamicValues.TryGetValue(key, out var dynamicValue))
|
if (_dynamicValues.TryGetValue(key, out var dynamicValue))
|
||||||
{
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return string.Format(value, dynamicValue);
|
return string.Format(value, dynamicValue);
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch
|
||||||
{
|
{
|
||||||
// If formatting failed use the default text instead.
|
// If formatting failed use the default text instead.
|
||||||
if (_localeDefaultStrings.TryGetValue(key, out value))
|
if (_localeDefaultStrings.TryGetValue(key, out value))
|
||||||
{
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return string.Format(value, dynamicValue);
|
return string.Format(value, dynamicValue);
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch
|
||||||
{
|
{
|
||||||
// If formatting the default text failed return the key.
|
// If formatting the default text failed return the key.
|
||||||
return key.ToString();
|
return key.ToString();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the locale doesn't contain the key return the default one.
|
// If the locale doesn't contain the key return the default one.
|
||||||
if (_localeDefaultStrings.TryGetValue(key, out string defaultValue))
|
return _localeDefaultStrings.TryGetValue(key, out string defaultValue)
|
||||||
{
|
? defaultValue
|
||||||
return defaultValue;
|
: key.ToString(); // If the locale text doesn't exist return the key.
|
||||||
}
|
|
||||||
|
|
||||||
// If the locale text doesn't exist return the key.
|
|
||||||
return key.ToString();
|
|
||||||
}
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
@ -100,14 +92,12 @@ namespace Ryujinx.Ava.Common.Locale
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsRTL()
|
public bool IsRTL() =>
|
||||||
{
|
_localeLanguageCode switch
|
||||||
return _localeLanguageCode switch
|
|
||||||
{
|
{
|
||||||
"ar_SA" or "he_IL" => true,
|
"ar_SA" or "he_IL" => true,
|
||||||
_ => false
|
_ => false
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
public string UpdateAndGetDynamicValue(LocaleKeys key, params object[] values)
|
public string UpdateAndGetDynamicValue(LocaleKeys key, params object[] values)
|
||||||
{
|
{
|
||||||
|
@ -36,7 +36,7 @@ namespace Ryujinx.Ava
|
|||||||
|
|
||||||
private const uint MbIconwarning = 0x30;
|
private const uint MbIconwarning = 0x30;
|
||||||
|
|
||||||
public static void Main(string[] args)
|
public static int Main(string[] args)
|
||||||
{
|
{
|
||||||
Version = ReleaseInformation.Version;
|
Version = ReleaseInformation.Version;
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ namespace Ryujinx.Ava
|
|||||||
|
|
||||||
LoggerAdapter.Register();
|
LoggerAdapter.Register();
|
||||||
|
|
||||||
BuildAvaloniaApp().StartWithClassicDesktopLifetime(args);
|
return BuildAvaloniaApp().StartWithClassicDesktopLifetime(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AppBuilder BuildAvaloniaApp()
|
public static AppBuilder BuildAvaloniaApp()
|
||||||
@ -182,41 +182,33 @@ namespace Ryujinx.Ava
|
|||||||
UseHardwareAcceleration = ConfigurationState.Instance.EnableHardwareAcceleration.Value;
|
UseHardwareAcceleration = ConfigurationState.Instance.EnableHardwareAcceleration.Value;
|
||||||
|
|
||||||
// Check if graphics backend was overridden
|
// Check if graphics backend was overridden
|
||||||
if (CommandLineState.OverrideGraphicsBackend != null)
|
if (CommandLineState.OverrideGraphicsBackend is not null)
|
||||||
{
|
ConfigurationState.Instance.Graphics.GraphicsBackend.Value = CommandLineState.OverrideGraphicsBackend.ToLower() switch
|
||||||
if (CommandLineState.OverrideGraphicsBackend.ToLower() == "opengl")
|
|
||||||
{
|
{
|
||||||
ConfigurationState.Instance.Graphics.GraphicsBackend.Value = GraphicsBackend.OpenGl;
|
"opengl" => GraphicsBackend.OpenGl,
|
||||||
}
|
"vulkan" => GraphicsBackend.Vulkan,
|
||||||
else if (CommandLineState.OverrideGraphicsBackend.ToLower() == "vulkan")
|
_ => ConfigurationState.Instance.Graphics.GraphicsBackend
|
||||||
{
|
};
|
||||||
ConfigurationState.Instance.Graphics.GraphicsBackend.Value = GraphicsBackend.Vulkan;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if docked mode was overriden.
|
// Check if docked mode was overriden.
|
||||||
if (CommandLineState.OverrideDockedMode.HasValue)
|
if (CommandLineState.OverrideDockedMode.HasValue)
|
||||||
{
|
|
||||||
ConfigurationState.Instance.System.EnableDockedMode.Value = CommandLineState.OverrideDockedMode.Value;
|
ConfigurationState.Instance.System.EnableDockedMode.Value = CommandLineState.OverrideDockedMode.Value;
|
||||||
}
|
|
||||||
|
|
||||||
// Check if HideCursor was overridden.
|
// Check if HideCursor was overridden.
|
||||||
if (CommandLineState.OverrideHideCursor is not null)
|
if (CommandLineState.OverrideHideCursor is not null)
|
||||||
{
|
ConfigurationState.Instance.HideCursor.Value = CommandLineState.OverrideHideCursor.ToLower() switch
|
||||||
ConfigurationState.Instance.HideCursor.Value = CommandLineState.OverrideHideCursor!.ToLower() switch
|
|
||||||
{
|
{
|
||||||
"never" => HideCursorMode.Never,
|
"never" => HideCursorMode.Never,
|
||||||
"onidle" => HideCursorMode.OnIdle,
|
"onidle" => HideCursorMode.OnIdle,
|
||||||
"always" => HideCursorMode.Always,
|
"always" => HideCursorMode.Always,
|
||||||
_ => ConfigurationState.Instance.HideCursor.Value,
|
_ => ConfigurationState.Instance.HideCursor,
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
// Check if hardware-acceleration was overridden.
|
// Check if hardware-acceleration was overridden.
|
||||||
if (CommandLineState.OverrideHardwareAcceleration != null)
|
if (CommandLineState.OverrideHardwareAcceleration != null)
|
||||||
{
|
|
||||||
UseHardwareAcceleration = CommandLineState.OverrideHardwareAcceleration.Value;
|
UseHardwareAcceleration = CommandLineState.OverrideHardwareAcceleration.Value;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void PrintSystemInfo()
|
private static void PrintSystemInfo()
|
||||||
|
@ -5,25 +5,15 @@ using System;
|
|||||||
|
|
||||||
namespace Ryujinx.Ava.UI.Applet
|
namespace Ryujinx.Ava.UI.Applet
|
||||||
{
|
{
|
||||||
class AvaloniaHostUITheme : IHostUITheme
|
class AvaloniaHostUITheme(MainWindow parent) : IHostUITheme
|
||||||
{
|
{
|
||||||
public AvaloniaHostUITheme(MainWindow parent)
|
public string FontFamily { get; } = OperatingSystem.IsWindows() && OperatingSystem.IsWindowsVersionAtLeast(10, 0, 22000) ? "Segoe UI Variable" : parent.FontFamily.Name;
|
||||||
{
|
|
||||||
FontFamily = OperatingSystem.IsWindows() && OperatingSystem.IsWindowsVersionAtLeast(10, 0, 22000) ? "Segoe UI Variable" : parent.FontFamily.Name;
|
|
||||||
DefaultBackgroundColor = BrushToThemeColor(parent.Background);
|
|
||||||
DefaultForegroundColor = BrushToThemeColor(parent.Foreground);
|
|
||||||
DefaultBorderColor = BrushToThemeColor(parent.BorderBrush);
|
|
||||||
SelectionBackgroundColor = BrushToThemeColor(parent.ViewControls.SearchBox.SelectionBrush);
|
|
||||||
SelectionForegroundColor = BrushToThemeColor(parent.ViewControls.SearchBox.SelectionForegroundBrush);
|
|
||||||
}
|
|
||||||
|
|
||||||
public string FontFamily { get; }
|
public ThemeColor DefaultBackgroundColor { get; } = BrushToThemeColor(parent.Background);
|
||||||
|
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; }
|
|
||||||
|
|
||||||
private static ThemeColor BrushToThemeColor(IBrush brush)
|
private static ThemeColor BrushToThemeColor(IBrush brush)
|
||||||
{
|
{
|
||||||
|
@ -1,22 +1,18 @@
|
|||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
using Ryujinx.UI.Common;
|
using Ryujinx.UI.Common;
|
||||||
using Ryujinx.UI.Common.Helper;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.UI.Helpers
|
namespace Ryujinx.Ava.UI.Helpers
|
||||||
{
|
{
|
||||||
internal class UserErrorDialog
|
internal class UserErrorDialog
|
||||||
{
|
{
|
||||||
private const string SetupGuideUrl = "https://github.com/Ryujinx/Ryujinx/wiki/Ryujinx-Setup-&-Configuration-Guide";
|
|
||||||
|
|
||||||
private static string GetErrorCode(UserError error)
|
private static string GetErrorCode(UserError error)
|
||||||
{
|
{
|
||||||
return $"RYU-{(uint)error:X4}";
|
return $"RYU-{(uint)error:X4}";
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string GetErrorTitle(UserError error)
|
private static string GetErrorTitle(UserError error) =>
|
||||||
{
|
error switch
|
||||||
return error switch
|
|
||||||
{
|
{
|
||||||
UserError.NoKeys => LocaleManager.Instance[LocaleKeys.UserErrorNoKeys],
|
UserError.NoKeys => LocaleManager.Instance[LocaleKeys.UserErrorNoKeys],
|
||||||
UserError.NoFirmware => LocaleManager.Instance[LocaleKeys.UserErrorNoFirmware],
|
UserError.NoFirmware => LocaleManager.Instance[LocaleKeys.UserErrorNoFirmware],
|
||||||
@ -25,11 +21,9 @@ namespace Ryujinx.Ava.UI.Helpers
|
|||||||
UserError.Unknown => LocaleManager.Instance[LocaleKeys.UserErrorUnknown],
|
UserError.Unknown => LocaleManager.Instance[LocaleKeys.UserErrorUnknown],
|
||||||
_ => LocaleManager.Instance[LocaleKeys.UserErrorUndefined],
|
_ => LocaleManager.Instance[LocaleKeys.UserErrorUndefined],
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
private static string GetErrorDescription(UserError error)
|
private static string GetErrorDescription(UserError error) =>
|
||||||
{
|
error switch
|
||||||
return error switch
|
|
||||||
{
|
{
|
||||||
UserError.NoKeys => LocaleManager.Instance[LocaleKeys.UserErrorNoKeysDescription],
|
UserError.NoKeys => LocaleManager.Instance[LocaleKeys.UserErrorNoKeysDescription],
|
||||||
UserError.NoFirmware => LocaleManager.Instance[LocaleKeys.UserErrorNoFirmwareDescription],
|
UserError.NoFirmware => LocaleManager.Instance[LocaleKeys.UserErrorNoFirmwareDescription],
|
||||||
@ -38,53 +32,17 @@ namespace Ryujinx.Ava.UI.Helpers
|
|||||||
UserError.Unknown => LocaleManager.Instance[LocaleKeys.UserErrorUnknownDescription],
|
UserError.Unknown => LocaleManager.Instance[LocaleKeys.UserErrorUnknownDescription],
|
||||||
_ => LocaleManager.Instance[LocaleKeys.UserErrorUndefinedDescription],
|
_ => LocaleManager.Instance[LocaleKeys.UserErrorUndefinedDescription],
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
private static bool IsCoveredBySetupGuide(UserError error)
|
|
||||||
{
|
|
||||||
return error switch
|
|
||||||
{
|
|
||||||
UserError.NoKeys or
|
|
||||||
UserError.NoFirmware or
|
|
||||||
UserError.FirmwareParsingFailed => true,
|
|
||||||
_ => false,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string GetSetupGuideUrl(UserError error)
|
|
||||||
{
|
|
||||||
if (!IsCoveredBySetupGuide(error))
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return error switch
|
|
||||||
{
|
|
||||||
UserError.NoKeys => SetupGuideUrl + "#initial-setup---placement-of-prodkeys",
|
|
||||||
UserError.NoFirmware => SetupGuideUrl + "#initial-setup-continued---installation-of-firmware",
|
|
||||||
_ => SetupGuideUrl,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task ShowUserErrorDialog(UserError error)
|
public static async Task ShowUserErrorDialog(UserError error)
|
||||||
{
|
{
|
||||||
string errorCode = GetErrorCode(error);
|
string errorCode = GetErrorCode(error);
|
||||||
|
|
||||||
bool isInSetupGuide = IsCoveredBySetupGuide(error);
|
await ContentDialogHelper.CreateInfoDialog(
|
||||||
|
|
||||||
string setupButtonLabel = isInSetupGuide ? LocaleManager.Instance[LocaleKeys.OpenSetupGuideMessage] : "";
|
|
||||||
|
|
||||||
var result = await ContentDialogHelper.CreateInfoDialog(
|
|
||||||
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogUserErrorDialogMessage, errorCode, GetErrorTitle(error)),
|
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogUserErrorDialogMessage, errorCode, GetErrorTitle(error)),
|
||||||
GetErrorDescription(error) + (isInSetupGuide
|
GetErrorDescription(error),
|
||||||
? LocaleManager.Instance[LocaleKeys.DialogUserErrorDialogInfoMessage]
|
"",
|
||||||
: ""), setupButtonLabel, LocaleManager.Instance[LocaleKeys.InputDialogOk],
|
LocaleManager.Instance[LocaleKeys.InputDialogOk],
|
||||||
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogUserErrorDialogTitle, errorCode));
|
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogUserErrorDialogTitle, errorCode));
|
||||||
|
|
||||||
if (result == UserResult.Ok)
|
|
||||||
{
|
|
||||||
OpenHelper.OpenUrl(GetSetupGuideUrl(error));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,11 +17,8 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
{
|
{
|
||||||
private Bitmap _githubLogo;
|
private Bitmap _githubLogo;
|
||||||
private Bitmap _discordLogo;
|
private Bitmap _discordLogo;
|
||||||
private Bitmap _patreonLogo;
|
|
||||||
private Bitmap _twitterLogo;
|
|
||||||
|
|
||||||
private string _version;
|
private string _version;
|
||||||
private string _supporters;
|
|
||||||
|
|
||||||
public Bitmap GithubLogo
|
public Bitmap GithubLogo
|
||||||
{
|
{
|
||||||
@ -43,36 +40,6 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Bitmap PatreonLogo
|
|
||||||
{
|
|
||||||
get => _patreonLogo;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
_patreonLogo = value;
|
|
||||||
OnPropertyChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Bitmap TwitterLogo
|
|
||||||
{
|
|
||||||
get => _twitterLogo;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
_twitterLogo = value;
|
|
||||||
OnPropertyChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Supporters
|
|
||||||
{
|
|
||||||
get => _supporters;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
_supporters = value;
|
|
||||||
OnPropertyChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Version
|
public string Version
|
||||||
{
|
{
|
||||||
get => _version;
|
get => _version;
|
||||||
@ -83,13 +50,12 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Developers => LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.AboutPageDeveloperListMore, "gdkchan, Ac_K, marysaka, rip in peri peri, LDj3SNuD, emmaus, Thealexbarney, GoffyDude, TSRBerry, IsaacMarovitz");
|
public string Developers => LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.AboutPageDeveloperListMore, "gdkchan, Ac_K, marysaka, rip in peri peri, LDj3SNuD, emmaus, Thealexbarney, GoffyDude, TSRBerry, IsaacMarovitz, GreemDev");
|
||||||
|
|
||||||
public AboutWindowViewModel()
|
public AboutWindowViewModel()
|
||||||
{
|
{
|
||||||
Version = Program.Version;
|
Version = Program.Version;
|
||||||
UpdateLogoTheme(ConfigurationState.Instance.UI.BaseStyle.Value);
|
UpdateLogoTheme(ConfigurationState.Instance.UI.BaseStyle.Value);
|
||||||
Dispatcher.UIThread.InvokeAsync(DownloadPatronsJson);
|
|
||||||
|
|
||||||
ThemeManager.ThemeChanged += ThemeManager_ThemeChanged;
|
ThemeManager.ThemeChanged += ThemeManager_ThemeChanged;
|
||||||
}
|
}
|
||||||
@ -108,8 +74,6 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
|
|
||||||
GithubLogo = LoadBitmap($"{basePath}Logo_GitHub_{themeSuffix}?assembly=Ryujinx.UI.Common");
|
GithubLogo = LoadBitmap($"{basePath}Logo_GitHub_{themeSuffix}?assembly=Ryujinx.UI.Common");
|
||||||
DiscordLogo = LoadBitmap($"{basePath}Logo_Discord_{themeSuffix}?assembly=Ryujinx.UI.Common");
|
DiscordLogo = LoadBitmap($"{basePath}Logo_Discord_{themeSuffix}?assembly=Ryujinx.UI.Common");
|
||||||
PatreonLogo = LoadBitmap($"{basePath}Logo_Patreon_{themeSuffix}?assembly=Ryujinx.UI.Common");
|
|
||||||
TwitterLogo = LoadBitmap($"{basePath}Logo_Twitter_{themeSuffix}?assembly=Ryujinx.UI.Common");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Bitmap LoadBitmap(string uri)
|
private Bitmap LoadBitmap(string uri)
|
||||||
@ -122,28 +86,5 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
ThemeManager.ThemeChanged -= ThemeManager_ThemeChanged;
|
ThemeManager.ThemeChanged -= ThemeManager_ThemeChanged;
|
||||||
GC.SuppressFinalize(this);
|
GC.SuppressFinalize(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task DownloadPatronsJson()
|
|
||||||
{
|
|
||||||
if (!NetworkInterface.GetIsNetworkAvailable())
|
|
||||||
{
|
|
||||||
Supporters = LocaleManager.Instance[LocaleKeys.ConnectionError];
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
HttpClient httpClient = new();
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
string patreonJsonString = await httpClient.GetStringAsync("https://patreon.ryujinx.org/");
|
|
||||||
|
|
||||||
Supporters = string.Join(", ", JsonHelper.Deserialize(patreonJsonString, CommonJsonContext.Default.StringArray)) + "\n\n";
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
Supporters = LocaleManager.Instance[LocaleKeys.ApiError];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,9 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
{
|
{
|
||||||
public class AmiiboWindowViewModel : BaseModel, IDisposable
|
public class AmiiboWindowViewModel : BaseModel, IDisposable
|
||||||
{
|
{
|
||||||
|
// ReSharper disable once InconsistentNaming
|
||||||
|
private static bool _cachedUseRandomUuid;
|
||||||
|
|
||||||
private const string DefaultJson = "{ \"amiibo\": [] }";
|
private const string DefaultJson = "{ \"amiibo\": [] }";
|
||||||
private const float AmiiboImageSize = 350f;
|
private const float AmiiboImageSize = 350f;
|
||||||
|
|
||||||
@ -41,7 +44,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
private int _seriesSelectedIndex;
|
private int _seriesSelectedIndex;
|
||||||
private bool _enableScanning;
|
private bool _enableScanning;
|
||||||
private bool _showAllAmiibo;
|
private bool _showAllAmiibo;
|
||||||
private bool _useRandomUuid;
|
private bool _useRandomUuid = _cachedUseRandomUuid;
|
||||||
private string _usage;
|
private string _usage;
|
||||||
|
|
||||||
private static readonly AmiiboJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions());
|
private static readonly AmiiboJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions());
|
||||||
@ -82,7 +85,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
get => _useRandomUuid;
|
get => _useRandomUuid;
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
_useRandomUuid = value;
|
_cachedUseRandomUuid = _useRandomUuid = value;
|
||||||
|
|
||||||
OnPropertyChanged();
|
OnPropertyChanged();
|
||||||
}
|
}
|
||||||
|
@ -911,7 +911,8 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
|
|
||||||
public KeyGesture PauseKey
|
public KeyGesture PauseKey
|
||||||
{
|
{
|
||||||
get => KeyGesture.Parse(_pauseKey); set
|
get => KeyGesture.Parse(_pauseKey);
|
||||||
|
set
|
||||||
{
|
{
|
||||||
_pauseKey = value.ToString();
|
_pauseKey = value.ToString();
|
||||||
|
|
||||||
|
@ -83,18 +83,13 @@
|
|||||||
LineHeight="12"
|
LineHeight="12"
|
||||||
Text="{Binding Version}"
|
Text="{Binding Version}"
|
||||||
TextAlignment="Center" />
|
TextAlignment="Center" />
|
||||||
<Button
|
<Border
|
||||||
Padding="5"
|
|
||||||
HorizontalAlignment="Center"
|
Height="1"
|
||||||
Background="Transparent"
|
Margin="0,20, 0, 20"
|
||||||
Click="Button_OnClick"
|
HorizontalAlignment="Stretch"
|
||||||
Tag="https://github.com/Ryujinx/Ryujinx/wiki/Changelog#ryujinx-changelog">
|
BorderBrush="{DynamicResource ThemeControlBorderColor}"
|
||||||
<TextBlock
|
BorderThickness="0,1,0,0" />
|
||||||
FontSize="10"
|
|
||||||
Text="{locale:Locale AboutChangelogButton}"
|
|
||||||
TextAlignment="Center"
|
|
||||||
ToolTip.Tip="{locale:Locale AboutChangelogButtonTooltipMessage}" />
|
|
||||||
</Button>
|
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<StackPanel
|
<StackPanel
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
@ -132,20 +127,7 @@
|
|||||||
Background="Transparent"
|
Background="Transparent"
|
||||||
Click="Button_OnClick"
|
Click="Button_OnClick"
|
||||||
CornerRadius="15"
|
CornerRadius="15"
|
||||||
Tag="https://www.patreon.com/ryujinx"
|
Tag="https://github.com/GreemDev/Ryujinx"
|
||||||
ToolTip.Tip="{locale:Locale AboutPatreonUrlTooltipMessage}">
|
|
||||||
<Image Source="{Binding PatreonLogo}" />
|
|
||||||
</Button>
|
|
||||||
<Button
|
|
||||||
MinWidth="30"
|
|
||||||
MinHeight="30"
|
|
||||||
MaxWidth="30"
|
|
||||||
MaxHeight="30"
|
|
||||||
Padding="8"
|
|
||||||
Background="Transparent"
|
|
||||||
Click="Button_OnClick"
|
|
||||||
CornerRadius="15"
|
|
||||||
Tag="https://github.com/Ryujinx/Ryujinx"
|
|
||||||
ToolTip.Tip="{locale:Locale AboutGithubUrlTooltipMessage}">
|
ToolTip.Tip="{locale:Locale AboutGithubUrlTooltipMessage}">
|
||||||
<Image Source="{Binding GithubLogo}" />
|
<Image Source="{Binding GithubLogo}" />
|
||||||
</Button>
|
</Button>
|
||||||
@ -162,32 +144,6 @@
|
|||||||
ToolTip.Tip="{locale:Locale AboutDiscordUrlTooltipMessage}">
|
ToolTip.Tip="{locale:Locale AboutDiscordUrlTooltipMessage}">
|
||||||
<Image Source="{Binding DiscordLogo}" />
|
<Image Source="{Binding DiscordLogo}" />
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
|
||||||
MinWidth="30"
|
|
||||||
MinHeight="30"
|
|
||||||
MaxWidth="30"
|
|
||||||
MaxHeight="30"
|
|
||||||
Padding="8"
|
|
||||||
Background="Transparent"
|
|
||||||
Click="Button_OnClick"
|
|
||||||
CornerRadius="15"
|
|
||||||
Tag="https://twitter.com/RyujinxEmu"
|
|
||||||
ToolTip.Tip="{locale:Locale AboutTwitterUrlTooltipMessage}">
|
|
||||||
<Image Source="{Binding TwitterLogo}" />
|
|
||||||
</Button>
|
|
||||||
<Button
|
|
||||||
MinWidth="30"
|
|
||||||
MinHeight="30"
|
|
||||||
MaxWidth="30"
|
|
||||||
MaxHeight="30"
|
|
||||||
Padding="8"
|
|
||||||
Background="Transparent"
|
|
||||||
Click="Button_OnClick"
|
|
||||||
CornerRadius="15"
|
|
||||||
Tag="https://www.ryujinx.org"
|
|
||||||
ToolTip.Tip="{locale:Locale AboutUrlTooltipMessage}">
|
|
||||||
<ui:SymbolIcon Foreground="{DynamicResource ThemeForegroundColor}" Symbol="Link" />
|
|
||||||
</Button>
|
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Grid>
|
</Grid>
|
||||||
@ -205,7 +161,6 @@
|
|||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<StackPanel
|
<StackPanel
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
@ -237,7 +192,7 @@
|
|||||||
HorizontalAlignment="Left"
|
HorizontalAlignment="Left"
|
||||||
Background="Transparent"
|
Background="Transparent"
|
||||||
Click="Button_OnClick"
|
Click="Button_OnClick"
|
||||||
Tag="https://github.com/Ryujinx/Ryujinx/graphs/contributors?type=a">
|
Tag="https://github.com/GreemDev/Ryujinx/graphs/contributors?type=a">
|
||||||
<TextBlock
|
<TextBlock
|
||||||
FontSize="10"
|
FontSize="10"
|
||||||
Text="{locale:Locale AboutRyujinxContributorsButtonHeader}"
|
Text="{locale:Locale AboutRyujinxContributorsButtonHeader}"
|
||||||
@ -245,26 +200,6 @@
|
|||||||
ToolTip.Tip="{locale:Locale AboutRyujinxMaintainersContentTooltipMessage}" />
|
ToolTip.Tip="{locale:Locale AboutRyujinxMaintainersContentTooltipMessage}" />
|
||||||
</Button>
|
</Button>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<StackPanel
|
|
||||||
Grid.Row="2"
|
|
||||||
Margin="0,10,0,0"
|
|
||||||
Spacing="2">
|
|
||||||
<TextBlock
|
|
||||||
FontSize="15"
|
|
||||||
FontWeight="Bold"
|
|
||||||
Text="{locale:Locale AboutRyujinxSupprtersTitle}" />
|
|
||||||
<ScrollViewer
|
|
||||||
Height="70"
|
|
||||||
HorizontalScrollBarVisibility="Disabled"
|
|
||||||
VerticalScrollBarVisibility="Visible">
|
|
||||||
<TextBlock
|
|
||||||
Name="SupportersTextBlock"
|
|
||||||
VerticalAlignment="Top"
|
|
||||||
FontSize="10"
|
|
||||||
Text="{Binding Supporters}"
|
|
||||||
TextWrapping="Wrap" />
|
|
||||||
</ScrollViewer>
|
|
||||||
</StackPanel>
|
|
||||||
</Grid>
|
</Grid>
|
||||||
</Grid>
|
</Grid>
|
||||||
</UserControl>
|
</UserControl>
|
||||||
|
@ -443,10 +443,7 @@ namespace Ryujinx.Ava.UI.Windows
|
|||||||
|
|
||||||
Initialize();
|
Initialize();
|
||||||
|
|
||||||
/// <summary>
|
PlatformSettings!.ColorValuesChanged += OnPlatformColorValuesChanged;
|
||||||
/// Subscribe to the ColorValuesChanged event
|
|
||||||
/// </summary>
|
|
||||||
PlatformSettings.ColorValuesChanged += OnPlatformColorValuesChanged;
|
|
||||||
|
|
||||||
ViewModel.Initialize(
|
ViewModel.Initialize(
|
||||||
ContentManager,
|
ContentManager,
|
||||||
@ -467,7 +464,7 @@ namespace Ryujinx.Ava.UI.Windows
|
|||||||
_appLibraryAppsSubscription?.Dispose();
|
_appLibraryAppsSubscription?.Dispose();
|
||||||
_appLibraryAppsSubscription = ApplicationLibrary.Applications
|
_appLibraryAppsSubscription = ApplicationLibrary.Applications
|
||||||
.Connect()
|
.Connect()
|
||||||
.ObserveOn(SynchronizationContext.Current)
|
.ObserveOn(SynchronizationContext.Current!)
|
||||||
.Bind(ViewModel.Applications)
|
.Bind(ViewModel.Applications)
|
||||||
.Subscribe();
|
.Subscribe();
|
||||||
|
|
||||||
@ -656,28 +653,20 @@ namespace Ryujinx.Ava.UI.Windows
|
|||||||
applicationLibraryThread.Start();
|
applicationLibraryThread.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task ShowNewContentAddedDialog(int numDlcAdded, int numUpdatesAdded)
|
private void ShowNewContentAddedDialog(int numDlcAdded, int numUpdatesAdded)
|
||||||
{
|
{
|
||||||
var msg = "";
|
string msg = numDlcAdded > 0 && numUpdatesAdded > 0
|
||||||
|
? string.Format(LocaleManager.Instance[LocaleKeys.AutoloadDlcAndUpdateAddedMessage], numDlcAdded, numUpdatesAdded)
|
||||||
|
: numDlcAdded > 0
|
||||||
|
? string.Format(LocaleManager.Instance[LocaleKeys.AutoloadDlcAddedMessage], numDlcAdded)
|
||||||
|
: numUpdatesAdded > 0
|
||||||
|
? string.Format(LocaleManager.Instance[LocaleKeys.AutoloadUpdateAddedMessage], numUpdatesAdded)
|
||||||
|
: null;
|
||||||
|
|
||||||
if (numDlcAdded > 0 && numUpdatesAdded > 0)
|
if (msg is null) return;
|
||||||
{
|
|
||||||
msg = string.Format(LocaleManager.Instance[LocaleKeys.AutoloadDlcAndUpdateAddedMessage], numDlcAdded, numUpdatesAdded);
|
|
||||||
}
|
|
||||||
else if (numDlcAdded > 0)
|
|
||||||
{
|
|
||||||
msg = string.Format(LocaleManager.Instance[LocaleKeys.AutoloadDlcAddedMessage], numDlcAdded);
|
|
||||||
}
|
|
||||||
else if (numUpdatesAdded > 0)
|
|
||||||
{
|
|
||||||
msg = string.Format(LocaleManager.Instance[LocaleKeys.AutoloadUpdateAddedMessage], numUpdatesAdded);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Dispatcher.UIThread.InvokeAsync(async () =>
|
Dispatcher.UIThread.InvokeAsync(async () =>
|
||||||
{
|
{
|
||||||
await ContentDialogHelper.ShowTextDialog(LocaleManager.Instance[LocaleKeys.DialogConfirmationTitle],
|
await ContentDialogHelper.ShowTextDialog(LocaleManager.Instance[LocaleKeys.DialogConfirmationTitle],
|
||||||
msg, "", "", "", LocaleManager.Instance[LocaleKeys.InputDialogOk], (int)Symbol.Checkmark);
|
msg, "", "", "", LocaleManager.Instance[LocaleKeys.InputDialogOk], (int)Symbol.Checkmark);
|
||||||
|
@ -17,9 +17,9 @@ namespace Ryujinx.Ava.UI.Windows
|
|||||||
public StyleableWindow()
|
public StyleableWindow()
|
||||||
{
|
{
|
||||||
WindowStartupLocation = WindowStartupLocation.CenterOwner;
|
WindowStartupLocation = WindowStartupLocation.CenterOwner;
|
||||||
TransparencyLevelHint = new[] { WindowTransparencyLevel.None };
|
TransparencyLevelHint = [WindowTransparencyLevel.None];
|
||||||
|
|
||||||
using Stream stream = Assembly.GetAssembly(typeof(ConfigurationState)).GetManifestResourceStream("Ryujinx.UI.Common.Resources.Logo_Ryujinx.png");
|
using Stream stream = Assembly.GetAssembly(typeof(ConfigurationState))!.GetManifestResourceStream("Ryujinx.UI.Common.Resources.Logo_Ryujinx.png")!;
|
||||||
|
|
||||||
Icon = new WindowIcon(stream);
|
Icon = new WindowIcon(stream);
|
||||||
stream.Position = 0;
|
stream.Position = 0;
|
||||||
|
Reference in New Issue
Block a user