Browse Source

WIP

repro-window-close
Nelson Carrillo 8 years ago
parent
commit
713eee8245
  1. 1
      src/Avalonia.Controls/Primitives/AdornerLayer.cs
  2. 6
      src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs
  3. 14
      src/Avalonia.Windowing/Bindings/EventsLoop.cs
  4. 12
      src/Avalonia.Windowing/WIndowingPlatform.cs
  5. 27
      src/Avalonia.Windowing/WindowImpl.cs
  6. 25
      src/Skia/Avalonia.Skia/GlRenderTarget.cs

1
src/Avalonia.Controls/Primitives/AdornerLayer.cs

@ -21,6 +21,7 @@ namespace Avalonia.Controls.Primitives
static AdornerLayer()
{
AdornedElementProperty.Changed.Subscribe(AdornedElementChanged);
IsHitTestVisibleProperty.OverrideDefaultValue(typeof(AdornerLayer), false);
}
public AdornerLayer()

6
src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs

@ -59,7 +59,7 @@ namespace Avalonia.Rendering
Render(context, _root, _root.Bounds);
}
if (DrawDirtyRects)
if (false)
{
var color = (uint)new Random().Next(0xffffff) | 0x44000000;
context.FillRectangle(
@ -67,7 +67,7 @@ namespace Avalonia.Rendering
rect);
}
if (DrawFps)
if (true)
{
RenderFps(context.PlatformImpl, _root.Bounds, null);
}
@ -223,7 +223,7 @@ namespace Avalonia.Rendering
var opacity = visual.Opacity;
var clipToBounds = visual.ClipToBounds;
var bounds = new Rect(visual.Bounds.Size);
if (visual.IsVisible && opacity > 0)
{
var m = Matrix.CreateTranslation(visual.Bounds.Position);

14
src/Avalonia.Windowing/Bindings/EventsLoop.cs

@ -15,6 +15,12 @@ namespace Avalonia.Windowing.Bindings
public LogicalPosition Position { get; set; }
}
[StructLayout(LayoutKind.Sequential)]
public struct ResizeEvent
{
public LogicalSize Size { get; set; }
}
[StructLayout(LayoutKind.Sequential)]
public struct LogicalPosition
{
@ -30,6 +36,7 @@ namespace Avalonia.Windowing.Bindings
}
public delegate void MouseEventCallback(IntPtr windowId, MouseEvent mouseEvent);
public delegate void ResizeEventCallback(IntPtr windowId, ResizeEvent mouseEvent);
public delegate void AwakenedEventCallback();
public class EventsLoop : IDisposable
@ -45,7 +52,8 @@ namespace Avalonia.Windowing.Bindings
(
IntPtr handle,
MouseEventCallback callback,
AwakenedEventCallback awakenedEventCallback
AwakenedEventCallback awakenedEventCallback,
ResizeEventCallback resizeEventCallback
);
public IntPtr Handle { get; private set; }
@ -53,6 +61,7 @@ namespace Avalonia.Windowing.Bindings
public event MouseEventCallback MouseEvent;
public event AwakenedEventCallback Awakened;
public event ResizeEventCallback Resized;
public EventsLoop()
{
@ -72,6 +81,9 @@ namespace Avalonia.Windowing.Bindings
() =>
{
Awakened?.Invoke();
},
(windowId, ResizeEvent) => {
Resized?.Invoke(windowId, ResizeEvent);
}
);
}

12
src/Avalonia.Windowing/WIndowingPlatform.cs

