Browse Source

Merge remote-tracking branch 'nc4rrillo/windowing-prototype' into windowing-prototype

repro-window-close
Dan Walmsley 8 years ago
parent
commit
718bf5b3d9
  1. 1
      src/Avalonia.Gpu/IGpuContext.cs
  2. 8
      src/Avalonia.Windowing/Bindings/GlWindow.cs
  3. 18
      src/Avalonia.Windowing/PopupImpl.cs
  4. 27
      src/Avalonia.Windowing/WIndowingPlatform.cs
  5. 4
      src/Avalonia.Windowing/WindowImpl.cs
  6. 8
      src/Skia/Avalonia.Skia/GlRenderTarget.cs

1
src/Avalonia.Gpu/IGpuContext.cs

@ -7,5 +7,6 @@ namespace Avalonia.Gpu
void Present(); void Present();
IntPtr GetProcAddress(string symbol); IntPtr GetProcAddress(string symbol);
(double, double) GetFramebufferSize(); (double, double) GetFramebufferSize();
void ResizeContext(double width, double height);
} }
} }

8
src/Avalonia.Windowing/Bindings/GlWindow.cs

@ -40,6 +40,9 @@ namespace Avalonia.Windowing.Bindings
[DllImport("winit_wrapper")] [DllImport("winit_wrapper")]
private static extern IntPtr winit_gl_window_get_id(IntPtr handle); private static extern IntPtr winit_gl_window_get_id(IntPtr handle);
[DllImport("winit_wrapper")]
private static extern void winit_gl_window_resize_context(IntPtr handle, double width, double height);
private IntPtr _handle; private IntPtr _handle;
public IntPtr Id => winit_gl_window_get_id(_handle); public IntPtr Id => winit_gl_window_get_id(_handle);
public GlWindowWrapper(EventsLoop eventsLoop) public GlWindowWrapper(EventsLoop eventsLoop)
@ -92,5 +95,10 @@ namespace Avalonia.Windowing.Bindings
{ {
winit_gl_window_show(_handle); winit_gl_window_show(_handle);
} }
public void ResizeContext(double width, double height)
{
winit_gl_window_resize_context(_handle, width, height);
}
} }
} }

18
src/Avalonia.Windowing/PopupImpl.cs

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Input.Raw;
using Avalonia.Platform;
using Avalonia.Rendering;
using Avalonia.Windowing.Bindings;
namespace Avalonia.Windowing
{
public class PopupImpl : WindowImpl, IPopupImpl
{
public PopupImpl(IWindowWrapper wrapper) : base(wrapper)
{
}
}
}

27
src/Avalonia.Windowing/WIndowingPlatform.cs

