using System; using System.Collections.Generic; using Avalonia.Input; using Avalonia.Input.Raw; using Avalonia.LinuxFramebuffer.Input; using Avalonia.LinuxFramebuffer.Output; using Avalonia.Platform; using Avalonia.Rendering; namespace Avalonia.LinuxFramebuffer { class FramebufferToplevelImpl : IEmbeddableWindowImpl, IScreenInfoProvider { private readonly IOutputBackend _outputBackend; private readonly IInputBackend _inputBackend; private bool _renderQueued; public IInputRoot InputRoot { get; private set; } public FramebufferToplevelImpl(IOutputBackend outputBackend, IInputBackend inputBackend) { _outputBackend = outputBackend; _inputBackend = inputBackend; Surfaces = new object[] { _outputBackend }; Invalidate(default(Rect)); _inputBackend.Initialize(this, e => Input?.Invoke(e)); } public IRenderer CreateRenderer(IRenderRoot root) { return new DeferredRenderer(root, AvaloniaLocator.Current.GetService()) { }; } public void Dispose() { throw new NotSupportedException(); } public void Invalidate(Rect rect) { } public void SetInputRoot(IInputRoot inputRoot) { InputRoot = inputRoot; _inputBackend.SetInputRoot(inputRoot); } public Point PointToClient(PixelPoint p) => p.ToPoint(1); public PixelPoint PointToScreen(Point p) => PixelPoint.FromPoint(p, 1); public void SetCursor(IPlatformHandle cursor) { } public Size ClientSize => ScaledSize; public IMouseDevice MouseDevice => new MouseDevice(); public IPopupImpl CreatePopup() => null; public double Scaling => _outputBackend.Scaling; public IEnumerable Surfaces { get; } public Action Input { get; set; } public Action Paint { get; set; } public Action Resized { get; set; } public Action ScalingChanged { get; set; } public Action Closed { get; set; } public event Action LostFocus { add {} remove {} } public Size ScaledSize => _outputBackend.PixelSize.ToSize(Scaling); } }