From 888e01c166bf595c8cbb6cfb66bedce9c0d45b04 Mon Sep 17 00:00:00 2001 From: V380-Ori Date: Sun, 9 Nov 2025 14:33:15 +0200 Subject: [PATCH] Avalonia: fix HiDPI/Retina scaling for embedded window on macOS. --- src/Ryujinx.Common/Helpers/ObjectiveC.cs | 8 ++++++++ src/Ryujinx/UI/Renderer/EmbeddedWindow.cs | 9 +++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/Ryujinx.Common/Helpers/ObjectiveC.cs b/src/Ryujinx.Common/Helpers/ObjectiveC.cs index 4c2481f6e..b7c7ffb62 100644 --- a/src/Ryujinx.Common/Helpers/ObjectiveC.cs +++ b/src/Ryujinx.Common/Helpers/ObjectiveC.cs @@ -42,6 +42,9 @@ namespace Ryujinx.Common.Helper [return: MarshalAs(UnmanagedType.Bool)] private static partial bool bool_objc_msgSend(nint receiver, Selector selector, nint param); + [LibraryImport(ObjCRuntime, EntryPoint = "objc_msgSend")] + private static partial double double_objc_msgSend(nint receiver, Selector selector); + public readonly struct Object { public readonly nint ObjPtr; @@ -105,6 +108,11 @@ namespace Ryujinx.Common.Helper { return bool_objc_msgSend(ObjPtr, selector, obj.ObjPtr); } + + public double GetDoubleFromMessage(string selectorName) + { + return double_objc_msgSend(ObjPtr, selectorName); + } } public readonly struct Selector diff --git a/src/Ryujinx/UI/Renderer/EmbeddedWindow.cs b/src/Ryujinx/UI/Renderer/EmbeddedWindow.cs index e360d42f7..fa212046a 100644 --- a/src/Ryujinx/UI/Renderer/EmbeddedWindow.cs +++ b/src/Ryujinx/UI/Renderer/EmbeddedWindow.cs @@ -186,12 +186,17 @@ namespace Ryujinx.Ava.UI.Renderer // Make its renderer our metal layer. child.SendMessage("setWantsLayer:", 1); child.SendMessage("setLayer:", metalLayer); - metalLayer.SendMessage("setContentsScale:", Program.DesktopScaleFactor); + + double initialScaleFactor = child.GetDoubleFromMessage("backingScaleFactor"); + + metalLayer.SendMessage("setContentsScale:", initialScaleFactor); // Ensure the scale factor is up to date. _updateBoundsCallback = rect => { - metalLayer.SendMessage("setContentsScale:", Program.DesktopScaleFactor); + double currentScaleFactor = child.GetDoubleFromMessage("backingScaleFactor"); + + metalLayer.SendMessage("setContentsScale:", currentScaleFactor); }; nint nsView = child.ObjPtr;