@ -47,9 +47,20 @@ namespace Avalonia.Windowing
_eventsLoop = new EventsLoop();
_eventsLoop.MouseEvent += _eventsLoop_MouseEvent;
_eventsLoop.Awakened += _eventsLoop_Awakened;
_eventsLoop.Resized += _eventsLoop_Resized;
_windows = new Dictionary<IntPtr, Window>();
}
void _eventsLoop_Resized(IntPtr windowId, ResizeEvent resizeEvent)
{
Dispatcher.UIThread.RunJobs(DispatcherPriority.Layout);
if (_windows.ContainsKey(windowId))
{
_windows[windowId].OnResizeEvent(resizeEvent);
}
}
private void _eventsLoop_MouseEvent(IntPtr windowId, MouseEvent mouseEvent)
{
if (_windows.ContainsKey(windowId))
@ -61,6 +72,7 @@ namespace Avalonia.Windowing
private void _eventsLoop_Awakened()
{
Signaled?.Invoke(DispatcherPriority.Normal);
// Dispatcher.UIThread.RunJobs();
}

27
src/Avalonia.Windowing/WindowImpl.cs

@ -5,6 +5,7 @@ using Avalonia.Input;
using Avalonia.Input.Raw;
using Avalonia.Platform;
using Avalonia.Rendering;
using Avalonia.Threading;
using Avalonia.Windowing.Bindings;
namespace Avalonia.Windowing
@ -101,22 +102,26 @@ namespace Avalonia.Windowing
public Point PointToClient(Point point)
{
// point = point.WithY(ClientSize.Height - point.Y);
var (x, y) = _windowWrapper.GetPosition();
return new Point(point.X + x, point.Y + y);
point = point.WithY(ClientSize.Height - point.Y);
var position = Position;
return new Point(point.X + position.X, point.Y + position.Y);
}
public Point PointToScreen(Point point)
{
// point = point.WithY(ClientSize.Height - point.Y);
var (x, y) = _windowWrapper.GetPosition();
return new Point(point.X - x, point.Y - y);;
point = point.WithY(ClientSize.Height - point.Y);
var position = Position;
return new Point(point.X - position.X, point.Y - position.Y);;
}
public void Resize(Size clientSize)
{
if (clientSize == ClientSize)
return;
// This is where we size the window accordingly..
_windowWrapper.SetSize(clientSize.Width, clientSize.Height);
//Resized(clientSize);
}
public void SetCursor(IPlatformHandle cursor)
@ -163,8 +168,14 @@ namespace Avalonia.Windowing
public void OnMouseEvent(MouseEvent evt)
{
Input(new RawMouseEventArgs(MouseDevice, (uint)Environment.TickCount, _inputRoot, RawMouseEventType.Move, new Point(evt.Position.X, evt.Position.Y), InputModifiers.None));
Paint?.Invoke(Rect.Empty);
Dispatcher.UIThread.RunJobs(DispatcherPriority.Input);
Input(new RawMouseEventArgs(MouseDevice, (uint)Environment.TickCount, _inputRoot, RawMouseEventType.Move, new Point(evt.Position.X, evt.Position.Y), InputModifiers.None));
}
public void OnResizeEvent(ResizeEvent evt)
{
Resized?.Invoke(ClientSize);
Paint?.Invoke(new Rect(ClientSize));
}
}
}

25
src/Skia/Avalonia.Skia/GlRenderTarget.cs

@ -26,16 +26,15 @@ namespace Avalonia.Skia
SKSurface _surface;
SKCanvas _canvas;
GRBackendRenderTargetDesc _desc;
public IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer)
{
// TODO: These are hard coded for now. Don't do that.
// TODO: Recreate the surface when the size changes.
// if (_surface == null)
{
var (width, height) = _context.GetFramebufferSize();
var (width, height) = _context.GetFramebufferSize();
_surface = SKSurface.Create(_grContext, new GRBackendRenderTargetDesc
if (_surface == null || (_desc.Width != (int)width * 2 || _desc.Height != (int)height * 2))
{
_desc = new GRBackendRenderTargetDesc
{
Height = (int)height * 2,
Width = (int)width * 2,
@ -44,15 +43,18 @@ namespace Avalonia.Skia
Config = GRPixelConfig.Bgra8888,
Origin = GRSurfaceOrigin.BottomLeft,
RenderTargetHandle = IntPtr.Zero
});
};
_surface?.Dispose();
_surface = SKSurface.Create(_grContext, _desc);
_canvas = _surface.Canvas;
}
// _canvas.RestoreToCount(-1);
// _canvas.ResetMatrix();
_canvas.Scale(2);
_canvas.Clear(SKColors.Orange);
_canvas.RestoreToCount(-1);
_canvas.ResetMatrix();
var createInfo = new DrawingContextImpl.CreateInfo
{
Canvas = _canvas,
@ -63,7 +65,6 @@ namespace Avalonia.Skia
return new DrawingContextImpl(createInfo, Disposable.Create(() =>
{
_canvas.Flush();
_grContext.Flush();
_context.Present(); // Swap Buffers
}));
@ -71,6 +72,8 @@ namespace Avalonia.Skia
public void Dispose()
{
_canvas.Dispose();
_surface.Dispose();
_grContext.Dispose();
}
}

Loading…
Cancel
Save