Browse Source

Check for Windows version in Direct2D platform

pull/896/head
Nikita Tsukanov 9 years ago
parent
commit
d7bee43015
  1. 5
      src/Avalonia.Controls/Platform/ExportWindowingSubsystemAttribute.cs
  2. 18
      src/Avalonia.DotNetFrameworkRuntime/AppBuilder.cs
  3. 1
      src/Avalonia.Visuals/Avalonia.Visuals.csproj
  4. 5
      src/Avalonia.Visuals/Platform/ExportRenderingSubsystemAttribute.cs
  5. 7
      src/Avalonia.Visuals/Platform/IModuleEnvironmentChecker.cs
  6. 1
      src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj
  7. 3
      src/Windows/Avalonia.Direct2D1/Properties/AssemblyInfo.cs
  8. 15
      src/Windows/Avalonia.Direct2D1/WindowsVersionChecker.cs

5
src/Avalonia.Controls/Platform/ExportWindowingSubsystemAttribute.cs

@ -9,16 +9,19 @@ namespace Avalonia.Platform
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
public class ExportWindowingSubsystemAttribute : Attribute
{
public ExportWindowingSubsystemAttribute(OperatingSystemType requiredRuntimePlatform, int priority, string name, Type initializationType, string initializationMethod)
public ExportWindowingSubsystemAttribute(OperatingSystemType requiredRuntimePlatform, int priority, string name, Type initializationType,
string initializationMethod, Type environmentChecker = null)
{
Name = name;
InitializationType = initializationType;
InitializationMethod = initializationMethod;
EnvironmentChecker = environmentChecker;
RequiredOS = requiredRuntimePlatform;
Priority = priority;
}
public string InitializationMethod { get; private set; }
public Type EnvironmentChecker { get; }
public Type InitializationType { get; private set; }
public string Name { get; private set; }
public int Priority { get; private set; }

18
src/Avalonia.DotNetFrameworkRuntime/AppBuilder.cs

@ -31,6 +31,20 @@ namespace Avalonia
Instance = app;
}
bool CheckEnvironment(Type checkerType)
{
if (checkerType == null)
return true;
try
{
return ((IModuleEnvironmentChecker) Activator.CreateInstance(checkerType)).IsCompatible;
}
catch
{
return false;
}
}
/// <summary>
/// Instructs the <see cref="AppBuilder"/> to use the best settings for the platform.
/// </summary>
@ -43,13 +57,13 @@ namespace Avalonia
var windowingSubsystemAttribute = (from assembly in RuntimePlatform.GetLoadedAssemblies()
from attribute in assembly.GetCustomAttributes<ExportWindowingSubsystemAttribute>()
where attribute.RequiredOS == os
where attribute.RequiredOS == os && CheckEnvironment(attribute.EnvironmentChecker)
orderby attribute.Priority ascending
select attribute).First();
var renderingSubsystemAttribute = (from assembly in RuntimePlatform.GetLoadedAssemblies()
from attribute in assembly.GetCustomAttributes<ExportRenderingSubsystemAttribute>()
where attribute.RequiredOS == os
where attribute.RequiredOS == os && CheckEnvironment(attribute.EnvironmentChecker)
where attribute.RequiresWindowingSubsystem == null
|| attribute.RequiresWindowingSubsystem == windowingSubsystemAttribute.Name
orderby attribute.Priority ascending

1
src/Avalonia.Visuals/Avalonia.Visuals.csproj

@ -102,6 +102,7 @@
<Compile Include="Media\Geometry.cs" />
<Compile Include="Media\IDrawingContext.cs" />
<Compile Include="Platform\ExportRenderingSubsystemAttribute.cs" />
<Compile Include="Platform\IModuleEnvironmentChecker.cs" />
<Compile Include="Rendering\IRenderer.cs" />
<Compile Include="Rendering\IRendererFactory.cs" />
<Compile Include="Rendering\IRenderLoop.cs" />

5
src/Avalonia.Visuals/Platform/ExportRenderingSubsystemAttribute.cs

@ -9,16 +9,19 @@ namespace Avalonia.Platform
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
public class ExportRenderingSubsystemAttribute : Attribute
{
public ExportRenderingSubsystemAttribute(OperatingSystemType requiredOS, int priority, string name, Type initializationType, string initializationMethod)
public ExportRenderingSubsystemAttribute(OperatingSystemType requiredOS, int priority, string name, Type initializationType, string initializationMethod,
Type environmentChecker = null)
{
Name = name;
InitializationType = initializationType;
InitializationMethod = initializationMethod;
EnvironmentChecker = environmentChecker;
RequiredOS = requiredOS;
Priority = priority;
}
public string InitializationMethod { get; private set; }
public Type EnvironmentChecker { get; }
public Type InitializationType { get; private set; }
public string Name { get; private set; }
public int Priority { get; private set; }

7
src/Avalonia.Visuals/Platform/IModuleEnvironmentChecker.cs

@ -0,0 +1,7 @@
namespace Avalonia.Platform
{
public interface IModuleEnvironmentChecker
{
bool IsCompatible { get; }
}
}

1
src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj

@ -83,6 +83,7 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RenderTarget.cs" />
<Compile Include="SwapChainRenderTarget.cs" />
<Compile Include="WindowsVersionChecker.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />

3
src/Windows/Avalonia.Direct2D1/Properties/AssemblyInfo.cs

@ -6,5 +6,6 @@ using Avalonia.Platform;
using Avalonia.Direct2D1;
[assembly: AssemblyTitle("Avalonia.Direct2D1")]
[assembly: ExportRenderingSubsystem(OperatingSystemType.WinNT, 1, "Direct2D1", typeof(Direct2D1Platform), nameof(Direct2D1Platform.Initialize))]
[assembly: ExportRenderingSubsystem(OperatingSystemType.WinNT, 1, "Direct2D1", typeof(Direct2D1Platform), nameof(Direct2D1Platform.Initialize),
typeof(WindowsVersionChecker))]

15
src/Windows/Avalonia.Direct2D1/WindowsVersionChecker.cs

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Avalonia.Platform;
namespace Avalonia.Direct2D1
{
class WindowsVersionChecker : IModuleEnvironmentChecker
{
//Direct2D backend doesn't work with Win7 anymore
public bool IsCompatible => Environment.OSVersion.Version >= new Version(6, 2);
}
}
Loading…
Cancel
Save