Browse Source

Unify IRuntimePlatform registration across backends

pull/11930/head
Max Katz 3 years ago
parent
commit
605d10b022
  1. 1
      src/Android/Avalonia.Android/AndroidPlatform.cs
  2. 1
      src/Avalonia.Base/Platform/IRuntimePlatform.cs
  3. 19
      src/Avalonia.Base/Platform/StandardRuntimePlatformServices.cs
  4. 54
      src/Avalonia.Controls/AppBuilder.cs
  5. 1
      src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs
  6. 4
      src/Avalonia.Native/AvaloniaNativePlatformExtensions.cs
  7. 4
      src/Avalonia.X11/X11Platform.cs
  8. 1
      src/Browser/Avalonia.Browser/BrowserAppBuilder.cs
  9. 18
      src/Browser/Avalonia.Browser/BrowserRuntimePlatform.cs
  10. 6
      src/Headless/Avalonia.Headless/AvaloniaHeadlessPlatform.cs
  11. 5
      src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs
  12. 4
      src/Windows/Avalonia.Win32/Win32Platform.cs
  13. 1
      src/iOS/Avalonia.iOS/Platform.cs

1
src/Android/Avalonia.Android/AndroidPlatform.cs

@ -18,6 +18,7 @@ namespace Avalonia
public static AppBuilder UseAndroid(this AppBuilder builder)
{
return builder
.UseStandardRuntimePlatformSubsystem()
.UseWindowingSubsystem(() => AndroidPlatform.Initialize(), "Android")
.UseSkia();
}

1
src/Avalonia.Base/Platform/IRuntimePlatform.cs

