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) public static AppBuilder UseAndroid(this AppBuilder builder)
{ {
return builder return builder
.UseStandardRuntimePlatformSubsystem()
.UseWindowingSubsystem(() => AndroidPlatform.Initialize(), "Android") .UseWindowingSubsystem(() => AndroidPlatform.Initialize(), "Android")
.UseSkia(); .UseSkia();
} }

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

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

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

@ -3,18 +3,15 @@ using Avalonia.Compatibility;
using Avalonia.Platform.Internal; using Avalonia.Platform.Internal;
using Avalonia.Platform.Interop; 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) AssetLoader.RegisterResUriParsers();
{ AvaloniaLocator.CurrentMutable
var standardPlatform = new StandardRuntimePlatform(); .Bind<IRuntimePlatform>().ToSingleton<StandardRuntimePlatform>()
.Bind<IAssetLoader>().ToConstant(new StandardAssetLoader(assembly));
AssetLoader.RegisterResUriParsers();
AvaloniaLocator.CurrentMutable
.Bind<IRuntimePlatform>().ToConstant(standardPlatform)
.Bind<IAssetLoader>().ToConstant(new StandardAssetLoader(assembly));
}
} }
} }

54
src/Avalonia.Controls/AppBuilder.cs

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

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

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

4
src/Avalonia.Native/AvaloniaNativePlatformExtensions.cs

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

4
src/Avalonia.X11/X11Platform.cs

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

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

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

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

@ -1,4 +1,5 @@
using System; using System;
using System.Reflection;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Runtime.InteropServices.JavaScript; using System.Runtime.InteropServices.JavaScript;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
@ -7,6 +8,23 @@ using Avalonia.Platform;
namespace Avalonia.Browser; 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 internal class BrowserRuntimePlatform : StandardRuntimePlatform
{ {
private static readonly Lazy<RuntimePlatformInfo> Info = new(() => 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) public static AppBuilder UseHeadless(this AppBuilder builder, AvaloniaHeadlessPlatformOptions opts)
{ {
if(opts.UseHeadlessDrawing) if(opts.UseHeadlessDrawing)
builder.UseRenderingSubsystem(HeadlessPlatformRenderInterface.Initialize, "Headless"); builder = builder.UseRenderingSubsystem(HeadlessPlatformRenderInterface.Initialize, "Headless");
return builder.UseWindowingSubsystem(() => AvaloniaHeadlessPlatform.Initialize(opts), "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) internal static LinuxFramebufferLifetime Initialize(AppBuilder builder, IOutputBackend outputBackend, IInputBackend? inputBackend)
{ {
var platform = new LinuxFramebufferPlatform(outputBackend); var platform = new LinuxFramebufferPlatform(outputBackend);
builder.UseSkia().UseWindowingSubsystem(platform.Initialize, "fbdev"); builder
.UseStandardRuntimePlatformSubsystem()
.UseSkia()
.UseWindowingSubsystem(platform.Initialize, "fbdev");
return new LinuxFramebufferLifetime(platform._fb, inputBackend); 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) public static AppBuilder UseWin32(this AppBuilder builder)
{ {
return builder.UseWindowingSubsystem( return builder
.UseStandardRuntimePlatformSubsystem()
.UseWindowingSubsystem(
() => Win32.Win32Platform.Initialize( () => Win32.Win32Platform.Initialize(
AvaloniaLocator.Current.GetService<Win32PlatformOptions>() ?? new Win32PlatformOptions()), AvaloniaLocator.Current.GetService<Win32PlatformOptions>() ?? new Win32PlatformOptions()),
"Win32"); "Win32");

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

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

Loading…
Cancel
Save