7b2225c6b0
* It builds (Doesn’t run waiting on FluentAvalonia Preview 5 Release) * Enable CompiledBindings by default * Ignore `PointerPressedEventArgs` Init warning * Define MIME and UTI Types * Update `UserProfileImageSelectorView` to StorageProvider API * PFS0 Magic * Update `MainWindowViewModel` to StorageProvider API * Update `SettingsUIView` to StorageProvider API * Update `ApplicationHelper` to StorageProvider API * Use `IsCheckChanged` * Rename events * Update Fluent Avalonia to Preivew 5 * More package updates * Fix long selection bar * return glyph value directly, instead of using a binding * fix menu item checkboxes * Fix build * Update to Preview 6 Unicorn conflict Fix remaining package oopsie * Fix issues from merge * Fix some warnings * Warnings * Squashed commit of the following: commit79d1c190db
Author: Mary <mary@mary.zone> Date: Sun Apr 16 11:38:07 2023 +0200 chore: Update Silk.NET to 2.17.1 (#4686) commit2bc88467eb
Author: Ac_K <Acoustik666@gmail.com> Date: Sun Apr 16 09:37:31 2023 +0000 Update README.md commitbaf8752e74
Author: Vincenzo Nizza <vincenzonizzaufficio@gmail.com> Date: Sun Apr 16 11:19:33 2023 +0200 Ensure the updater doesn't delete hidden or system files (#4626) * Copy desktop.ini to update directory if it exists in HomeDir * EnumerateFilesToDelete() exclude files with "Hidden" and "System" attributes commitd5e4378aea
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun Apr 16 09:02:06 2023 +0000 nuget: bump DynamicData from 7.13.1 to 7.13.5 (#4654) Bumps [DynamicData](https://github.com/reactiveui/DynamicData) from 7.13.1 to 7.13.5. - [Release notes](https://github.com/reactiveui/DynamicData/releases) - [Changelog](https://github.com/reactivemarbles/DynamicData/blob/main/ReleaseNotes.md) - [Commits](https://github.com/reactiveui/DynamicData/compare/7.13.1...7.13.5) --- updated-dependencies: - dependency-name: DynamicData dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit6dbcdfea47
Author: TSRBerry <20988865+TSRBerry@users.noreply.github.com> Date: Sun Apr 16 09:09:02 2023 +0200 Ava: Fix nca extraction window never closing & minor cleanup (#4569) * ava: Remove unused doWhileDeferred parameters * ava: Minimally improve swkbd dialog It's currently impossible to get the dialog to redirect focus to the InputBox. * ava: Fix nca extraction dialog never closing Also contains some minor cleanup commitc5258cf082
Author: NitroTears <73270647+NitroTears@users.noreply.github.com> Date: Sun Apr 16 11:03:35 2023 +1000 Ability to hide file types in Game List (#4555) * Added HiddenFileTypes to config state, and check to file enumeration * Added hiddenfiletypes checkboxes to the UI * Added Ava version of HiddenFileTypes * Inverted Hide to Show with file types, minor formatting * all variables with a reference to 'hidden' is now 'shown' * one more variable name changed * review feedback * added FileTypes extension methof to get the correlating config value * moved extension method to new folder and file in Ryujinx.Ui.Common * added default case for ToggleFileType * changed exception type to OutOfRangeException commit5c89e22bb9
Author: Daniel Shala <daniel.shala08@gmail.com> Date: Sat Apr 15 18:11:24 2023 +0200 Added check for eventual symlink when displaying game files. (#4526) * Added check for eventual symlink when displaying game files. * Moved symlink check logic * Moved symlink check logic * Fixed prev commit --------- Co-authored-by: Daniel Shala <danielshala00@gmail.com> commit11ecff2ff0
Author: Alex Barney <thealexbarney@gmail.com> Date: Fri Apr 14 16:00:34 2023 -0700 Rename Hipc to Cmif where appropriate (#3880) commit4c3f09644a
Author: MutantAura <44103205+MutantAura@users.noreply.github.com> Date: Wed Apr 12 20:18:40 2023 +0100 Move swkbd message null check into constructor (#4671) commite187a8870a
Author: TSRBerry <20988865+TSRBerry@users.noreply.github.com> Date: Wed Apr 12 03:09:47 2023 +0200 HLE: Deal with empty title names properly (#4643) * hle: Deal with empty titleNames in some languages * gui: Fix displaying the wrong title name * Remove unnecessary bounds check * Fix a NRE when getting the version string * Restore empty string logic commita64fee29dc
Author: riperiperi <rhy3756547@hotmail.com> Date: Tue Apr 11 08:23:41 2023 +0100 Vulkan: add situational "Fast Flush" mode (#4667) * Flush in the middle of long command buffers. * Vulkan: add situational "Fast Flush" mode The AutoFlushCounter class was added to periodically flush Vulkan command buffers throughout a frame, which reduces latency to the GPU as commands are submitted and processed much sooner. This was done by allowing command buffers to flush when framebuffer attachments changed. However, some games have incredibly long render passes with a large number of draws, and really aggressive data access that forces GPU sync. The Vulkan backend could potentially end up building a single command buffer for 4-5ms if a pass has enough draws, such as in BOTW. In the scenario where sync is waited on immediately after submission, this would have to wait for the completion of a much longer command buffer than usual. The solution is to force command buffer submission periodically in a "fast flush" mode. This will end up splitting render passes, but it will only enable if sync is aggressive enough. This should improve performance in GPU limited scenarios, or in games that aggressively wait on synchronization. In some games, it may only kick in when res scaling. It won't trigger in games like SMO where sync is not an issue. Improves performance in Pokemon Scarlet/Violet (res scaled) and BOTW (in general). * Add conversions in milliseconds next to flush timers. commit9ef94c8292
Author: riperiperi <rhy3756547@hotmail.com> Date: Tue Apr 11 07:55:04 2023 +0100 ARMeilleure: Move TPIDR_EL0 and TPIDRRO_EL0 to NativeContext (#4661) * ARMeilleure: Move TPIDR_EL0 and TPIDRRO_EL0 to NativeContext Some games access these system registers several tens of thousands of times in a second from many different threads. While this isn't really crippling, it is a lot of wasted time spent in a reverse pinvoke transition. Example games are Pokemon Scarlet/Violet and BOTW. These games have a lot of different potential bottlenecks so it's unlikely you will see a consistent improvement, but it definitely disappears from the cpu profile. * Remove unreachable code. * Add ulong conversion for offsets * Nit commit915d6d044c
Author: riperiperi <rhy3756547@hotmail.com> Date: Tue Apr 11 07:32:31 2023 +0100 OpenGL: Fix OBS/Overlays again by binding FB before present (#4668) This seems to have been removed by the Post-Processing PR, but it is required for the display in OBS to be the right way up and properly scaled. I've tested this with AA and FSR on MK8D and it seems to behave properly. Testing is welcome. commita4780ab33b
Author: MutantAura <44103205+MutantAura@users.noreply.github.com> Date: Mon Apr 10 23:04:31 2023 +0100 Force activate parent window before dialog is shown (#4663) * Fix build Extraction dialogue not working * Avalonia Preview 7 Needs Fluent Avalonia update still… * Fix Render Scaling * Update Fluent Avalonia * Remove `pfs0` as runnable file type * Restore Info.plist formatting * Plist Format * Update Avalonia.Svg.Skia * Update theme code (TODO) * swtich to using theme variants for light dark * Fix crashes * Text centering issues * Update `TitleUpdateViewModel` to StorageProvider API * Fixed for new PR (Will crash on launch) * Fixes… * UI: Fix sections extraction (#4820) * UI: Fix sections extraction There is currently an issue when the update NCA doesn't contains the section we want to extract, this is fixed by adding a check. I have fixed the inverted handler of ExeFs/Logo introduced in #4755. Fixes #4521 * Addresses feedback * Fix issues… * Preview 8 * Fix fuck ups * Fixes * More cleanup * Ava 11 RC Maybe there is a god * Update FluentAvalonia * update svg * Second RC (kill me) * It builds * Ava 11 * Remove unnecessary usings * Fix build * Formatting * GAS GAS GAS!!!! * Fix DLC Window Crash * Linux runner try not to crash challenge (impossible) * Add app.manifest * Fix accidental Silk.NET.Vulkan bump * Try fix truncation * Linux fix popup Windows * Fix cutoff text on windows * Status bar styling fixes * Volume Toggle Split Button Fixes * Fix load bar color * Fix shortcuts * Best we're gonna get * Fix spacing Co-authored-by: Exhigh <exhigh01@gmail.com> * Formatting * Fix Profile Dropdown * Fix Window Startup Position * Format Fixes * Fix stupid mistake * Fix accidental change * Scaling Handler (peri pls make sure is working) * Remove Locale Reflection Binding Use + Unsued Usings * Fix formatting Code styling Ughhhh Fix interface Make TimeZoneConverter internal * Remove bell workaround (no longer needed) * Disable accent menu * Update to Ava 11.0.2 * Peri suggestions * Formatting * Cleanup a bunch of jank * Dependency update * Berry fixes and suggestions * Final suggestions * Rename assemblyIdentity to Ryujinx.Emulator.Avalonia --------- Co-authored-by: Emmanuel Hansen <emmausssss@gmail.com> Co-authored-by: Ac_K <Acoustik666@gmail.com> Co-authored-by: Exhigh <exhigh01@gmail.com> Co-authored-by: TSR Berry <20988865+TSRBerry@users.noreply.github.com>
294 lines
11 KiB
C#
294 lines
11 KiB
C#
using Avalonia;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Input;
|
|
using Avalonia.Platform;
|
|
using Ryujinx.Common.Configuration;
|
|
using Ryujinx.Ui.Common.Configuration;
|
|
using Ryujinx.Ui.Common.Helper;
|
|
using SPB.Graphics;
|
|
using SPB.Platform;
|
|
using SPB.Platform.GLX;
|
|
using SPB.Platform.X11;
|
|
using SPB.Windowing;
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
using System.Runtime.Versioning;
|
|
using System.Threading.Tasks;
|
|
using static Ryujinx.Ava.UI.Helpers.Win32NativeInterop;
|
|
|
|
namespace Ryujinx.Ava.UI.Renderer
|
|
{
|
|
public class EmbeddedWindow : NativeControlHost
|
|
{
|
|
private WindowProc _wndProcDelegate;
|
|
private string _className;
|
|
|
|
protected GLXWindow X11Window { get; set; }
|
|
|
|
protected IntPtr WindowHandle { get; set; }
|
|
protected IntPtr X11Display { get; set; }
|
|
protected IntPtr NsView { get; set; }
|
|
protected IntPtr MetalLayer { get; set; }
|
|
|
|
public delegate void UpdateBoundsCallbackDelegate(Rect rect);
|
|
private UpdateBoundsCallbackDelegate _updateBoundsCallback;
|
|
|
|
public event EventHandler<IntPtr> WindowCreated;
|
|
public event EventHandler<Size> BoundsChanged;
|
|
|
|
public EmbeddedWindow()
|
|
{
|
|
this.GetObservable(BoundsProperty).Subscribe(StateChanged);
|
|
|
|
Initialized += OnNativeEmbeddedWindowCreated;
|
|
}
|
|
|
|
public virtual void OnWindowCreated() { }
|
|
|
|
protected virtual void OnWindowDestroyed() { }
|
|
|
|
protected virtual void OnWindowDestroying()
|
|
{
|
|
WindowHandle = IntPtr.Zero;
|
|
X11Display = IntPtr.Zero;
|
|
NsView = IntPtr.Zero;
|
|
MetalLayer = IntPtr.Zero;
|
|
}
|
|
|
|
private void OnNativeEmbeddedWindowCreated(object sender, EventArgs e)
|
|
{
|
|
OnWindowCreated();
|
|
|
|
Task.Run(() =>
|
|
{
|
|
WindowCreated?.Invoke(this, WindowHandle);
|
|
});
|
|
}
|
|
|
|
private void StateChanged(Rect rect)
|
|
{
|
|
BoundsChanged?.Invoke(this, rect.Size);
|
|
_updateBoundsCallback?.Invoke(rect);
|
|
}
|
|
|
|
protected override IPlatformHandle CreateNativeControlCore(IPlatformHandle control)
|
|
{
|
|
if (OperatingSystem.IsLinux())
|
|
{
|
|
return CreateLinux(control);
|
|
}
|
|
|
|
if (OperatingSystem.IsWindows())
|
|
{
|
|
return CreateWin32(control);
|
|
}
|
|
|
|
if (OperatingSystem.IsMacOS())
|
|
{
|
|
return CreateMacOS();
|
|
}
|
|
|
|
return base.CreateNativeControlCore(control);
|
|
}
|
|
|
|
protected override void DestroyNativeControlCore(IPlatformHandle control)
|
|
{
|
|
OnWindowDestroying();
|
|
|
|
if (OperatingSystem.IsLinux())
|
|
{
|
|
DestroyLinux();
|
|
}
|
|
else if (OperatingSystem.IsWindows())
|
|
{
|
|
DestroyWin32(control);
|
|
}
|
|
else if (OperatingSystem.IsMacOS())
|
|
{
|
|
DestroyMacOS();
|
|
}
|
|
else
|
|
{
|
|
base.DestroyNativeControlCore(control);
|
|
}
|
|
|
|
OnWindowDestroyed();
|
|
}
|
|
|
|
[SupportedOSPlatform("linux")]
|
|
private IPlatformHandle CreateLinux(IPlatformHandle control)
|
|
{
|
|
if (ConfigurationState.Instance.Graphics.GraphicsBackend.Value == GraphicsBackend.Vulkan)
|
|
{
|
|
X11Window = new GLXWindow(new NativeHandle(X11.DefaultDisplay), new NativeHandle(control.Handle));
|
|
X11Window.Hide();
|
|
}
|
|
else
|
|
{
|
|
X11Window = PlatformHelper.CreateOpenGLWindow(new FramebufferFormat(new ColorFormat(8, 8, 8, 0), 16, 0, ColorFormat.Zero, 0, 2, false), 0, 0, 100, 100) as GLXWindow;
|
|
}
|
|
|
|
WindowHandle = X11Window.WindowHandle.RawHandle;
|
|
X11Display = X11Window.DisplayHandle.RawHandle;
|
|
|
|
return new PlatformHandle(WindowHandle, "X11");
|
|
}
|
|
|
|
[SupportedOSPlatform("windows")]
|
|
IPlatformHandle CreateWin32(IPlatformHandle control)
|
|
{
|
|
_className = "NativeWindow-" + Guid.NewGuid();
|
|
|
|
_wndProcDelegate = delegate (IntPtr hWnd, WindowsMessages msg, IntPtr wParam, IntPtr lParam)
|
|
{
|
|
if (VisualRoot != null)
|
|
{
|
|
if (msg == WindowsMessages.Lbuttondown ||
|
|
msg == WindowsMessages.Rbuttondown ||
|
|
msg == WindowsMessages.Lbuttonup ||
|
|
msg == WindowsMessages.Rbuttonup ||
|
|
msg == WindowsMessages.Mousemove)
|
|
{
|
|
Point rootVisualPosition = this.TranslatePoint(new Point((long)lParam & 0xFFFF, (long)lParam >> 16 & 0xFFFF), this).Value;
|
|
Pointer pointer = new(0, PointerType.Mouse, true);
|
|
|
|
#pragma warning disable CS0618 // Type or member is obsolete (As of Avalonia 11, the constructors for PointerPressedEventArgs & PointerEventArgs are marked as obsolete)
|
|
switch (msg)
|
|
{
|
|
case WindowsMessages.Lbuttondown:
|
|
case WindowsMessages.Rbuttondown:
|
|
{
|
|
bool isLeft = msg == WindowsMessages.Lbuttondown;
|
|
RawInputModifiers pointerPointModifier = isLeft ? RawInputModifiers.LeftMouseButton : RawInputModifiers.RightMouseButton;
|
|
PointerPointProperties properties = new(pointerPointModifier, isLeft ? PointerUpdateKind.LeftButtonPressed : PointerUpdateKind.RightButtonPressed);
|
|
|
|
var evnt = new PointerPressedEventArgs(
|
|
this,
|
|
pointer,
|
|
this,
|
|
rootVisualPosition,
|
|
(ulong)Environment.TickCount64,
|
|
properties,
|
|
KeyModifiers.None);
|
|
|
|
RaiseEvent(evnt);
|
|
|
|
break;
|
|
}
|
|
case WindowsMessages.Lbuttonup:
|
|
case WindowsMessages.Rbuttonup:
|
|
{
|
|
bool isLeft = msg == WindowsMessages.Lbuttonup;
|
|
RawInputModifiers pointerPointModifier = isLeft ? RawInputModifiers.LeftMouseButton : RawInputModifiers.RightMouseButton;
|
|
PointerPointProperties properties = new(pointerPointModifier, isLeft ? PointerUpdateKind.LeftButtonReleased : PointerUpdateKind.RightButtonReleased);
|
|
|
|
var evnt = new PointerReleasedEventArgs(
|
|
this,
|
|
pointer,
|
|
this,
|
|
rootVisualPosition,
|
|
(ulong)Environment.TickCount64,
|
|
properties,
|
|
KeyModifiers.None,
|
|
isLeft ? MouseButton.Left : MouseButton.Right);
|
|
|
|
RaiseEvent(evnt);
|
|
|
|
break;
|
|
}
|
|
case WindowsMessages.Mousemove:
|
|
{
|
|
var evnt = new PointerEventArgs(
|
|
PointerMovedEvent,
|
|
this,
|
|
pointer,
|
|
this,
|
|
rootVisualPosition,
|
|
(ulong)Environment.TickCount64,
|
|
new PointerPointProperties(RawInputModifiers.None, PointerUpdateKind.Other),
|
|
KeyModifiers.None);
|
|
|
|
RaiseEvent(evnt);
|
|
|
|
break;
|
|
}
|
|
}
|
|
#pragma warning restore CS0618
|
|
}
|
|
}
|
|
|
|
return DefWindowProc(hWnd, msg, wParam, lParam);
|
|
};
|
|
|
|
WndClassEx wndClassEx = new()
|
|
{
|
|
cbSize = Marshal.SizeOf<WndClassEx>(),
|
|
hInstance = GetModuleHandle(null),
|
|
lpfnWndProc = Marshal.GetFunctionPointerForDelegate(_wndProcDelegate),
|
|
style = ClassStyles.CsOwndc,
|
|
lpszClassName = Marshal.StringToHGlobalUni(_className),
|
|
hCursor = CreateArrowCursor(),
|
|
};
|
|
|
|
RegisterClassEx(ref wndClassEx);
|
|
|
|
WindowHandle = CreateWindowEx(0, _className, "NativeWindow", WindowStyles.WsChild, 0, 0, 640, 480, control.Handle, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
|
|
|
|
Marshal.FreeHGlobal(wndClassEx.lpszClassName);
|
|
|
|
return new PlatformHandle(WindowHandle, "HWND");
|
|
}
|
|
|
|
[SupportedOSPlatform("macos")]
|
|
IPlatformHandle CreateMacOS()
|
|
{
|
|
// Create a new CAMetalLayer.
|
|
ObjectiveC.Object layerObject = new("CAMetalLayer");
|
|
ObjectiveC.Object metalLayer = layerObject.GetFromMessage("alloc");
|
|
metalLayer.SendMessage("init");
|
|
|
|
// Create a child NSView to render into.
|
|
ObjectiveC.Object nsViewObject = new("NSView");
|
|
ObjectiveC.Object child = nsViewObject.GetFromMessage("alloc");
|
|
child.SendMessage("init", new ObjectiveC.NSRect(0, 0, 0, 0));
|
|
|
|
// Make its renderer our metal layer.
|
|
child.SendMessage("setWantsLayer:", 1);
|
|
child.SendMessage("setLayer:", metalLayer);
|
|
metalLayer.SendMessage("setContentsScale:", Program.DesktopScaleFactor);
|
|
|
|
// Ensure the scale factor is up to date.
|
|
_updateBoundsCallback = rect =>
|
|
{
|
|
metalLayer.SendMessage("setContentsScale:", Program.DesktopScaleFactor);
|
|
};
|
|
|
|
IntPtr nsView = child.ObjPtr;
|
|
MetalLayer = metalLayer.ObjPtr;
|
|
NsView = nsView;
|
|
|
|
return new PlatformHandle(nsView, "NSView");
|
|
}
|
|
|
|
[SupportedOSPlatform("Linux")]
|
|
void DestroyLinux()
|
|
{
|
|
X11Window?.Dispose();
|
|
}
|
|
|
|
[SupportedOSPlatform("windows")]
|
|
void DestroyWin32(IPlatformHandle handle)
|
|
{
|
|
DestroyWindow(handle.Handle);
|
|
UnregisterClass(_className, GetModuleHandle(null));
|
|
}
|
|
|
|
[SupportedOSPlatform("macos")]
|
|
#pragma warning disable CA1822 // Mark member as static
|
|
void DestroyMacOS()
|
|
{
|
|
// TODO
|
|
}
|
|
#pragma warning restore CA1822
|
|
}
|
|
}
|