From 82c7d7d64f91a485fb05ab0396d53caf9556f72a Mon Sep 17 00:00:00 2001 From: Emmanuel Hansen Date: Wed, 23 Mar 2022 20:38:24 +0000 Subject: [PATCH] Include Platform Handle in surface array (#7841) Include Platform Handle in surface array --- .../InvalidationAwareSurfaceView.cs | 16 +++++++++--- .../Platform/SkiaPlatform/TopLevelImpl.cs | 11 +++----- .../Platform/IPlatformNativeSurfaceHandle.cs | 10 +++++++ src/Avalonia.X11/X11Window.cs | 26 ++++++++++++++++--- src/Windows/Avalonia.Win32/WindowImpl.cs | 8 ++++-- 5 files changed, 55 insertions(+), 16 deletions(-) create mode 100644 src/Avalonia.Controls/Platform/IPlatformNativeSurfaceHandle.cs diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs index 34784612f1..5343b57251 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs @@ -2,18 +2,22 @@ using System; using Android.Content; using Android.Graphics; using Android.OS; +using Android.Runtime; using Android.Util; using Android.Views; +using Avalonia.Android.Platform.SkiaPlatform; using Avalonia.Platform; namespace Avalonia.Android { - public abstract class InvalidationAwareSurfaceView : SurfaceView, ISurfaceHolderCallback, IPlatformHandle + public abstract class InvalidationAwareSurfaceView : SurfaceView, ISurfaceHolderCallback, IPlatformNativeSurfaceHandle { bool _invalidateQueued; readonly object _lock = new object(); private readonly Handler _handler; - + + IntPtr IPlatformHandle.Handle => + AndroidFramebuffer.ANativeWindow_fromSurface(JNIEnv.Handle, Holder.Surface.Handle); public InvalidationAwareSurfaceView(Context context) : base(context) { @@ -25,7 +29,7 @@ namespace Avalonia.Android { lock (_lock) { - if(_invalidateQueued) + if (_invalidateQueued) return; _handler.Post(() => { @@ -70,7 +74,7 @@ namespace Avalonia.Android public void SurfaceDestroyed(ISurfaceHolder holder) { Log.Info("AVALONIA", "Surface Destroyed"); - + } protected void DoDraw() @@ -83,5 +87,9 @@ namespace Avalonia.Android } protected abstract void Draw(); public string HandleDescriptor => "SurfaceView"; + + public PixelSize Size => new PixelSize(Holder.SurfaceFrame.Width(), Holder.SurfaceFrame.Height()); + + public double Scaling => Resources.DisplayMetrics.Density; } } diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs index 0afb1db141..8a475676a5 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; using Android.Content; using Android.Graphics; -using Android.Runtime; using Android.Views; using Android.Views.InputMethods; using Avalonia.Android.OpenGL; @@ -38,11 +37,10 @@ namespace Avalonia.Android.Platform.SkiaPlatform _keyboardHelper = new AndroidKeyboardEventsHelper(this); _touchHelper = new AndroidTouchEventsHelper(this, () => InputRoot, GetAvaloniaPointFromEvent); - _gl = GlPlatformSurface.TryCreate(this); _framebuffer = new FramebufferManager(this); - RenderScaling = (int)_view.Resources.DisplayMetrics.Density; + RenderScaling = (int)_view.Scaling; MaxClientSize = new PixelSize(_view.Resources.DisplayMetrics.WidthPixels, _view.Resources.DisplayMetrics.HeightPixels).ToSize(RenderScaling); @@ -77,7 +75,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform public IPlatformHandle Handle => _view; - public IEnumerable Surfaces => new object[] { _gl, _framebuffer }; + public IEnumerable Surfaces => new object[] { _gl, _framebuffer, Handle }; public IRenderer CreateRenderer(IRenderRoot root) => AndroidPlatform.Options.UseDeferredRendering @@ -216,10 +214,9 @@ namespace Avalonia.Android.Platform.SkiaPlatform public AcrylicPlatformCompensationLevels AcrylicCompensationLevels => new AcrylicPlatformCompensationLevels(1, 1, 1); - IntPtr EglGlPlatformSurfaceBase.IEglWindowGlPlatformSurfaceInfo.Handle => - AndroidFramebuffer.ANativeWindow_fromSurface(JNIEnv.Handle, _view.Holder.Surface.Handle); + IntPtr EglGlPlatformSurfaceBase.IEglWindowGlPlatformSurfaceInfo.Handle => ((IPlatformHandle)_view).Handle; - public PixelSize Size => new PixelSize(_view.Holder.SurfaceFrame.Width(), _view.Holder.SurfaceFrame.Height()); + public PixelSize Size => _view.Size; public double Scaling => RenderScaling; diff --git a/src/Avalonia.Controls/Platform/IPlatformNativeSurfaceHandle.cs b/src/Avalonia.Controls/Platform/IPlatformNativeSurfaceHandle.cs new file mode 100644 index 0000000000..264f5e4667 --- /dev/null +++ b/src/Avalonia.Controls/Platform/IPlatformNativeSurfaceHandle.cs @@ -0,0 +1,10 @@ +using System; + +namespace Avalonia.Platform +{ + public interface IPlatformNativeSurfaceHandle : IPlatformHandle + { + PixelSize Size { get; } + double Scaling { get; } + } +} diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs index 520b35dd03..066156a652 100644 --- a/src/Avalonia.X11/X11Window.cs +++ b/src/Avalonia.X11/X11Window.cs @@ -134,8 +134,8 @@ namespace Avalonia.X11 SetWindowValuemask.WinGravity | SetWindowValuemask.BackingStore)), ref attr); else _renderHandle = _handle; - - Handle = new PlatformHandle(_handle, "XID"); + + Handle = new SurfacePlatformHandle(this); _realSize = new PixelSize(defaultWidth, defaultHeight); platform.Windows[_handle] = OnEvent; XEventMask ignoredMask = XEventMask.SubstructureRedirectMask @@ -169,7 +169,9 @@ namespace Avalonia.X11 if (glx != null) surfaces.Insert(0, new GlxGlPlatformSurface(glx.Display, glx.DeferredContext, new SurfaceInfo(this, _x11.Display, _handle, _renderHandle))); - + + surfaces.Add(Handle); + Surfaces = surfaces.ToArray(); UpdateMotifHints(); UpdateSizeHints(null); @@ -1142,5 +1144,23 @@ namespace Avalonia.X11 public AcrylicPlatformCompensationLevels AcrylicCompensationLevels { get; } = new AcrylicPlatformCompensationLevels(1, 0.8, 0.8); public bool NeedsManagedDecorations => false; + + + public class SurfacePlatformHandle : IPlatformNativeSurfaceHandle + { + private readonly X11Window _owner; + + public PixelSize Size => _owner.ToPixelSize(_owner.ClientSize); + + public double Scaling => _owner.RenderScaling; + + public SurfacePlatformHandle(X11Window owner) + { + _owner = owner; + } + + public IntPtr Handle => _owner._renderHandle; + public string? HandleDescriptor => "XID"; + } } } diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 41269ee7ca..f0036236ec 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -459,7 +459,7 @@ namespace Avalonia.Win32 } } - public IEnumerable Surfaces => new object[] { Handle, _gl, _framebuffer }; + public IEnumerable Surfaces => new object[] { (IPlatformNativeSurfaceHandle)Handle, _gl, _framebuffer }; public PixelPoint Position { @@ -1383,12 +1383,16 @@ namespace Avalonia.Win32 public ITextInputMethodImpl TextInputMethod => Imm32InputMethod.Current; - private class WindowImplPlatformHandle : IPlatformHandle + private class WindowImplPlatformHandle : IPlatformNativeSurfaceHandle { private readonly WindowImpl _owner; public WindowImplPlatformHandle(WindowImpl owner) => _owner = owner; public IntPtr Handle => _owner.Hwnd; public string HandleDescriptor => PlatformConstants.WindowHandleType; + + public PixelSize Size => PixelSize.FromSize(_owner.ClientSize, Scaling); + + public double Scaling => _owner.RenderScaling; } } }