@ -10,14 +10,10 @@ using Avalonia.Windowing.Bindings;
namespace Avalonia.Windowing namespace Avalonia.Windowing
{ {
// Exposing C# Enums to Rust will again prove to be a massive PITA. public class PlatformSettings : IPlatformSettings
public enum WinitEventType
{
MouseMove
}
public struct MouseMoveData
{ {
public Size DoubleClickSize => new Size(4, 4);
public TimeSpan DoubleClickTime => TimeSpan.FromMilliseconds(200);
} }
public class DummyPlatformHandle : IPlatformHandle public class DummyPlatformHandle : IPlatformHandle
@ -40,7 +36,7 @@ namespace Avalonia.Windowing
{ {
internal static WindowingPlatform Instance { get; private set; } internal static WindowingPlatform Instance { get; private set; }
private readonly EventsLoop _eventsLoop; private readonly EventsLoop _eventsLoop;
private readonly Dictionary<IntPtr, Window> _windows; private readonly Dictionary<IntPtr, WindowImpl> _windows;
public WindowingPlatform() public WindowingPlatform()
{ {
@ -48,7 +44,7 @@ namespace Avalonia.Windowing
_eventsLoop.MouseEvent += _eventsLoop_MouseEvent; _eventsLoop.MouseEvent += _eventsLoop_MouseEvent;
_eventsLoop.Awakened += _eventsLoop_Awakened; _eventsLoop.Awakened += _eventsLoop_Awakened;
_eventsLoop.Resized += _eventsLoop_Resized; _eventsLoop.Resized += _eventsLoop_Resized;
_windows = new Dictionary<IntPtr, Window>(); _windows = new Dictionary<IntPtr, WindowImpl>();
} }
void _eventsLoop_Resized(IntPtr windowId, ResizeEvent resizeEvent) void _eventsLoop_Resized(IntPtr windowId, ResizeEvent resizeEvent)
@ -71,8 +67,9 @@ namespace Avalonia.Windowing
private void _eventsLoop_Awakened() private void _eventsLoop_Awakened()
{ {
Signaled?.Invoke(DispatcherPriority.Normal); Signaled?.Invoke(DispatcherPriority.Input);
// Dispatcher.UIThread.RunJobs(); Signaled?.Invoke(DispatcherPriority.Layout);
Signaled?.Invoke(DispatcherPriority.Render);
} }
@ -103,13 +100,17 @@ namespace Avalonia.Windowing
public IPopupImpl CreatePopup() public IPopupImpl CreatePopup()
{ {
throw new NotImplementedException(); var windowWrapper = new GlWindowWrapper(_eventsLoop);
var window = new PopupImpl(windowWrapper);
_windows.Add(windowWrapper.Id, window);
return window;
} }
public IWindowImpl CreateWindow() public IWindowImpl CreateWindow()
{ {
var windowWrapper = new GlWindowWrapper(_eventsLoop); var windowWrapper = new GlWindowWrapper(_eventsLoop);
var window = new Window(windowWrapper); var window = new WindowImpl(windowWrapper);
_windows.Add(windowWrapper.Id, window); _windows.Add(windowWrapper.Id, window);
return window; return window;

4
src/Avalonia.Windowing/WindowImpl.cs

@ -10,12 +10,12 @@ using Avalonia.Windowing.Bindings;
namespace Avalonia.Windowing namespace Avalonia.Windowing
{ {
public class Window : IWindowImpl public class WindowImpl : IWindowImpl
{ {
IWindowWrapper _windowWrapper; IWindowWrapper _windowWrapper;
private LogicalPosition _lastPosition; private LogicalPosition _lastPosition;
public Window(IWindowWrapper wrapper) public WindowImpl(IWindowWrapper wrapper)
{ {
_windowWrapper = wrapper; _windowWrapper = wrapper;
} }

8
src/Skia/Avalonia.Skia/GlRenderTarget.cs

@ -34,26 +34,25 @@ namespace Avalonia.Skia
if (_surface == null || (_desc.Width != (int)width * 2 || _desc.Height != (int)height * 2)) if (_surface == null || (_desc.Width != (int)width * 2 || _desc.Height != (int)height * 2))
{ {
_context.ResizeContext(width, height);
_desc = new GRBackendRenderTargetDesc _desc = new GRBackendRenderTargetDesc
{ {
Height = (int)height * 2, Height = (int)height * 2,
Width = (int)width * 2, Width = (int)width * 2,
SampleCount = 1, SampleCount = 1,
StencilBits = 8, StencilBits = 8,
Config = GRPixelConfig.Bgra8888, Config = GRPixelConfig.Rgba8888,
Origin = GRSurfaceOrigin.BottomLeft, Origin = GRSurfaceOrigin.BottomLeft,
RenderTargetHandle = IntPtr.Zero RenderTargetHandle = IntPtr.Zero
}; };
_surface?.Dispose(); _surface?.Dispose();
_surface = SKSurface.Create(_grContext, _desc); _surface = SKSurface.Create(_grContext, _desc);
_canvas?.Dispose();
_canvas = _surface.Canvas; _canvas = _surface.Canvas;
} }
_canvas.Clear(SKColors.Orange); _canvas.Clear(SKColors.Orange);
_canvas.RestoreToCount(-1);
_canvas.ResetMatrix();
var createInfo = new DrawingContextImpl.CreateInfo var createInfo = new DrawingContextImpl.CreateInfo
{ {
@ -65,6 +64,7 @@ namespace Avalonia.Skia
return new DrawingContextImpl(createInfo, Disposable.Create(() => return new DrawingContextImpl(createInfo, Disposable.Create(() =>
{ {
_canvas.Flush();
_grContext.Flush(); _grContext.Flush();
_context.Present(); // Swap Buffers _context.Present(); // Swap Buffers
})); }));

Loading…
Cancel
Save