RendererHost.axaml.cs 1.8 KB

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