Browse Source

Minor changes, missing documentation

pull/10473/head
Max Katz 3 years ago
parent
commit
f61f8f2bb6
  1. 3
      src/Headless/Avalonia.Headless.Vnc/HeadlessVncFramebufferSource.cs
  2. 2
      src/Headless/Avalonia.Headless.XUnit/AvaloniaTestFrameworkAttribute.cs
  3. 4
      src/Headless/Avalonia.Headless/Avalonia.Headless.csproj
  4. 6
      src/Headless/Avalonia.Headless/AvaloniaHeadlessPlatform.cs
  5. 46
      src/Headless/Avalonia.Headless/HeadlessWindowExtensions.cs
  6. 2
      tests/Avalonia.Headless.UnitTests/RenderingTests.cs

3
src/Headless/Avalonia.Headless.Vnc/HeadlessVncFramebufferSource.cs

@ -2,6 +2,7 @@
using System.Runtime.InteropServices;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Platform;
using Avalonia.Threading;
using RemoteViewing.Vnc;
using RemoteViewing.Vnc.Server;
@ -68,7 +69,7 @@ namespace Avalonia.Headless.Vnc
{
lock (_lock)
{
using (var bmpRef = Window.GetLastRenderedFrame())
using (var bmpRef = Window.CaptureRenderedFrame())
{
if (bmpRef == null)
return _framebuffer;

2
src/Headless/Avalonia.Headless.XUnit/AvaloniaTestFrameworkAttribute.cs

@ -5,7 +5,7 @@ using Xunit.Sdk;
namespace Avalonia.Headless.XUnit;
/// <summary>
///
/// Sets up global avalonia test framework using avalonia application builder passed as a parameter.
/// </summary>
[TestFrameworkDiscoverer("Avalonia.Headless.XUnit.AvaloniaTestFrameworkTypeDiscoverer", "Avalonia.Headless.XUnit")]
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)]

4
src/Headless/Avalonia.Headless/Avalonia.Headless.csproj

@ -11,4 +11,8 @@
<Import Project="..\..\..\build\DevAnalyzers.props" />
<Import Project="..\..\..\build\TrimmingEnable.props" />
<Import Project="..\..\..\build\NullableEnable.props" />
<ItemGroup Label="InternalsVisibleTo">
<InternalsVisibleTo Include="Avalonia.Headless.Vnc, PublicKey=$(AvaloniaPublicKey)" />
</ItemGroup>
</Project>

6
src/Headless/Avalonia.Headless/AvaloniaHeadlessPlatform.cs

@ -72,7 +72,11 @@ namespace Avalonia.Headless
Compositor = new Compositor(AvaloniaLocator.Current.GetRequiredService<IRenderLoop>(), null);
}
/// <summary>
/// Forces renderer to process a rendering timer tick.
/// Use this method before calling <see cref="HeadlessWindowExtensions.GetLastRenderedFrame"/>.
/// </summary>
/// <param name="count">Count of frames to be ticked on the timer.</param>
public static void ForceRenderTimerTick(int count = 1)
{
var timer = AvaloniaLocator.Current.GetService<IRenderTimer>() as RenderTimer;

46
src/Headless/Avalonia.Headless/HeadlessWindowExtensions.cs

@ -3,40 +3,78 @@ using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Input.Raw;
using Avalonia.Media.Imaging;
using Avalonia.Platform;
using Avalonia.Threading;
namespace Avalonia.Headless;
public static class HeadlessWindowExtensions
{
/// <summary>
/// Triggers a renderer timer tick and captures last rendered frame.
/// </summary>
/// <returns>Bitmap with last rendered frame. Null, if nothing was rendered.</returns>
public static Bitmap? CaptureRenderedFrame(this TopLevel topLevel)
{
var impl = GetImpl(topLevel);
Dispatcher.UIThread.RunJobs();
AvaloniaHeadlessPlatform.ForceRenderTimerTick();
return impl.GetLastRenderedFrame();
return topLevel.GetLastRenderedFrame();
}
public static Bitmap? GetLastRenderedFrame(this TopLevel topLevel) =>
GetImpl(topLevel).GetLastRenderedFrame();
/// <summary>
/// Reads last rendered frame.
/// Note, in order to trigger rendering timer, call <see cref="AvaloniaHeadlessPlatform.ForceRenderTimerTick"/> method.
/// </summary>
/// <returns>Bitmap with last rendered frame. Null, if nothing was rendered.</returns>
public static Bitmap? GetLastRenderedFrame(this TopLevel topLevel)
{
if (AvaloniaLocator.Current.GetService<IPlatformRenderInterface>() is HeadlessPlatformRenderInterface)
{
throw new NotSupportedException("To capture a rendered frame, make sure that headless application was initialized with '.UseSkia()' and disabled 'UseHeadlessDrawing' in the 'AvaloniaHeadlessPlatformOptions'.");
}
return GetImpl(topLevel).GetLastRenderedFrame();
}
/// <summary>
/// Simulates keyboard press on the headless window/toplevel.
/// </summary>
public static void KeyPress(this TopLevel topLevel, Key key, RawInputModifiers modifiers) =>
GetImpl(topLevel).KeyPress(key, modifiers);
/// <summary>
/// Simulates keyboard release on the headless window/toplevel.
/// </summary>
public static void KeyRelease(this TopLevel topLevel, Key key, RawInputModifiers modifiers) =>
GetImpl(topLevel).KeyRelease(key, modifiers);
/// <summary>
/// Simulates mouse down on the headless window/toplevel.
/// </summary>
public static void MouseDown(this TopLevel topLevel, Point point, MouseButton button,
RawInputModifiers modifiers = RawInputModifiers.None) => GetImpl(topLevel).MouseDown(point, button, modifiers);
/// <summary>
/// Simulates mouse move on the headless window/toplevel.
/// </summary>
public static void MouseMove(this TopLevel topLevel, Point point,
RawInputModifiers modifiers = RawInputModifiers.None) => GetImpl(topLevel).MouseMove(point, modifiers);
/// <summary>
/// Simulates mouse up on the headless window/toplevel.
/// </summary>
public static void MouseUp(this TopLevel topLevel, Point point, MouseButton button,
RawInputModifiers modifiers = RawInputModifiers.None) => GetImpl(topLevel).MouseUp(point, button, modifiers);
/// <summary>
/// Simulates mouse wheel on the headless window/toplevel.
/// </summary>
public static void MouseWheel(this TopLevel topLevel, Point point, Vector delta,
RawInputModifiers modifiers = RawInputModifiers.None) => GetImpl(topLevel).MouseWheel(point, delta, modifiers);
/// <summary>
/// Simulates drag'n'drop target on the headless window/toplevel.
/// </summary>
public static void DragDrop(this TopLevel topLevel, Point point, RawDragEventType type, IDataObject data,
DragDropEffects effects, RawInputModifiers modifiers = RawInputModifiers.None) =>
GetImpl(topLevel).DragDrop(point, type, data, effects, modifiers);

2
tests/Avalonia.Headless.UnitTests/RenderingTests.cs

@ -27,8 +27,6 @@ public class RenderingTests
};
window.Show();
Dispatcher.UIThread.RunJobs();
AvaloniaHeadlessPlatform.ForceRenderTimerTick();
var frame = window.CaptureRenderedFrame();
Assert.NotNull(frame);
}

Loading…
Cancel
Save