Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
bb8c5ebae1 | ||
|
50bdda5baa | ||
|
18df25f66f | ||
|
e19e7622a3 | ||
|
26026d1357 | ||
|
24068b023c | ||
|
1217a8e69b | ||
|
732db7581f |
@@ -8,8 +8,8 @@
|
|||||||
<PackageVersion Include="Avalonia.Desktop" Version="11.0.10" />
|
<PackageVersion Include="Avalonia.Desktop" Version="11.0.10" />
|
||||||
<PackageVersion Include="Avalonia.Diagnostics" Version="11.0.10" />
|
<PackageVersion Include="Avalonia.Diagnostics" Version="11.0.10" />
|
||||||
<PackageVersion Include="Avalonia.Markup.Xaml.Loader" Version="11.0.10" />
|
<PackageVersion Include="Avalonia.Markup.Xaml.Loader" Version="11.0.10" />
|
||||||
<PackageVersion Include="Avalonia.Svg" Version="11.0.0.14" />
|
<PackageVersion Include="Avalonia.Svg" Version="11.0.0.16" />
|
||||||
<PackageVersion Include="Avalonia.Svg.Skia" Version="11.0.0.14" />
|
<PackageVersion Include="Avalonia.Svg.Skia" Version="11.0.0.16" />
|
||||||
<PackageVersion Include="CommandLineParser" Version="2.9.1" />
|
<PackageVersion Include="CommandLineParser" Version="2.9.1" />
|
||||||
<PackageVersion Include="Concentus" Version="1.1.7" />
|
<PackageVersion Include="Concentus" Version="1.1.7" />
|
||||||
<PackageVersion Include="DiscordRichPresence" Version="1.2.1.24" />
|
<PackageVersion Include="DiscordRichPresence" Version="1.2.1.24" />
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
<PackageVersion Include="LibHac" Version="0.19.0" />
|
<PackageVersion Include="LibHac" Version="0.19.0" />
|
||||||
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" />
|
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" />
|
||||||
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.8.0" />
|
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.8.0" />
|
||||||
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="7.3.0" />
|
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="7.4.0" />
|
||||||
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
|
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
|
||||||
<PackageVersion Include="Microsoft.IO.RecyclableMemoryStream" Version="3.0.0" />
|
<PackageVersion Include="Microsoft.IO.RecyclableMemoryStream" Version="3.0.0" />
|
||||||
<PackageVersion Include="MsgPack.Cli" Version="1.0.1" />
|
<PackageVersion Include="MsgPack.Cli" Version="1.0.1" />
|
||||||
|
@@ -343,11 +343,22 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
|
|||||||
|
|
||||||
bool unalignedChanged = _currentSpecState.SetHasUnalignedStorageBuffer(_channel.BufferManager.HasUnalignedStorageBuffers);
|
bool unalignedChanged = _currentSpecState.SetHasUnalignedStorageBuffer(_channel.BufferManager.HasUnalignedStorageBuffers);
|
||||||
|
|
||||||
if (!_channel.TextureManager.CommitGraphicsBindings(_shaderSpecState) || unalignedChanged)
|
bool scaleMismatch;
|
||||||
|
do
|
||||||
{
|
{
|
||||||
// Shader must be reloaded. _vtgWritesRtLayer should not change.
|
if (!_channel.TextureManager.CommitGraphicsBindings(_shaderSpecState, out scaleMismatch) || unalignedChanged)
|
||||||
UpdateShaderState();
|
{
|
||||||
|
// Shader must be reloaded. _vtgWritesRtLayer should not change.
|
||||||
|
UpdateShaderState();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scaleMismatch)
|
||||||
|
{
|
||||||
|
// Binding textures changed scale of the bound render targets, correct the render target scale and rebind.
|
||||||
|
UpdateRenderTargetState();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
while (scaleMismatch);
|
||||||
|
|
||||||
_channel.BufferManager.CommitGraphicsBindings(_drawState.DrawIndexed);
|
_channel.BufferManager.CommitGraphicsBindings(_drawState.DrawIndexed);
|
||||||
}
|
}
|
||||||
|
@@ -360,15 +360,16 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
/// Commits bindings on the graphics pipeline.
|
/// Commits bindings on the graphics pipeline.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="specState">Specialization state for the bound shader</param>
|
/// <param name="specState">Specialization state for the bound shader</param>
|
||||||
|
/// <param name="scaleMismatch">True if there is a scale mismatch in the render targets, indicating they must be re-evaluated</param>
|
||||||
/// <returns>True if all bound textures match the current shader specialization state, false otherwise</returns>
|
/// <returns>True if all bound textures match the current shader specialization state, false otherwise</returns>
|
||||||
public bool CommitGraphicsBindings(ShaderSpecializationState specState)
|
public bool CommitGraphicsBindings(ShaderSpecializationState specState, out bool scaleMismatch)
|
||||||
{
|
{
|
||||||
_texturePoolCache.Tick();
|
_texturePoolCache.Tick();
|
||||||
_samplerPoolCache.Tick();
|
_samplerPoolCache.Tick();
|
||||||
|
|
||||||
bool result = _gpBindingsManager.CommitBindings(specState);
|
bool result = _gpBindingsManager.CommitBindings(specState);
|
||||||
|
|
||||||
UpdateRenderTargets();
|
scaleMismatch = UpdateRenderTargets();
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -426,9 +427,12 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Update host framebuffer attachments based on currently bound render target buffers.
|
/// Update host framebuffer attachments based on currently bound render target buffers.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void UpdateRenderTargets()
|
/// <returns>True if there is a scale mismatch in the render targets, indicating they must be re-evaluated</returns>
|
||||||
|
public bool UpdateRenderTargets()
|
||||||
{
|
{
|
||||||
bool anyChanged = false;
|
bool anyChanged = false;
|
||||||
|
float expectedScale = RenderTargetScale;
|
||||||
|
bool scaleMismatch = false;
|
||||||
|
|
||||||
Texture dsTexture = _rtDepthStencil;
|
Texture dsTexture = _rtDepthStencil;
|
||||||
ITexture hostDsTexture = null;
|
ITexture hostDsTexture = null;
|
||||||
@@ -448,6 +452,11 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
{
|
{
|
||||||
_rtHostDs = hostDsTexture;
|
_rtHostDs = hostDsTexture;
|
||||||
anyChanged = true;
|
anyChanged = true;
|
||||||
|
|
||||||
|
if (dsTexture != null && dsTexture.ScaleFactor != expectedScale)
|
||||||
|
{
|
||||||
|
scaleMismatch = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int index = 0; index < _rtColors.Length; index++)
|
for (int index = 0; index < _rtColors.Length; index++)
|
||||||
@@ -470,6 +479,11 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
{
|
{
|
||||||
_rtHostColors[index] = hostTexture;
|
_rtHostColors[index] = hostTexture;
|
||||||
anyChanged = true;
|
anyChanged = true;
|
||||||
|
|
||||||
|
if (texture != null && texture.ScaleFactor != expectedScale)
|
||||||
|
{
|
||||||
|
scaleMismatch = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -477,6 +491,8 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
{
|
{
|
||||||
_context.Renderer.Pipeline.SetRenderTargets(_rtHostColors, _rtHostDs);
|
_context.Renderer.Pipeline.SetRenderTargets(_rtHostColors, _rtHostDs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return scaleMismatch;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@@ -173,7 +173,7 @@ namespace Ryujinx.Graphics.Gpu.Memory
|
|||||||
|
|
||||||
ShrinkOverlapsBufferIfNeeded();
|
ShrinkOverlapsBufferIfNeeded();
|
||||||
|
|
||||||
// If the the range is not properly aligned for sparse mapping,
|
// If the range is not properly aligned for sparse mapping,
|
||||||
// let's just force it to a single range.
|
// let's just force it to a single range.
|
||||||
// This might cause issues in some applications that uses sparse
|
// This might cause issues in some applications that uses sparse
|
||||||
// mappings.
|
// mappings.
|
||||||
|
@@ -322,7 +322,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations
|
|||||||
Operand lhs = operation.GetSource(0);
|
Operand lhs = operation.GetSource(0);
|
||||||
Operand rhs = operation.GetSource(1);
|
Operand rhs = operation.GetSource(1);
|
||||||
|
|
||||||
// Check LHS of the the main multiplication operation. We expect an input being multiplied by gl_FragCoord.w.
|
// Check LHS of the main multiplication operation. We expect an input being multiplied by gl_FragCoord.w.
|
||||||
if (lhs.AsgOp is not Operation attrMulOp || attrMulOp.Inst != (Instruction.FP32 | Instruction.Multiply))
|
if (lhs.AsgOp is not Operation attrMulOp || attrMulOp.Inst != (Instruction.FP32 | Instruction.Multiply))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
@@ -136,7 +136,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||||||
{
|
{
|
||||||
instance.EnumeratePhysicalDevices(out var physicalDevices).ThrowOnError();
|
instance.EnumeratePhysicalDevices(out var physicalDevices).ThrowOnError();
|
||||||
|
|
||||||
// First we try to pick the the user preferred GPU.
|
// First we try to pick the user preferred GPU.
|
||||||
for (int i = 0; i < physicalDevices.Length; i++)
|
for (int i = 0; i < physicalDevices.Length; i++)
|
||||||
{
|
{
|
||||||
if (IsPreferredAndSuitableDevice(api, physicalDevices[i], surface, preferredGpuId))
|
if (IsPreferredAndSuitableDevice(api, physicalDevices[i], surface, preferredGpuId))
|
||||||
|
@@ -781,7 +781,9 @@ namespace Ryujinx.Graphics.Vulkan
|
|||||||
{
|
{
|
||||||
PrimitiveTopology.Quads => PrimitiveTopology.Triangles,
|
PrimitiveTopology.Quads => PrimitiveTopology.Triangles,
|
||||||
PrimitiveTopology.QuadStrip => PrimitiveTopology.TriangleStrip,
|
PrimitiveTopology.QuadStrip => PrimitiveTopology.TriangleStrip,
|
||||||
PrimitiveTopology.TriangleFan => Capabilities.PortabilitySubset.HasFlag(PortabilitySubsetFlags.NoTriangleFans) ? PrimitiveTopology.Triangles : topology,
|
PrimitiveTopology.TriangleFan or PrimitiveTopology.Polygon => Capabilities.PortabilitySubset.HasFlag(PortabilitySubsetFlags.NoTriangleFans)
|
||||||
|
? PrimitiveTopology.Triangles
|
||||||
|
: topology,
|
||||||
_ => topology,
|
_ => topology,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -791,7 +793,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||||||
return topology switch
|
return topology switch
|
||||||
{
|
{
|
||||||
PrimitiveTopology.Quads => true,
|
PrimitiveTopology.Quads => true,
|
||||||
PrimitiveTopology.TriangleFan => Capabilities.PortabilitySubset.HasFlag(PortabilitySubsetFlags.NoTriangleFans),
|
PrimitiveTopology.TriangleFan or PrimitiveTopology.Polygon => Capabilities.PortabilitySubset.HasFlag(PortabilitySubsetFlags.NoTriangleFans),
|
||||||
_ => false,
|
_ => false,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@@ -466,7 +466,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
|
|||||||
|
|
||||||
private void DrawPadButton(IImageProcessingContext context, PointF point, Image icon, string label, bool pressed, bool enabled)
|
private void DrawPadButton(IImageProcessingContext context, PointF point, Image icon, string label, bool pressed, bool enabled)
|
||||||
{
|
{
|
||||||
// Use relative positions so we can center the the entire drawing later.
|
// Use relative positions so we can center the entire drawing later.
|
||||||
|
|
||||||
float iconX = 0;
|
float iconX = 0;
|
||||||
float iconY = 0;
|
float iconY = 0;
|
||||||
@@ -522,7 +522,7 @@ namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
|
|||||||
{
|
{
|
||||||
var labelRectangle = MeasureString(ControllerToggleText, _labelsTextFont);
|
var labelRectangle = MeasureString(ControllerToggleText, _labelsTextFont);
|
||||||
|
|
||||||
// Use relative positions so we can center the the entire drawing later.
|
// Use relative positions so we can center the entire drawing later.
|
||||||
|
|
||||||
float keyWidth = _keyModeIcon.Width;
|
float keyWidth = _keyModeIcon.Width;
|
||||||
float keyHeight = _keyModeIcon.Height;
|
float keyHeight = _keyModeIcon.Height;
|
||||||
|
@@ -174,7 +174,7 @@ namespace Ryujinx.Memory
|
|||||||
/// <param name="offset">Starting offset of the range being read</param>
|
/// <param name="offset">Starting offset of the range being read</param>
|
||||||
/// <param name="data">Span where the bytes being read will be copied to</param>
|
/// <param name="data">Span where the bytes being read will be copied to</param>
|
||||||
/// <exception cref="ObjectDisposedException">Throw when the memory block has already been disposed</exception>
|
/// <exception cref="ObjectDisposedException">Throw when the memory block has already been disposed</exception>
|
||||||
/// <exception cref="InvalidMemoryRegionException">Throw when the memory region specified for the the data is out of range</exception>
|
/// <exception cref="InvalidMemoryRegionException">Throw when the memory region specified for the data is out of range</exception>
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
public void Read(ulong offset, Span<byte> data)
|
public void Read(ulong offset, Span<byte> data)
|
||||||
{
|
{
|
||||||
@@ -188,7 +188,7 @@ namespace Ryujinx.Memory
|
|||||||
/// <param name="offset">Offset where the data is located</param>
|
/// <param name="offset">Offset where the data is located</param>
|
||||||
/// <returns>Data at the specified address</returns>
|
/// <returns>Data at the specified address</returns>
|
||||||
/// <exception cref="ObjectDisposedException">Throw when the memory block has already been disposed</exception>
|
/// <exception cref="ObjectDisposedException">Throw when the memory block has already been disposed</exception>
|
||||||
/// <exception cref="InvalidMemoryRegionException">Throw when the memory region specified for the the data is out of range</exception>
|
/// <exception cref="InvalidMemoryRegionException">Throw when the memory region specified for the data is out of range</exception>
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
public T Read<T>(ulong offset) where T : unmanaged
|
public T Read<T>(ulong offset) where T : unmanaged
|
||||||
{
|
{
|
||||||
@@ -201,7 +201,7 @@ namespace Ryujinx.Memory
|
|||||||
/// <param name="offset">Starting offset of the range being written</param>
|
/// <param name="offset">Starting offset of the range being written</param>
|
||||||
/// <param name="data">Span where the bytes being written will be copied from</param>
|
/// <param name="data">Span where the bytes being written will be copied from</param>
|
||||||
/// <exception cref="ObjectDisposedException">Throw when the memory block has already been disposed</exception>
|
/// <exception cref="ObjectDisposedException">Throw when the memory block has already been disposed</exception>
|
||||||
/// <exception cref="InvalidMemoryRegionException">Throw when the memory region specified for the the data is out of range</exception>
|
/// <exception cref="InvalidMemoryRegionException">Throw when the memory region specified for the data is out of range</exception>
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
public void Write(ulong offset, ReadOnlySpan<byte> data)
|
public void Write(ulong offset, ReadOnlySpan<byte> data)
|
||||||
{
|
{
|
||||||
@@ -215,7 +215,7 @@ namespace Ryujinx.Memory
|
|||||||
/// <param name="offset">Offset to write the data into</param>
|
/// <param name="offset">Offset to write the data into</param>
|
||||||
/// <param name="data">Data to be written</param>
|
/// <param name="data">Data to be written</param>
|
||||||
/// <exception cref="ObjectDisposedException">Throw when the memory block has already been disposed</exception>
|
/// <exception cref="ObjectDisposedException">Throw when the memory block has already been disposed</exception>
|
||||||
/// <exception cref="InvalidMemoryRegionException">Throw when the memory region specified for the the data is out of range</exception>
|
/// <exception cref="InvalidMemoryRegionException">Throw when the memory region specified for the data is out of range</exception>
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
public void Write<T>(ulong offset, T data) where T : unmanaged
|
public void Write<T>(ulong offset, T data) where T : unmanaged
|
||||||
{
|
{
|
||||||
|
@@ -7,7 +7,7 @@ namespace Ryujinx.UI.Common
|
|||||||
public static class DiscordIntegrationModule
|
public static class DiscordIntegrationModule
|
||||||
{
|
{
|
||||||
private const string Description = "A simple, experimental Nintendo Switch emulator.";
|
private const string Description = "A simple, experimental Nintendo Switch emulator.";
|
||||||
private const string CliendId = "568815339807309834";
|
private const string ApplicationId = "1216775165866807456";
|
||||||
|
|
||||||
private static DiscordRpcClient _discordClient;
|
private static DiscordRpcClient _discordClient;
|
||||||
private static RichPresence _discordPresenceMain;
|
private static RichPresence _discordPresenceMain;
|
||||||
@@ -24,14 +24,14 @@ namespace Ryujinx.UI.Common
|
|||||||
Details = "Main Menu",
|
Details = "Main Menu",
|
||||||
State = "Idling",
|
State = "Idling",
|
||||||
Timestamps = Timestamps.Now,
|
Timestamps = Timestamps.Now,
|
||||||
Buttons = new[]
|
Buttons =
|
||||||
{
|
[
|
||||||
new Button
|
new Button
|
||||||
{
|
{
|
||||||
Label = "Website",
|
Label = "Website",
|
||||||
Url = "https://ryujinx.org/",
|
Url = "https://ryujinx.org/",
|
||||||
},
|
},
|
||||||
},
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
ConfigurationState.Instance.EnableDiscordIntegration.Event += Update;
|
ConfigurationState.Instance.EnableDiscordIntegration.Event += Update;
|
||||||
@@ -52,7 +52,7 @@ namespace Ryujinx.UI.Common
|
|||||||
// If we need to activate it and the client isn't active, initialize it
|
// If we need to activate it and the client isn't active, initialize it
|
||||||
if (evnt.NewValue && _discordClient == null)
|
if (evnt.NewValue && _discordClient == null)
|
||||||
{
|
{
|
||||||
_discordClient = new DiscordRpcClient(CliendId);
|
_discordClient = new DiscordRpcClient(ApplicationId);
|
||||||
|
|
||||||
_discordClient.Initialize();
|
_discordClient.Initialize();
|
||||||
_discordClient.SetPresence(_discordPresenceMain);
|
_discordClient.SetPresence(_discordPresenceMain);
|
||||||
@@ -74,14 +74,14 @@ namespace Ryujinx.UI.Common
|
|||||||
Details = $"Playing {titleName}",
|
Details = $"Playing {titleName}",
|
||||||
State = (titleId == "0000000000000000") ? "Homebrew" : titleId.ToUpper(),
|
State = (titleId == "0000000000000000") ? "Homebrew" : titleId.ToUpper(),
|
||||||
Timestamps = Timestamps.Now,
|
Timestamps = Timestamps.Now,
|
||||||
Buttons = new[]
|
Buttons =
|
||||||
{
|
[
|
||||||
new Button
|
new Button
|
||||||
{
|
{
|
||||||
Label = "Website",
|
Label = "Website",
|
||||||
Url = "https://ryujinx.org/",
|
Url = "https://ryujinx.org/",
|
||||||
},
|
},
|
||||||
},
|
],
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -9,7 +9,6 @@ namespace Ryujinx.Ava.UI.Windows
|
|||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
ExtendClientAreaToDecorationsHint = true;
|
|
||||||
TransparencyLevelHint = new[] { WindowTransparencyLevel.Transparent };
|
TransparencyLevelHint = new[] { WindowTransparencyLevel.Transparent };
|
||||||
WindowStartupLocation = WindowStartupLocation.Manual;
|
WindowStartupLocation = WindowStartupLocation.Manual;
|
||||||
SystemDecorations = SystemDecorations.None;
|
SystemDecorations = SystemDecorations.None;
|
||||||
|
@@ -47,7 +47,7 @@ namespace Ryujinx.Ava.UI.Windows
|
|||||||
|
|
||||||
contentDialog.Styles.Add(bottomBorder);
|
contentDialog.Styles.Add(bottomBorder);
|
||||||
|
|
||||||
await ContentDialogHelper.ShowAsync(contentDialog);
|
await contentDialog.ShowAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SaveAndClose(object sender, RoutedEventArgs routedEventArgs)
|
private void SaveAndClose(object sender, RoutedEventArgs routedEventArgs)
|
||||||
|
@@ -1,4 +1,6 @@
|
|||||||
|
using Avalonia;
|
||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Controls.ApplicationLifetimes;
|
||||||
using Avalonia.Interactivity;
|
using Avalonia.Interactivity;
|
||||||
using Avalonia.Styling;
|
using Avalonia.Styling;
|
||||||
using FluentAvalonia.UI.Controls;
|
using FluentAvalonia.UI.Controls;
|
||||||
@@ -47,7 +49,7 @@ namespace Ryujinx.Ava.UI.Windows
|
|||||||
|
|
||||||
contentDialog.Styles.Add(bottomBorder);
|
contentDialog.Styles.Add(bottomBorder);
|
||||||
|
|
||||||
await ContentDialogHelper.ShowAsync(contentDialog);
|
await contentDialog.ShowAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Close(object sender, RoutedEventArgs e)
|
private void Close(object sender, RoutedEventArgs e)
|
||||||
@@ -59,9 +61,15 @@ namespace Ryujinx.Ava.UI.Windows
|
|||||||
{
|
{
|
||||||
ViewModel.Save();
|
ViewModel.Save();
|
||||||
|
|
||||||
if (VisualRoot is MainWindow window)
|
if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime al)
|
||||||
{
|
{
|
||||||
window.LoadApplications();
|
foreach (Window window in al.Windows)
|
||||||
|
{
|
||||||
|
if (window is MainWindow mainWindow)
|
||||||
|
{
|
||||||
|
mainWindow.LoadApplications();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
((ContentDialog)Parent).Hide();
|
((ContentDialog)Parent).Hide();
|
||||||
|
Reference in New Issue
Block a user