RendererHost.axaml.cs
1 using Avalonia; 2 using Avalonia.Controls; 3 using Ryujinx.Common.Configuration; 4 using Ryujinx.UI.Common.Configuration; 5 using System; 6 7 namespace Ryujinx.Ava.UI.Renderer 8 { 9 public partial class RendererHost : UserControl, IDisposable 10 { 11 public readonly EmbeddedWindow EmbeddedWindow; 12 13 public event EventHandler<EventArgs> WindowCreated; 14 public event Action<object, Size> BoundsChanged; 15 16 public RendererHost() 17 { 18 InitializeComponent(); 19 20 if (ConfigurationState.Instance.Graphics.GraphicsBackend.Value == GraphicsBackend.OpenGl) 21 { 22 EmbeddedWindow = new EmbeddedWindowOpenGL(); 23 } 24 else 25 { 26 EmbeddedWindow = new EmbeddedWindowVulkan(); 27 } 28 29 Initialize(); 30 } 31 32 private void Initialize() 33 { 34 EmbeddedWindow.WindowCreated += CurrentWindow_WindowCreated; 35 EmbeddedWindow.BoundsChanged += CurrentWindow_BoundsChanged; 36 37 Content = EmbeddedWindow; 38 } 39 40 public void Dispose() 41 { 42 if (EmbeddedWindow != null) 43 { 44 EmbeddedWindow.WindowCreated -= CurrentWindow_WindowCreated; 45 EmbeddedWindow.BoundsChanged -= CurrentWindow_BoundsChanged; 46 } 47 48 GC.SuppressFinalize(this); 49 } 50 51 protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e) 52 { 53 base.OnDetachedFromVisualTree(e); 54 55 Dispose(); 56 } 57 58 private void CurrentWindow_BoundsChanged(object sender, Size e) 59 { 60 BoundsChanged?.Invoke(sender, e); 61 } 62 63 private void CurrentWindow_WindowCreated(object sender, IntPtr e) 64 { 65 WindowCreated?.Invoke(this, EventArgs.Empty); 66 } 67 } 68 }