/ src / Ryujinx / UI / Renderer / RendererHost.axaml.cs
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  }