@ -18,7 +18,6 @@ namespace Avalonia.Platform
public bool IsMobile { get; set; }
}
[Unstable]
public enum FormFactorType
{
Unknown,

19
src/Avalonia.Base/Platform/StandardRuntimePlatformServices.cs

@ -3,18 +3,15 @@ using Avalonia.Compatibility;
using Avalonia.Platform.Internal;
using Avalonia.Platform.Interop;
namespace Avalonia.Platform
namespace Avalonia.Platform;
internal static class StandardRuntimePlatformServices
{
public static class StandardRuntimePlatformServices
public static void Register(Assembly? assembly = null)
{
public static void Register(Assembly? assembly = null)
{
var standardPlatform = new StandardRuntimePlatform();
AssetLoader.RegisterResUriParsers();
AvaloniaLocator.CurrentMutable
.Bind<IRuntimePlatform>().ToConstant(standardPlatform)
.Bind<IAssetLoader>().ToConstant(new StandardAssetLoader(assembly));
}
AssetLoader.RegisterResUriParsers();
AvaloniaLocator.CurrentMutable
.Bind<IRuntimePlatform>().ToSingleton<StandardRuntimePlatform>()
.Bind<IAssetLoader>().ToConstant(new StandardAssetLoader(assembly));
}
}

54
src/Avalonia.Controls/AppBuilder.cs

@ -12,23 +12,23 @@ namespace Avalonia
/// <summary>
/// Initializes platform-specific services for an <see cref="Application"/>.
/// </summary>
public class AppBuilder
public sealed class AppBuilder
{
private static bool s_setupWasAlreadyCalled;
private Action? _optionsInitializers;
private Func<Application>? _appFactory;
private IApplicationLifetime? _lifetime;
/// <summary>
/// Gets or sets the <see cref="IRuntimePlatform"/> instance.
/// </summary>
public IRuntimePlatform RuntimePlatform { get; set; }
/// <summary>
/// Gets or sets a method to call the initialize the runtime platform services (e. g. AssetLoader)
/// </summary>
public Action RuntimePlatformServicesInitializer { get; private set; }
public Action? RuntimePlatformServicesInitializer { get; private set; }
/// <summary>
/// Gets the name of the currently selected windowing subsystem.
/// </summary>
public string? RuntimePlatformServicesName { get; private set; }
/// <summary>
/// Gets the <see cref="Application"/> instance being initialized.
/// </summary>
@ -70,21 +70,10 @@ namespace Avalonia
/// <summary>
/// Initializes a new instance of the <see cref="AppBuilder"/> class.
/// </summary>
public AppBuilder()
: this(new StandardRuntimePlatform(),
builder => StandardRuntimePlatformServices.Register(builder.ApplicationType?.Assembly))
private AppBuilder()
{
}
/// <summary>
/// Initializes a new instance of the <see cref="AppBuilder"/> class.
/// </summary>
protected AppBuilder(IRuntimePlatform platform, Action<AppBuilder> platformServices)
{
RuntimePlatform = platform;
RuntimePlatformServicesInitializer = () => platformServices(this);
}
/// <summary>
/// Begin configuring an <see cref="Application"/>.
/// </summary>
@ -96,7 +85,6 @@ namespace Avalonia
return new AppBuilder()
{
ApplicationType = typeof(TApp),
// Needed for CoreRT compatibility
_appFactory = () => new TApp()
};
}
@ -155,7 +143,7 @@ namespace Avalonia
$"Input type either needs to have BuildAvaloniaApp -> AppBuilder method or inherit Application type.");
}
protected AppBuilder Self => this;
private AppBuilder Self => this;
public AppBuilder AfterSetup(Action<AppBuilder> callback)
{
@ -225,6 +213,30 @@ namespace Avalonia
RenderingSubsystemName = name;
return Self;
}
/// <summary>
/// Specifies a runtime platform subsystem to use.
/// </summary>
/// <param name="initializer">The method to call to initialize the runtime platform subsystem.</param>
/// <param name="name">The name of the runtime platform subsystem.</param>
/// <returns>An <see cref="AppBuilder"/> instance.</returns>
public AppBuilder UseRuntimePlatformSubsystem(Action initializer, string name = "")
{
RuntimePlatformServicesInitializer = initializer;
RuntimePlatformServicesName = name;
return Self;
}
/// <summary>
/// Specifies a standard runtime platform subsystem to use.
/// </summary>
/// <returns>An <see cref="AppBuilder"/> instance.</returns>
public AppBuilder UseStandardRuntimePlatformSubsystem()
{
RuntimePlatformServicesInitializer = () => StandardRuntimePlatformServices.Register(ApplicationType?.Assembly);
RuntimePlatformServicesName = nameof(StandardRuntimePlatform);
return Self;
}
/// <summary>
/// Configures platform-specific options

1
src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs

