diff --git a/.ncrunch/Avalonia.Win32.Interop.v3.ncrunchproject b/.ncrunch/Avalonia.Win32.Interop.v3.ncrunchproject
new file mode 100644
index 0000000000..6800b4a3fe
--- /dev/null
+++ b/.ncrunch/Avalonia.Win32.Interop.v3.ncrunchproject
@@ -0,0 +1,5 @@
+
+
+ True
+
+
\ No newline at end of file
diff --git a/src/Avalonia.Controls/Platform/ITopLevelImpl.cs b/src/Avalonia.Controls/Platform/ITopLevelImpl.cs
index ba3ecb99c5..60e25d2be6 100644
--- a/src/Avalonia.Controls/Platform/ITopLevelImpl.cs
+++ b/src/Avalonia.Controls/Platform/ITopLevelImpl.cs
@@ -5,6 +5,7 @@ using System;
using System.Collections.Generic;
using Avalonia.Input;
using Avalonia.Input.Raw;
+using Avalonia.Rendering;
using JetBrains.Annotations;
namespace Avalonia.Platform
@@ -60,6 +61,12 @@ namespace Avalonia.Platform
///
Action ScalingChanged { get; set; }
+ ///
+ /// Creates a new renderer for the toplevel.
+ ///
+ /// The toplevel.
+ IRenderer CreateRenderer(IRenderRoot root);
+
///
/// Invalidates a rect on the toplevel.
///
diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs
index 8b1b80169f..f8db0e2a5b 100644
--- a/src/Avalonia.Controls/TopLevel.cs
+++ b/src/Avalonia.Controls/TopLevel.cs
@@ -90,8 +90,7 @@ namespace Avalonia.Controls
_renderInterface = TryGetService(dependencyResolver);
var renderLoop = TryGetService(dependencyResolver);
- var rendererFactory = TryGetService(dependencyResolver);
- Renderer = rendererFactory?.CreateRenderer(this, renderLoop);
+ Renderer = impl.CreateRenderer(this);
impl.SetInputRoot(this);
diff --git a/src/Avalonia.Visuals/Rendering/IRendererFactory.cs b/src/Avalonia.Visuals/Rendering/IRendererFactory.cs
deleted file mode 100644
index 8e27f85193..0000000000
--- a/src/Avalonia.Visuals/Rendering/IRendererFactory.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using System;
-
-namespace Avalonia.Rendering
-{
- ///
- /// Defines a factory for creating instances.
- ///
- public interface IRendererFactory
- {
- ///
- /// Creates a new renderer for the specified render root.
- ///
- /// The render root.
- /// The render loop.
- /// An instance of an .
- IRenderer CreateRenderer(IRenderRoot root, IRenderLoop renderLoop);
- }
-}
diff --git a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs
index 4d12be7db0..4ef2b30463 100644
--- a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs
+++ b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs
@@ -20,11 +20,6 @@ namespace Avalonia.Rendering
///
public class ImmediateRenderer : RendererBase, IRenderer, IVisualBrushRenderer
{
- class ImmediateRendererFactory : IRendererFactory
- {
- public IRenderer CreateRenderer(IRenderRoot root, IRenderLoop renderLoop) => new ImmediateRenderer(root);
- }
-
private readonly IVisual _root;
private readonly IRenderRoot _renderRoot;
private IRenderTarget _renderTarget;
@@ -41,8 +36,6 @@ namespace Avalonia.Rendering
_renderRoot = root as IRenderRoot;
}
- public static IRendererFactory Factory { get; } = new ImmediateRendererFactory();
-
///
public bool DrawFps { get; set; }
diff --git a/src/Gtk/Avalonia.Gtk/GtkPlatform.cs b/src/Gtk/Avalonia.Gtk/GtkPlatform.cs
index ef7e4d3362..f449229c53 100644
--- a/src/Gtk/Avalonia.Gtk/GtkPlatform.cs
+++ b/src/Gtk/Avalonia.Gtk/GtkPlatform.cs
@@ -28,7 +28,7 @@ namespace Avalonia.Gtk
using Rendering;
using Gtk = global::Gtk;
- public class GtkPlatform : IPlatformThreadingInterface, IPlatformSettings, IWindowingPlatform, IPlatformIconLoader, IRendererFactory
+ public class GtkPlatform : IPlatformThreadingInterface, IPlatformSettings, IWindowingPlatform, IPlatformIconLoader
{
private static readonly GtkPlatform s_instance = new GtkPlatform();
private static Thread _uiThread;
@@ -53,7 +53,6 @@ namespace Avalonia.Gtk
.Bind().ToConstant(GtkKeyboardDevice.Instance)
.Bind().ToConstant(s_instance)
.Bind().ToConstant(s_instance)
- .Bind().ToConstant(s_instance)
.Bind().ToConstant(new DefaultRenderLoop(60))
.Bind().ToSingleton()
.Bind().ToConstant(s_instance);
@@ -112,11 +111,6 @@ namespace Avalonia.Gtk
return new PopupImpl();
}
- public IRenderer CreateRenderer(IRenderRoot root, IRenderLoop renderLoop)
- {
- return new ImmediateRenderer(root);
- }
-
public IWindowIconImpl LoadIcon(string fileName)
{
return new IconImpl(new Gdk.Pixbuf(fileName));
diff --git a/src/Gtk/Avalonia.Gtk/TopLevelImpl.cs b/src/Gtk/Avalonia.Gtk/TopLevelImpl.cs
index ce1f50ac0f..5c18d015d4 100644
--- a/src/Gtk/Avalonia.Gtk/TopLevelImpl.cs
+++ b/src/Gtk/Avalonia.Gtk/TopLevelImpl.cs
@@ -10,6 +10,7 @@ using Gdk;
using Action = System.Action;
using WindowEdge = Avalonia.Controls.WindowEdge;
using GLib;
+using Avalonia.Rendering;
namespace Avalonia.Gtk
{
@@ -141,6 +142,11 @@ namespace Avalonia.Gtk
return new PopupImpl();
}
+ public IRenderer CreateRenderer(IRenderRoot root)
+ {
+ return new ImmediateRenderer(root);
+ }
+
public void Invalidate(Rect rect)
{
if (_widget?.GdkWindow != null)
diff --git a/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs b/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs
index b4063855eb..4ea1a5af56 100644
--- a/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs
+++ b/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs
@@ -15,7 +15,7 @@ using Avalonia.Gtk3;
namespace Avalonia.Gtk3
{
- public class Gtk3Platform : IWindowingPlatform, IPlatformSettings, IPlatformThreadingInterface, IRendererFactory
+ public class Gtk3Platform : IWindowingPlatform, IPlatformSettings, IPlatformThreadingInterface
{
internal static readonly Gtk3Platform Instance = new Gtk3Platform();
internal static readonly MouseDevice Mouse = new MouseDevice();
@@ -37,9 +37,7 @@ namespace Avalonia.Gtk3
.Bind().ToConstant(Instance)
.Bind().ToConstant(Instance)
.Bind().ToSingleton()
- .Bind().ToConstant(Instance)
.Bind().ToConstant(new DefaultRenderLoop(60))
- .Bind().ToConstant(ImmediateRenderer.Factory)
.Bind().ToConstant(new PlatformIconLoader());
}
@@ -53,11 +51,6 @@ namespace Avalonia.Gtk3
public IPopupImpl CreatePopup() => new PopupImpl();
- public IRenderer CreateRenderer(IRenderRoot root, IRenderLoop renderLoop)
- {
- return new ImmediateRenderer(root);
- }
-
public Size DoubleClickSize => new Size(4, 4);
public TimeSpan DoubleClickTime => TimeSpan.FromMilliseconds(100); //STUB
diff --git a/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs b/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs
index 39304940d2..4464059efb 100644
--- a/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs
+++ b/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs
@@ -9,6 +9,7 @@ using Avalonia.Gtk3.Interop;
using Avalonia.Input;
using Avalonia.Input.Raw;
using Avalonia.Platform;
+using Avalonia.Rendering;
namespace Avalonia.Gtk3
{
@@ -354,5 +355,10 @@ namespace Avalonia.Gtk3
IntPtr IPlatformHandle.Handle => Native.GetNativeGdkWindowHandle(Native.GtkWidgetGetWindow(GtkWidget));
public IEnumerable