@ -138,6 +138,7 @@ namespace Avalonia.DesignerSupport.Remote
CommandLineArgs args, object obj)
{
var builder = (AppBuilder)obj;
builder = builder.UseStandardRuntimePlatformSubsystem();
if (args.Method == Methods.AvaloniaRemote)
builder.UseWindowingSubsystem(() => PreviewerWindowingPlatform.Initialize(transport));
if (args.Method == Methods.Html)

4
src/Avalonia.Native/AvaloniaNativePlatformExtensions.cs

@ -8,7 +8,9 @@ namespace Avalonia
{
public static AppBuilder UseAvaloniaNative(this AppBuilder builder)
{
builder.UseWindowingSubsystem(() =>
builder
.UseStandardRuntimePlatformSubsystem()
.UseWindowingSubsystem(() =>
{
var platform = AvaloniaNativePlatform.Initialize(
AvaloniaLocator.Current.GetService<AvaloniaNativePlatformOptions>() ??

4
src/Avalonia.X11/X11Platform.cs

@ -289,7 +289,9 @@ namespace Avalonia
{
public static AppBuilder UseX11(this AppBuilder builder)
{
builder.UseWindowingSubsystem(() =>
builder
.UseStandardRuntimePlatformSubsystem()
.UseWindowingSubsystem(() =>
new AvaloniaX11Platform().Initialize(AvaloniaLocator.Current.GetService<X11PlatformOptions>() ??
new X11PlatformOptions()));
return builder;

1
src/Browser/Avalonia.Browser/BrowserAppBuilder.cs

@ -98,6 +98,7 @@ public static class BrowserAppBuilder
this AppBuilder builder)
{
return builder
.UseBrowserRuntimePlatformSubsystem()
.UseWindowingSubsystem(BrowserWindowingPlatform.Register)
.UseSkia();
}

18
src/Browser/Avalonia.Browser/BrowserRuntimePlatform.cs

@ -1,4 +1,5 @@
using System;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.JavaScript;
using System.Text.RegularExpressions;
@ -7,6 +8,23 @@ using Avalonia.Platform;
namespace Avalonia.Browser;
internal static class BrowserRuntimePlatformServices
{
public static AppBuilder UseBrowserRuntimePlatformSubsystem(this AppBuilder builder)
{
builder.UseRuntimePlatformSubsystem(() => Register(builder.ApplicationType?.Assembly), nameof(BrowserRuntimePlatform));
return builder;
}
public static void Register(Assembly? assembly = null)
{
AssetLoader.RegisterResUriParsers();
AvaloniaLocator.CurrentMutable
.Bind<IRuntimePlatform>().ToSingleton<BrowserRuntimePlatform>()
.Bind<IAssetLoader>().ToConstant(new StandardAssetLoader(assembly));
}
}
internal class BrowserRuntimePlatform : StandardRuntimePlatform
{
private static readonly Lazy<RuntimePlatformInfo> Info = new(() =>

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

@ -105,8 +105,10 @@ namespace Avalonia.Headless
public static AppBuilder UseHeadless(this AppBuilder builder, AvaloniaHeadlessPlatformOptions opts)
{
if(opts.UseHeadlessDrawing)
builder.UseRenderingSubsystem(HeadlessPlatformRenderInterface.Initialize, "Headless");
return builder.UseWindowingSubsystem(() => AvaloniaHeadlessPlatform.Initialize(opts), "Headless");
builder = builder.UseRenderingSubsystem(HeadlessPlatformRenderInterface.Initialize, "Headless");
return builder
.UseStandardRuntimePlatformSubsystem()
.UseWindowingSubsystem(() => AvaloniaHeadlessPlatform.Initialize(opts), "Headless");
}
}
}

5
src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs

@ -76,7 +76,10 @@ namespace Avalonia.LinuxFramebuffer
internal static LinuxFramebufferLifetime Initialize(AppBuilder builder, IOutputBackend outputBackend, IInputBackend? inputBackend)
{
var platform = new LinuxFramebufferPlatform(outputBackend);
builder.UseSkia().UseWindowingSubsystem(platform.Initialize, "fbdev");
builder
.UseStandardRuntimePlatformSubsystem()
.UseSkia()
.UseWindowingSubsystem(platform.Initialize, "fbdev");
return new LinuxFramebufferLifetime(platform._fb, inputBackend);
}
}

4
src/Windows/Avalonia.Win32/Win32Platform.cs

@ -25,7 +25,9 @@ namespace Avalonia
{
public static AppBuilder UseWin32(this AppBuilder builder)
{
return builder.UseWindowingSubsystem(
return builder
.UseStandardRuntimePlatformSubsystem()
.UseWindowingSubsystem(
() => Win32.Win32Platform.Initialize(
AvaloniaLocator.Current.GetService<Win32PlatformOptions>() ?? new Win32PlatformOptions()),
"Win32");

1
src/iOS/Avalonia.iOS/Platform.cs

@ -16,6 +16,7 @@ namespace Avalonia
public static AppBuilder UseiOS(this AppBuilder builder)
{
return builder
.UseStandardRuntimePlatformSubsystem()
.UseWindowingSubsystem(iOS.Platform.Register, "iOS")
.UseSkia();
}

Loading…
Cancel
Save