committed by
GitHub
230 changed files with 8819 additions and 3203 deletions
@ -0,0 +1,469 @@ |
|||||
|
public class Packages |
||||
|
{ |
||||
|
public List<NuGetPackSettings> NuspecNuGetSettings { get; private set; } |
||||
|
public FilePath[] NugetPackages { get; private set; } |
||||
|
public FilePath[] BinFiles { get; private set; } |
||||
|
|
||||
|
public Packages(ICakeContext context, Parameters parameters) |
||||
|
{ |
||||
|
// NUGET NUSPECS |
||||
|
context.Information("Getting git modules:"); |
||||
|
|
||||
|
var ignoredSubModulesPaths = System.IO.File.ReadAllLines(".git/config").Where(m=>m.StartsWith("[submodule ")).Select(m => |
||||
|
{ |
||||
|
var path = m.Split(' ')[1].Trim("\"[] \t".ToArray()); |
||||
|
context.Information(path); |
||||
|
return ((DirectoryPath)context.Directory(path)).FullPath; |
||||
|
}).ToList(); |
||||
|
|
||||
|
var normalizePath = new Func<string, string>( |
||||
|
path => path.Replace(System.IO.Path.DirectorySeparatorChar, System.IO.Path.AltDirectorySeparatorChar).ToUpperInvariant()); |
||||
|
|
||||
|
// Key: Package Id |
||||
|
// Value is Tuple where Item1: Package Version, Item2: The packages.config file path. |
||||
|
var packageVersions = new Dictionary<string, IList<Tuple<string,string>>>(); |
||||
|
|
||||
|
System.IO.Directory.EnumerateFiles(((DirectoryPath)context.Directory("./src")).FullPath, "packages.config", SearchOption.AllDirectories).ToList().ForEach(fileName => |
||||
|
{ |
||||
|
if (!ignoredSubModulesPaths.Any(i => normalizePath(fileName).Contains(normalizePath(i)))) |
||||
|
{ |
||||
|
var file = new PackageReferenceFile(fileName); |
||||
|
foreach (PackageReference packageReference in file.GetPackageReferences()) |
||||
|
{ |
||||
|
IList<Tuple<string, string>> versions; |
||||
|
packageVersions.TryGetValue(packageReference.Id, out versions); |
||||
|
if (versions == null) |
||||
|
{ |
||||
|
versions = new List<Tuple<string, string>>(); |
||||
|
packageVersions[packageReference.Id] = versions; |
||||
|
} |
||||
|
versions.Add(Tuple.Create(packageReference.Version.ToString(), fileName)); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
context.Information("Checking installed NuGet package dependencies versions:"); |
||||
|
|
||||
|
packageVersions.ToList().ForEach(package => |
||||
|
{ |
||||
|
var packageVersion = package.Value.First().Item1; |
||||
|
bool isValidVersion = package.Value.All(x => x.Item1 == packageVersion); |
||||
|
if (!isValidVersion) |
||||
|
{ |
||||
|
context.Information("Error: package {0} has multiple versions installed:", package.Key); |
||||
|
foreach (var v in package.Value) |
||||
|
{ |
||||
|
context.Information("{0}, file: {1}", v.Item1, v.Item2); |
||||
|
} |
||||
|
throw new Exception("Detected multiple NuGet package version installed for different projects."); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
context.Information("Setting NuGet package dependencies versions:"); |
||||
|
|
||||
|
var SerilogVersion = packageVersions["Serilog"].FirstOrDefault().Item1; |
||||
|
var SplatVersion = packageVersions["Splat"].FirstOrDefault().Item1; |
||||
|
var SpracheVersion = packageVersions["Sprache"].FirstOrDefault().Item1; |
||||
|
var SystemReactiveVersion = packageVersions["System.Reactive"].FirstOrDefault().Item1; |
||||
|
var SkiaSharpVersion = packageVersions["SkiaSharp"].FirstOrDefault().Item1; |
||||
|
var SharpDXVersion = packageVersions["SharpDX"].FirstOrDefault().Item1; |
||||
|
var SharpDXDirect2D1Version = packageVersions["SharpDX.Direct2D1"].FirstOrDefault().Item1; |
||||
|
var SharpDXDirect3D11Version = packageVersions["SharpDX.Direct3D11"].FirstOrDefault().Item1; |
||||
|
var SharpDXDXGIVersion = packageVersions["SharpDX.DXGI"].FirstOrDefault().Item1; |
||||
|
|
||||
|
context.Information("Package: Serilog, version: {0}", SerilogVersion); |
||||
|
context.Information("Package: Splat, version: {0}", SplatVersion); |
||||
|
context.Information("Package: Sprache, version: {0}", SpracheVersion); |
||||
|
context.Information("Package: System.Reactive, version: {0}", SystemReactiveVersion); |
||||
|
context.Information("Package: SkiaSharp, version: {0}", SkiaSharpVersion); |
||||
|
context.Information("Package: SharpDX, version: {0}", SharpDXVersion); |
||||
|
context.Information("Package: SharpDX.Direct2D1, version: {0}", SharpDXDirect2D1Version); |
||||
|
context.Information("Package: SharpDX.Direct3D11, version: {0}", SharpDXDirect3D11Version); |
||||
|
context.Information("Package: SharpDX.DXGI, version: {0}", SharpDXDXGIVersion); |
||||
|
|
||||
|
var SetNuGetNuspecCommonProperties = new Action<NuGetPackSettings> ((nuspec) => { |
||||
|
nuspec.Version = parameters.Version; |
||||
|
nuspec.Authors = new [] { "Avalonia Team" }; |
||||
|
nuspec.Owners = new [] { "stevenk" }; |
||||
|
nuspec.LicenseUrl = new Uri("http://opensource.org/licenses/MIT"); |
||||
|
nuspec.ProjectUrl = new Uri("https://github.com/AvaloniaUI/Avalonia/"); |
||||
|
nuspec.RequireLicenseAcceptance = false; |
||||
|
nuspec.Symbols = false; |
||||
|
nuspec.NoPackageAnalysis = true; |
||||
|
nuspec.Description = "The Avalonia UI framework"; |
||||
|
nuspec.Copyright = "Copyright 2015"; |
||||
|
nuspec.Tags = new [] { "Avalonia" }; |
||||
|
}); |
||||
|
|
||||
|
var coreLibraries = new string[][] |
||||
|
{ |
||||
|
new [] { "./src/", "Avalonia.Animation", ".dll" }, |
||||
|
new [] { "./src/", "Avalonia.Animation", ".xml" }, |
||||
|
new [] { "./src/", "Avalonia.Base", ".dll" }, |
||||
|
new [] { "./src/", "Avalonia.Base", ".xml" }, |
||||
|
new [] { "./src/", "Avalonia.Controls", ".dll" }, |
||||
|
new [] { "./src/", "Avalonia.Controls", ".xml" }, |
||||
|
new [] { "./src/", "Avalonia.DesignerSupport", ".dll" }, |
||||
|
new [] { "./src/", "Avalonia.DesignerSupport", ".xml" }, |
||||
|
new [] { "./src/", "Avalonia.Diagnostics", ".dll" }, |
||||
|
new [] { "./src/", "Avalonia.Diagnostics", ".xml" }, |
||||
|
new [] { "./src/", "Avalonia.Input", ".dll" }, |
||||
|
new [] { "./src/", "Avalonia.Input", ".xml" }, |
||||
|
new [] { "./src/", "Avalonia.Interactivity", ".dll" }, |
||||
|
new [] { "./src/", "Avalonia.Interactivity", ".xml" }, |
||||
|
new [] { "./src/", "Avalonia.Layout", ".dll" }, |
||||
|
new [] { "./src/", "Avalonia.Layout", ".xml" }, |
||||
|
new [] { "./src/", "Avalonia.Logging.Serilog", ".dll" }, |
||||
|
new [] { "./src/", "Avalonia.Logging.Serilog", ".xml" }, |
||||
|
new [] { "./src/", "Avalonia.Visuals", ".dll" }, |
||||
|
new [] { "./src/", "Avalonia.Visuals", ".xml" }, |
||||
|
new [] { "./src/", "Avalonia.Styling", ".dll" }, |
||||
|
new [] { "./src/", "Avalonia.Styling", ".xml" }, |
||||
|
new [] { "./src/", "Avalonia.ReactiveUI", ".dll" }, |
||||
|
new [] { "./src/", "Avalonia.Themes.Default", ".dll" }, |
||||
|
new [] { "./src/", "Avalonia.Themes.Default", ".xml" }, |
||||
|
new [] { "./src/Markup/", "Avalonia.Markup", ".dll" }, |
||||
|
new [] { "./src/Markup/", "Avalonia.Markup", ".xml" }, |
||||
|
new [] { "./src/Markup/", "Avalonia.Markup.Xaml", ".dll" }, |
||||
|
new [] { "./src/Markup/", "Avalonia.Markup.Xaml", ".xml" } |
||||
|
}; |
||||
|
|
||||
|
var coreLibrariesFiles = coreLibraries.Select((lib) => { |
||||
|
return (FilePath)context.File(lib[0] + lib[1] + "/bin/" + parameters.DirSuffix + "/" + lib[1] + lib[2]); |
||||
|
}).ToList(); |
||||
|
|
||||
|
var coreLibrariesNuSpecContent = coreLibrariesFiles.Select((file) => { |
||||
|
return new NuSpecContent { |
||||
|
Source = file.FullPath, Target = "lib/portable-windows8+net45" |
||||
|
}; |
||||
|
}); |
||||
|
|
||||
|
var win32CoreLibrariesNuSpecContent = coreLibrariesFiles.Select((file) => { |
||||
|
return new NuSpecContent { |
||||
|
Source = file.FullPath, Target = "lib/net45" |
||||
|
}; |
||||
|
}); |
||||
|
|
||||
|
var netcoreappCoreLibrariesNuSpecContent = coreLibrariesFiles.Select((file) => { |
||||
|
return new NuSpecContent { |
||||
|
Source = file.FullPath, Target = "lib/netcoreapp1.0" |
||||
|
}; |
||||
|
}); |
||||
|
|
||||
|
var net45RuntimePlatformExtensions = new [] {".xml", ".dll"}; |
||||
|
var net45RuntimePlatform = net45RuntimePlatformExtensions.Select(libSuffix => { |
||||
|
return new NuSpecContent { |
||||
|
Source = ((FilePath)context.File("./src/Avalonia.DotNetFrameworkRuntime/bin/" + parameters.DirSuffix + "/Avalonia.DotNetFrameworkRuntime" + libSuffix)).FullPath, |
||||
|
Target = "lib/net45" |
||||
|
}; |
||||
|
}); |
||||
|
|
||||
|
var netCoreRuntimePlatformExtensions = new [] {".xml", ".dll"}; |
||||
|
var netCoreRuntimePlatform = netCoreRuntimePlatformExtensions.Select(libSuffix => { |
||||
|
return new NuSpecContent { |
||||
|
Source = ((FilePath)context.File("./src/Avalonia.DotNetCoreRuntime/bin/" + parameters.DirSuffix + "/Avalonia.DotNetCoreRuntime" + libSuffix)).FullPath, |
||||
|
Target = "lib/netcoreapp1.0" |
||||
|
}; |
||||
|
}); |
||||
|
|
||||
|
var nuspecNuGetSettingsCore = new [] |
||||
|
{ |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
// Avalonia |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
new NuGetPackSettings() |
||||
|
{ |
||||
|
Id = "Avalonia", |
||||
|
Dependencies = new [] |
||||
|
{ |
||||
|
new NuSpecDependency() { Id = "Serilog", Version = SerilogVersion }, |
||||
|
new NuSpecDependency() { Id = "Splat", Version = SplatVersion }, |
||||
|
new NuSpecDependency() { Id = "Sprache", Version = SpracheVersion }, |
||||
|
new NuSpecDependency() { Id = "System.Reactive", Version = SystemReactiveVersion }, |
||||
|
new NuSpecDependency() { Id = "System.Threading.ThreadPool", TargetFramework = "netcoreapp1.0", Version = "4.3.0" }, |
||||
|
//.NET Core |
||||
|
new NuSpecDependency() { Id = "NETStandard.Library", TargetFramework = "netcoreapp1.0", Version = "1.6.0" }, |
||||
|
new NuSpecDependency() { Id = "Microsoft.NETCore.Portable.Compatibility", TargetFramework = "netcoreapp1.0", Version = "1.0.1" }, |
||||
|
new NuSpecDependency() { Id = "Splat", TargetFramework = "netcoreapp1.0", Version = "2.0.0" }, |
||||
|
new NuSpecDependency() { Id = "Serilog", TargetFramework = "netcoreapp1.0", Version = "2.3.0" }, |
||||
|
new NuSpecDependency() { Id = "Sprache", TargetFramework = "netcoreapp1.0", Version = SpracheVersion }, |
||||
|
new NuSpecDependency() { Id = "System.Reactive", TargetFramework = "netcoreapp1.0", Version = SystemReactiveVersion } |
||||
|
}, |
||||
|
Files = coreLibrariesNuSpecContent |
||||
|
.Concat(win32CoreLibrariesNuSpecContent).Concat(net45RuntimePlatform) |
||||
|
.Concat(netcoreappCoreLibrariesNuSpecContent).Concat(netCoreRuntimePlatform) |
||||
|
.ToList(), |
||||
|
BasePath = context.Directory("./"), |
||||
|
OutputDirectory = parameters.NugetRoot |
||||
|
}, |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
// Avalonia.HtmlRenderer |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
new NuGetPackSettings() |
||||
|
{ |
||||
|
Id = "Avalonia.HtmlRenderer", |
||||
|
Dependencies = new [] |
||||
|
{ |
||||
|
new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version } |
||||
|
}, |
||||
|
Files = new [] |
||||
|
{ |
||||
|
new NuSpecContent { Source = "Avalonia.HtmlRenderer.dll", Target = "lib/portable-windows8+net45" } |
||||
|
}, |
||||
|
BasePath = context.Directory("./src/Avalonia.HtmlRenderer/bin/" + parameters.DirSuffix), |
||||
|
OutputDirectory = parameters.NugetRoot |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
var nuspecNuGetSettingsMobile = new [] |
||||
|
{ |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
// Avalonia.Android |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
new NuGetPackSettings() |
||||
|
{ |
||||
|
Id = "Avalonia.Android", |
||||
|
Dependencies = new [] |
||||
|
{ |
||||
|
new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version }, |
||||
|
new NuSpecDependency() { Id = "Avalonia.Skia.Android", Version = parameters.Version } |
||||
|
}, |
||||
|
Files = new [] |
||||
|
{ |
||||
|
new NuSpecContent { Source = "Avalonia.Android.dll", Target = "lib/MonoAndroid10" } |
||||
|
}, |
||||
|
BasePath = context.Directory("./src/Android/Avalonia.Android/bin/" + parameters.DirSuffix), |
||||
|
OutputDirectory = parameters.NugetRoot |
||||
|
}, |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
// Avalonia.Skia.Android |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
new NuGetPackSettings() |
||||
|
{ |
||||
|
Id = "Avalonia.Skia.Android", |
||||
|
Dependencies = new [] |
||||
|
{ |
||||
|
new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version }, |
||||
|
new NuSpecDependency() { Id = "SkiaSharp", Version = SkiaSharpVersion } |
||||
|
}, |
||||
|
Files = new [] |
||||
|
{ |
||||
|
new NuSpecContent { Source = "Avalonia.Skia.Android.dll", Target = "lib/MonoAndroid10" } |
||||
|
}, |
||||
|
BasePath = context.Directory("./src/Skia/Avalonia.Skia.Android/bin/" + parameters.DirSuffix), |
||||
|
OutputDirectory = parameters.NugetRoot |
||||
|
}, |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
// Avalonia.iOS |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
new NuGetPackSettings() |
||||
|
{ |
||||
|
Id = "Avalonia.iOS", |
||||
|
Dependencies = new [] |
||||
|
{ |
||||
|
new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version }, |
||||
|
new NuSpecDependency() { Id = "Avalonia.Skia.iOS", Version = parameters.Version } |
||||
|
}, |
||||
|
Files = new [] |
||||
|
{ |
||||
|
new NuSpecContent { Source = "Avalonia.iOS.dll", Target = "lib/Xamarin.iOS10" } |
||||
|
}, |
||||
|
BasePath = context.Directory("./src/iOS/Avalonia.iOS/bin/" + parameters.DirSuffixIOS), |
||||
|
OutputDirectory = parameters.NugetRoot |
||||
|
}, |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
// Avalonia.Skia.iOS |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
new NuGetPackSettings() |
||||
|
{ |
||||
|
Id = "Avalonia.Skia.iOS", |
||||
|
Dependencies = new [] |
||||
|
{ |
||||
|
new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version }, |
||||
|
new NuSpecDependency() { Id = "SkiaSharp", Version = SkiaSharpVersion } |
||||
|
}, |
||||
|
Files = new [] |
||||
|
{ |
||||
|
new NuSpecContent { Source = "Avalonia.Skia.iOS.dll", Target = "lib/Xamarin.iOS10" } |
||||
|
}, |
||||
|
BasePath = context.Directory("./src/Skia/Avalonia.Skia.iOS/bin/" + parameters.DirSuffixIOS), |
||||
|
OutputDirectory = parameters.NugetRoot |
||||
|
}, |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
// Avalonia.Mobile |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
new NuGetPackSettings() |
||||
|
{ |
||||
|
Id = "Avalonia.Mobile", |
||||
|
Dependencies = new [] |
||||
|
{ |
||||
|
new NuSpecDependency() { Id = "Avalonia.Android", Version = parameters.Version }, |
||||
|
new NuSpecDependency() { Id = "Avalonia.iOS", Version = parameters.Version } |
||||
|
}, |
||||
|
Files = new NuSpecContent[] |
||||
|
{ |
||||
|
new NuSpecContent { Source = "licence.md", Target = "" } |
||||
|
}, |
||||
|
BasePath = context.Directory("./"), |
||||
|
OutputDirectory = parameters.NugetRoot |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
var nuspecNuGetSettingsDesktop = new [] |
||||
|
{ |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
// Avalonia.Win32 |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
new NuGetPackSettings() |
||||
|
{ |
||||
|
Id = "Avalonia.Win32", |
||||
|
Dependencies = new [] |
||||
|
{ |
||||
|
new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version } |
||||
|
}, |
||||
|
Files = new [] |
||||
|
{ |
||||
|
new NuSpecContent { Source = "Avalonia.Win32/bin/" + parameters.DirSuffix + "/Avalonia.Win32.dll", Target = "lib/net45" }, |
||||
|
new NuSpecContent { Source = "Avalonia.Win32.NetStandard/bin/" + parameters.DirSuffix + "/Avalonia.Win32.dll", Target = "lib/netstandard1.1" } |
||||
|
}, |
||||
|
BasePath = context.Directory("./src/Windows"), |
||||
|
OutputDirectory = parameters.NugetRoot |
||||
|
}, |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
// Avalonia.Direct2D1 |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
new NuGetPackSettings() |
||||
|
{ |
||||
|
Id = "Avalonia.Direct2D1", |
||||
|
Dependencies = new [] |
||||
|
{ |
||||
|
new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version }, |
||||
|
new NuSpecDependency() { Id = "SharpDX", Version = SharpDXVersion }, |
||||
|
new NuSpecDependency() { Id = "SharpDX.Direct2D1", Version = SharpDXDirect2D1Version }, |
||||
|
new NuSpecDependency() { Id = "SharpDX.Direct3D11", Version = SharpDXDirect3D11Version }, |
||||
|
new NuSpecDependency() { Id = "SharpDX.DXGI", Version = SharpDXDXGIVersion } |
||||
|
}, |
||||
|
Files = new [] |
||||
|
{ |
||||
|
new NuSpecContent { Source = "Avalonia.Direct2D1.dll", Target = "lib/net45" } |
||||
|
}, |
||||
|
BasePath = context.Directory("./src/Windows/Avalonia.Direct2D1/bin/" + parameters.DirSuffix), |
||||
|
OutputDirectory = parameters.NugetRoot |
||||
|
}, |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
// Avalonia.Gtk |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
new NuGetPackSettings() |
||||
|
{ |
||||
|
Id = "Avalonia.Gtk", |
||||
|
Dependencies = new [] |
||||
|
{ |
||||
|
new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version } |
||||
|
}, |
||||
|
Files = new [] |
||||
|
{ |
||||
|
new NuSpecContent { Source = "Avalonia.Gtk.dll", Target = "lib/net45" } |
||||
|
}, |
||||
|
BasePath = context.Directory("./src/Gtk/Avalonia.Gtk/bin/" + parameters.DirSuffix), |
||||
|
OutputDirectory = parameters.NugetRoot |
||||
|
}, |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
// Avalonia.Gtk3 |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
new NuGetPackSettings() |
||||
|
{ |
||||
|
Id = "Avalonia.Gtk3", |
||||
|
Dependencies = new [] |
||||
|
{ |
||||
|
new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version } |
||||
|
}, |
||||
|
Files = new [] |
||||
|
{ |
||||
|
new NuSpecContent { Source = "Avalonia.Gtk3.dll", Target = "lib/netstandard1.1" } |
||||
|
}, |
||||
|
BasePath = context.Directory("./src/Gtk/Avalonia.Gtk3/bin/" + parameters.DirSuffix), |
||||
|
OutputDirectory = parameters.NugetRoot |
||||
|
}, |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
// Avalonia.Cairo |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
new NuGetPackSettings() |
||||
|
{ |
||||
|
Id = "Avalonia.Cairo", |
||||
|
Dependencies = new [] |
||||
|
{ |
||||
|
new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version } |
||||
|
}, |
||||
|
Files = new [] |
||||
|
{ |
||||
|
new NuSpecContent { Source = "Avalonia.Cairo.dll", Target = "lib/net45" } |
||||
|
}, |
||||
|
BasePath = context.Directory("./src/Gtk/Avalonia.Cairo/bin/" + parameters.DirSuffix), |
||||
|
OutputDirectory = parameters.NugetRoot |
||||
|
}, |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
// Avalonia.Skia.Desktop |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
new NuGetPackSettings() |
||||
|
{ |
||||
|
Id = "Avalonia.Skia.Desktop", |
||||
|
Dependencies = new [] |
||||
|
{ |
||||
|
new NuSpecDependency() { Id = "Avalonia", Version = parameters.Version }, |
||||
|
new NuSpecDependency() { Id = "SkiaSharp", Version = SkiaSharpVersion }, |
||||
|
//.NET Core |
||||
|
new NuSpecDependency() { Id = "Avalonia", TargetFramework = "netcoreapp1.0", Version = parameters.Version }, |
||||
|
new NuSpecDependency() { Id = "SkiaSharp", TargetFramework = "netcoreapp1.0", Version = SkiaSharpVersion }, |
||||
|
new NuSpecDependency() { Id = "NETStandard.Library", TargetFramework = "netcoreapp1.0", Version = "1.6.0" }, |
||||
|
new NuSpecDependency() { Id = "Microsoft.NETCore.Portable.Compatibility", TargetFramework = "netcoreapp1.0", Version = "1.0.1" } |
||||
|
}, |
||||
|
Files = new [] |
||||
|
{ |
||||
|
new NuSpecContent { Source = "Avalonia.Skia.Desktop/bin/" + parameters.DirSuffixSkia + "/Avalonia.Skia.Desktop.dll", Target = "lib/net45" }, |
||||
|
new NuSpecContent { Source = "Avalonia.Skia.Desktop.NetStandard/bin/" + parameters.DirSuffix + "/Avalonia.Skia.Desktop.dll", Target = "lib/netcoreapp1.0" } |
||||
|
}, |
||||
|
BasePath = context.Directory("./src/Skia/"), |
||||
|
OutputDirectory = parameters.NugetRoot |
||||
|
}, |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
// Avalonia.Desktop |
||||
|
/////////////////////////////////////////////////////////////////////////////// |
||||
|
new NuGetPackSettings() |
||||
|
{ |
||||
|
Id = "Avalonia.Desktop", |
||||
|
Dependencies = new [] |
||||
|
{ |
||||
|
new NuSpecDependency() { Id = "Avalonia.Win32", Version = parameters.Version }, |
||||
|
new NuSpecDependency() { Id = "Avalonia.Direct2D1", Version = parameters.Version }, |
||||
|
new NuSpecDependency() { Id = "Avalonia.Gtk", Version = parameters.Version }, |
||||
|
new NuSpecDependency() { Id = "Avalonia.Cairo", Version = parameters.Version }, |
||||
|
new NuSpecDependency() { Id = "Avalonia.Skia.Desktop", Version = parameters.Version } |
||||
|
}, |
||||
|
Files = new NuSpecContent[] |
||||
|
{ |
||||
|
new NuSpecContent { Source = "licence.md", Target = "" } |
||||
|
}, |
||||
|
BasePath = context.Directory("./"), |
||||
|
OutputDirectory = parameters.NugetRoot |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
NuspecNuGetSettings = new List<NuGetPackSettings>(); |
||||
|
|
||||
|
NuspecNuGetSettings.AddRange(nuspecNuGetSettingsCore); |
||||
|
NuspecNuGetSettings.AddRange(nuspecNuGetSettingsDesktop); |
||||
|
NuspecNuGetSettings.AddRange(nuspecNuGetSettingsMobile); |
||||
|
|
||||
|
NuspecNuGetSettings.ForEach((nuspec) => SetNuGetNuspecCommonProperties(nuspec)); |
||||
|
|
||||
|
NugetPackages = NuspecNuGetSettings.Select(nuspec => { |
||||
|
return nuspec.OutputDirectory.CombineWithFilePath(string.Concat(nuspec.Id, ".", nuspec.Version, ".nupkg")); |
||||
|
}).ToArray(); |
||||
|
|
||||
|
BinFiles = NuspecNuGetSettings.SelectMany(nuspec => { |
||||
|
return nuspec.Files.Select(file => { |
||||
|
return ((DirectoryPath)nuspec.BasePath).CombineWithFilePath(file.Source); |
||||
|
}); |
||||
|
}).GroupBy(f => f.FullPath).Select(g => g.First()).ToArray(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,143 @@ |
|||||
|
public class Parameters |
||||
|
{ |
||||
|
public string Target { get; private set; } |
||||
|
public string Platform { get; private set; } |
||||
|
public string Configuration { get; private set; } |
||||
|
public bool SkipTests { get; private set; } |
||||
|
public string MainRepo { get; private set; } |
||||
|
public string MasterBranch { get; private set; } |
||||
|
public string AssemblyInfoPath { get; private set; } |
||||
|
public string ReleasePlatform { get; private set; } |
||||
|
public string ReleaseConfiguration { get; private set; } |
||||
|
public string MSBuildSolution { get; private set; } |
||||
|
public string XBuildSolution { get; private set; } |
||||
|
public bool IsPlatformAnyCPU { get; private set; } |
||||
|
public bool IsPlatformX86 { get; private set; } |
||||
|
public bool IsPlatformX64 { get; private set; } |
||||
|
public bool IsLocalBuild { get; private set; } |
||||
|
public bool IsRunningOnUnix { get; private set; } |
||||
|
public bool IsRunningOnWindows { get; private set; } |
||||
|
public bool IsRunningOnAppVeyor { get; private set; } |
||||
|
public bool IsPullRequest { get; private set; } |
||||
|
public bool IsMainRepo { get; private set; } |
||||
|
public bool IsMasterBranch { get; private set; } |
||||
|
public bool IsTagged { get; private set; } |
||||
|
public bool IsReleasable { get; private set; } |
||||
|
public bool IsMyGetRelease { get; private set; } |
||||
|
public bool IsNuGetRelease { get; private set; } |
||||
|
public string Version { get; private set; } |
||||
|
public DirectoryPath ArtifactsDir { get; private set; } |
||||
|
public DirectoryPath NugetRoot { get; private set; } |
||||
|
public DirectoryPath ZipRoot { get; private set; } |
||||
|
public DirectoryPath BinRoot { get; private set; } |
||||
|
public DirectoryPath TestsRoot { get; private set; } |
||||
|
public string DirSuffix { get; private set; } |
||||
|
public string DirSuffixSkia { get; private set; } |
||||
|
public string DirSuffixIOS { get; private set; } |
||||
|
public DirectoryPathCollection BuildDirs { get; private set; } |
||||
|
public string FileZipSuffix { get; private set; } |
||||
|
public FilePath ZipCoreArtifacts { get; private set; } |
||||
|
public DirectoryPath ZipSourceControlCatalogDesktopDirs { get; private set; } |
||||
|
public FilePath ZipTargetControlCatalogDesktopDirs { get; private set; } |
||||
|
|
||||
|
public Parameters(ICakeContext context) |
||||
|
{ |
||||
|
var buildSystem = context.BuildSystem(); |
||||
|
|
||||
|
// ARGUMENTS |
||||
|
Target = context.Argument("target", "Default"); |
||||
|
Platform = context.Argument("platform", "Any CPU"); |
||||
|
Configuration = context.Argument("configuration", "Release"); |
||||
|
SkipTests = context.HasArgument("skip-tests"); |
||||
|
|
||||
|
// CONFIGURATION |
||||
|
MainRepo = "AvaloniaUI/Avalonia"; |
||||
|
MasterBranch = "master"; |
||||
|
AssemblyInfoPath = context.File("./src/Shared/SharedAssemblyInfo.cs"); |
||||
|
ReleasePlatform = "Any CPU"; |
||||
|
ReleaseConfiguration = "Release"; |
||||
|
MSBuildSolution = "./Avalonia.sln"; |
||||
|
XBuildSolution = "./Avalonia.XBuild.sln"; |
||||
|
|
||||
|
// PARAMETERS |
||||
|
IsPlatformAnyCPU = StringComparer.OrdinalIgnoreCase.Equals(Platform, "Any CPU"); |
||||
|
IsPlatformX86 = StringComparer.OrdinalIgnoreCase.Equals(Platform, "x86"); |
||||
|
IsPlatformX64 = StringComparer.OrdinalIgnoreCase.Equals(Platform, "x64"); |
||||
|
IsLocalBuild = buildSystem.IsLocalBuild; |
||||
|
IsRunningOnUnix = context.IsRunningOnUnix(); |
||||
|
IsRunningOnWindows = context.IsRunningOnWindows(); |
||||
|
IsRunningOnAppVeyor = buildSystem.AppVeyor.IsRunningOnAppVeyor; |
||||
|
IsPullRequest = buildSystem.AppVeyor.Environment.PullRequest.IsPullRequest; |
||||
|
IsMainRepo = StringComparer.OrdinalIgnoreCase.Equals(MainRepo, buildSystem.AppVeyor.Environment.Repository.Name); |
||||
|
IsMasterBranch = StringComparer.OrdinalIgnoreCase.Equals(MasterBranch, buildSystem.AppVeyor.Environment.Repository.Branch); |
||||
|
IsTagged = buildSystem.AppVeyor.Environment.Repository.Tag.IsTag |
||||
|
&& !string.IsNullOrWhiteSpace(buildSystem.AppVeyor.Environment.Repository.Tag.Name); |
||||
|
IsReleasable = StringComparer.OrdinalIgnoreCase.Equals(ReleasePlatform, Platform) |
||||
|
&& StringComparer.OrdinalIgnoreCase.Equals(ReleaseConfiguration, Configuration); |
||||
|
IsMyGetRelease = !IsTagged && IsReleasable; |
||||
|
IsNuGetRelease = IsTagged && IsReleasable; |
||||
|
|
||||
|
// VERSION |
||||
|
Version = context.Argument("force-nuget-version", context.ParseAssemblyInfo(AssemblyInfoPath).AssemblyVersion); |
||||
|
|
||||
|
if (IsRunningOnAppVeyor) |
||||
|
{ |
||||
|
if (IsTagged) |
||||
|
{ |
||||
|
// Use Tag Name as version |
||||
|
Version = buildSystem.AppVeyor.Environment.Repository.Tag.Name; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
// Use AssemblyVersion with Build as version |
||||
|
Version += "-build" + context.EnvironmentVariable("APPVEYOR_BUILD_NUMBER") + "-alpha"; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// DIRECTORIES |
||||
|
ArtifactsDir = (DirectoryPath)context.Directory("./artifacts"); |
||||
|
NugetRoot = ArtifactsDir.Combine("nuget"); |
||||
|
ZipRoot = ArtifactsDir.Combine("zip"); |
||||
|
BinRoot = ArtifactsDir.Combine("bin"); |
||||
|
TestsRoot = ArtifactsDir.Combine("tests"); |
||||
|
|
||||
|
DirSuffix = Configuration; |
||||
|
DirSuffixSkia = (IsPlatformAnyCPU ? "x86" : Platform) + "/" + Configuration; |
||||
|
DirSuffixIOS = "iPhone" + "/" + Configuration; |
||||
|
|
||||
|
BuildDirs = |
||||
|
context.GetDirectories("./src/**/bin/" + DirSuffix) + |
||||
|
context.GetDirectories("./src/**/obj/" + DirSuffix) + |
||||
|
context.GetDirectories("./src/Markup/**/bin/" + DirSuffix) + |
||||
|
context.GetDirectories("./src/Markup/**/obj/" + DirSuffix) + |
||||
|
context.GetDirectories("./src/Android/**/bin/" + DirSuffix) + |
||||
|
context.GetDirectories("./src/Android/**/obj/" + DirSuffix) + |
||||
|
context.GetDirectories("./src/Gtk/**/bin/" + DirSuffix) + |
||||
|
context.GetDirectories("./src/Gtk/**/obj/" + DirSuffix) + |
||||
|
context.GetDirectories("./src/iOS/**/bin/" + DirSuffixIOS) + |
||||
|
context.GetDirectories("./src/iOS/**/obj/" + DirSuffixIOS) + |
||||
|
(DirectoryPath)context.Directory("./src/Skia/Avalonia.Skia.Android/bin/" + DirSuffix) + |
||||
|
(DirectoryPath)context.Directory("./src/Skia/Avalonia.Skia.Android/obj/" + DirSuffix) + |
||||
|
(DirectoryPath)context.Directory("./src/Skia/Avalonia.Skia.Android.TestApp/bin/" + DirSuffix) + |
||||
|
(DirectoryPath)context.Directory("./src/Skia/Avalonia.Skia.Android.TestApp/obj/" + DirSuffix) + |
||||
|
(DirectoryPath)context.Directory("./src/Skia/Avalonia.Skia.Desktop/bin/" + DirSuffixSkia) + |
||||
|
(DirectoryPath)context.Directory("./src/Skia/Avalonia.Skia.Desktop/obj/" + DirSuffixSkia) + |
||||
|
(DirectoryPath)context.Directory("./src/Skia/Avalonia.Skia.Desktop.NetStandard/bin/" + DirSuffix) + |
||||
|
(DirectoryPath)context.Directory("./src/Skia/Avalonia.Skia.Desktop.NetStandard/obj/" + DirSuffix) + |
||||
|
(DirectoryPath)context.Directory("./src/Skia/Avalonia.Skia.iOS/bin/" + DirSuffixIOS) + |
||||
|
(DirectoryPath)context.Directory("./src/Skia/Avalonia.Skia.iOS/obj/" + DirSuffixIOS) + |
||||
|
(DirectoryPath)context.Directory("./src/Skia/Avalonia.Skia.iOS.TestApp/bin/" + DirSuffixIOS) + |
||||
|
(DirectoryPath)context.Directory("./src/Skia/Avalonia.Skia.iOS.TestApp/obj/" + DirSuffixIOS) + |
||||
|
context.GetDirectories("./src/Windows/**/bin/" + DirSuffix) + |
||||
|
context.GetDirectories("./src/Windows/**/obj/" + DirSuffix) + |
||||
|
context.GetDirectories("./tests/**/bin/" + DirSuffix) + |
||||
|
context.GetDirectories("./tests/**/obj/" + DirSuffix) + |
||||
|
context.GetDirectories("./Samples/**/bin/" + DirSuffix) + |
||||
|
context.GetDirectories("./Samples/**/obj/" + DirSuffix); |
||||
|
|
||||
|
FileZipSuffix = Version + ".zip"; |
||||
|
ZipCoreArtifacts = ZipRoot.CombineWithFilePath("Avalonia-" + FileZipSuffix); |
||||
|
ZipSourceControlCatalogDesktopDirs = (DirectoryPath)context.Directory("./samples/ControlCatalog.Desktop/bin/" + DirSuffix); |
||||
|
ZipTargetControlCatalogDesktopDirs = ZipRoot.CombineWithFilePath("ControlCatalog.Desktop-" + FileZipSuffix); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,47 @@ |
|||||
|
using Android.App; |
||||
|
using Android.OS; |
||||
|
|
||||
|
namespace Avalonia.Android |
||||
|
{ |
||||
|
internal class ActivityTracker : Java.Lang.Object, global::Android.App.Application.IActivityLifecycleCallbacks |
||||
|
{ |
||||
|
public static Activity Current { get; private set; } |
||||
|
public void OnActivityCreated(Activity activity, Bundle savedInstanceState) |
||||
|
{ |
||||
|
Current = activity; |
||||
|
} |
||||
|
|
||||
|
public void OnActivityDestroyed(Activity activity) |
||||
|
{ |
||||
|
if (Current == activity) |
||||
|
Current = null; |
||||
|
} |
||||
|
|
||||
|
public void OnActivityPaused(Activity activity) |
||||
|
{ |
||||
|
if (Current == activity) |
||||
|
Current = null; |
||||
|
} |
||||
|
|
||||
|
public void OnActivityResumed(Activity activity) |
||||
|
{ |
||||
|
Current = activity; |
||||
|
} |
||||
|
|
||||
|
public void OnActivitySaveInstanceState(Activity activity, Bundle outState) |
||||
|
{ |
||||
|
Current = activity; |
||||
|
} |
||||
|
|
||||
|
public void OnActivityStarted(Activity activity) |
||||
|
{ |
||||
|
Current = activity; |
||||
|
} |
||||
|
|
||||
|
public void OnActivityStopped(Activity activity) |
||||
|
{ |
||||
|
if (Current == activity) |
||||
|
Current = null; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,26 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
|
||||
|
using Android.App; |
||||
|
using Android.Content; |
||||
|
using Android.OS; |
||||
|
using Android.Runtime; |
||||
|
using Android.Views; |
||||
|
using Android.Widget; |
||||
|
using Avalonia.Controls; |
||||
|
using Avalonia.Platform; |
||||
|
using Avalonia.Shared.PlatformSupport; |
||||
|
|
||||
|
namespace Avalonia |
||||
|
{ |
||||
|
public sealed class AppBuilder : AppBuilderBase<AppBuilder> |
||||
|
{ |
||||
|
public AppBuilder() : base(new StandardRuntimePlatform(), |
||||
|
builder => StandardRuntimePlatformServices.Register(builder.Instance?.GetType()?.Assembly)) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,51 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
|
||||
|
using Android.App; |
||||
|
using Android.Content; |
||||
|
using Android.OS; |
||||
|
using Android.Runtime; |
||||
|
using Android.Views; |
||||
|
using Android.Widget; |
||||
|
|
||||
|
namespace Avalonia.Android |
||||
|
{ |
||||
|
public abstract class AvaloniaActivity : Activity |
||||
|
{ |
||||
|
|
||||
|
internal AvaloniaView View; |
||||
|
object _content; |
||||
|
|
||||
|
protected override void OnCreate(Bundle savedInstanceState) |
||||
|
{ |
||||
|
RequestWindowFeature(WindowFeatures.NoTitle); |
||||
|
View = new AvaloniaView(this); |
||||
|
if(_content != null) |
||||
|
View.Content = _content; |
||||
|
SetContentView(View); |
||||
|
TakeKeyEvents(true); |
||||
|
base.OnCreate(savedInstanceState); |
||||
|
} |
||||
|
|
||||
|
public object Content |
||||
|
{ |
||||
|
get |
||||
|
{ |
||||
|
return _content; |
||||
|
} |
||||
|
set |
||||
|
{ |
||||
|
_content = value; |
||||
|
if (View != null) |
||||
|
View.Content = value; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public override bool DispatchKeyEvent(KeyEvent e) |
||||
|
{ |
||||
|
return View.DispatchKeyEvent(e); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,69 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
|
||||
|
using Android.App; |
||||
|
using Android.Content; |
||||
|
using Android.OS; |
||||
|
using Android.Runtime; |
||||
|
using Android.Views; |
||||
|
using Android.Widget; |
||||
|
using Avalonia.Android.Platform.SkiaPlatform; |
||||
|
using Avalonia.Controls; |
||||
|
using Avalonia.Controls.Embedding; |
||||
|
using Avalonia.Platform; |
||||
|
|
||||
|
namespace Avalonia.Android |
||||
|
{ |
||||
|
public class AvaloniaView : FrameLayout |
||||
|
{ |
||||
|
private readonly EmbeddableControlRoot _root; |
||||
|
private readonly ViewImpl _view; |
||||
|
|
||||
|
public AvaloniaView(Context context) : base(context) |
||||
|
{ |
||||
|
_view = new ViewImpl(context); |
||||
|
AddView(_view.View); |
||||
|
_root = new EmbeddableControlRoot(_view); |
||||
|
_root.Prepare(); |
||||
|
} |
||||
|
|
||||
|
public object Content |
||||
|
{ |
||||
|
get { return _root.Content; } |
||||
|
set { _root.Content = value; } |
||||
|
} |
||||
|
|
||||
|
public override bool DispatchKeyEvent(KeyEvent e) |
||||
|
{ |
||||
|
return _view.View.DispatchKeyEvent(e); |
||||
|
} |
||||
|
|
||||
|
class ViewImpl : TopLevelImpl, IEmbeddableWindowImpl |
||||
|
{ |
||||
|
public event Action LostFocus; |
||||
|
|
||||
|
public ViewImpl(Context context) : base(context) |
||||
|
{ |
||||
|
View.Focusable = true; |
||||
|
View.FocusChange += ViewImpl_FocusChange; |
||||
|
} |
||||
|
|
||||
|
private void ViewImpl_FocusChange(object sender, FocusChangeEventArgs e) |
||||
|
{ |
||||
|
if(!e.HasFocus) |
||||
|
LostFocus?.Invoke(); |
||||
|
} |
||||
|
|
||||
|
protected override void OnResized(Size size) |
||||
|
{ |
||||
|
MaxClientSize = size; |
||||
|
base.OnResized(size); |
||||
|
} |
||||
|
|
||||
|
public WindowState WindowState { get; set; } |
||||
|
public IDisposable ShowDialog() => null; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,105 @@ |
|||||
|
using System; |
||||
|
using System.Runtime.InteropServices; |
||||
|
using Android.Runtime; |
||||
|
using Android.Views; |
||||
|
using Avalonia.Controls.Platform.Surfaces; |
||||
|
|
||||
|
namespace Avalonia.Android.Platform.SkiaPlatform |
||||
|
{ |
||||
|
class AndroidFramebuffer : ILockedFramebuffer |
||||
|
{ |
||||
|
private IntPtr _window; |
||||
|
|
||||
|
public AndroidFramebuffer(Surface surface) |
||||
|
{ |
||||
|
if(surface == null) |
||||
|
throw new ArgumentNullException(nameof(surface)); |
||||
|
_window = ANativeWindow_fromSurface(JNIEnv.Handle, surface.Handle); |
||||
|
if (_window == IntPtr.Zero) |
||||
|
throw new Exception("Unable to obtain ANativeWindow"); |
||||
|
ANativeWindow_Buffer buffer; |
||||
|
var rc = new ARect() |
||||
|
{ |
||||
|
right = Width = ANativeWindow_getWidth(_window), |
||||
|
bottom = Height = ANativeWindow_getHeight(_window) |
||||
|
}; |
||||
|
ANativeWindow_lock(_window, out buffer, ref rc); |
||||
|
|
||||
|
Format = buffer.format == AndroidPixelFormat.WINDOW_FORMAT_RGB_565 |
||||
|
? PixelFormat.Rgb565 : PixelFormat.Rgba8888; |
||||
|
|
||||
|
RowBytes = buffer.stride * (Format == PixelFormat.Rgb565 ? 2 : 4); |
||||
|
Address = buffer.bits; |
||||
|
} |
||||
|
|
||||
|
public void Dispose() |
||||
|
{ |
||||
|
ANativeWindow_unlockAndPost(_window); |
||||
|
ANativeWindow_release(_window); |
||||
|
_window = IntPtr.Zero; |
||||
|
Address = IntPtr.Zero; |
||||
|
} |
||||
|
|
||||
|
public IntPtr Address { get; set; } |
||||
|
public int Width { get; } |
||||
|
public int Height { get; } |
||||
|
public int RowBytes { get; } |
||||
|
public Size Dpi { get; } = new Size(96, 96); |
||||
|
public PixelFormat Format { get; } |
||||
|
|
||||
|
[DllImport("android")] |
||||
|
internal static extern IntPtr ANativeWindow_fromSurface(IntPtr jniEnv, IntPtr handle); |
||||
|
[DllImport("android")] |
||||
|
internal static extern int ANativeWindow_getWidth(IntPtr window); |
||||
|
[DllImport("android")] |
||||
|
internal static extern int ANativeWindow_getHeight(IntPtr window); |
||||
|
[DllImport("android")] |
||||
|
internal static extern void ANativeWindow_release(IntPtr window); |
||||
|
[DllImport("android")] |
||||
|
internal static extern void ANativeWindow_unlockAndPost(IntPtr window); |
||||
|
|
||||
|
[DllImport("android")] |
||||
|
internal static extern int ANativeWindow_lock(IntPtr window, out ANativeWindow_Buffer outBuffer, ref ARect inOutDirtyBounds); |
||||
|
public enum AndroidPixelFormat |
||||
|
{ |
||||
|
WINDOW_FORMAT_RGBA_8888 = 1, |
||||
|
WINDOW_FORMAT_RGBX_8888 = 2, |
||||
|
WINDOW_FORMAT_RGB_565 = 4, |
||||
|
} |
||||
|
|
||||
|
internal struct ARect |
||||
|
{ |
||||
|
public int left; |
||||
|
public int top; |
||||
|
public int right; |
||||
|
public int bottom; |
||||
|
} |
||||
|
|
||||
|
internal struct ANativeWindow_Buffer |
||||
|
{ |
||||
|
// The number of pixels that are show horizontally.
|
||||
|
public int width; |
||||
|
|
||||
|
// The number of pixels that are shown vertically.
|
||||
|
public int height; |
||||
|
|
||||
|
// The number of *pixels* that a line in the buffer takes in
|
||||
|
// memory. This may be >= width.
|
||||
|
public int stride; |
||||
|
|
||||
|
// The format of the buffer. One of WINDOW_FORMAT_*
|
||||
|
public AndroidPixelFormat format; |
||||
|
|
||||
|
// The actual bits.
|
||||
|
public IntPtr bits; |
||||
|
|
||||
|
// Do not touch.
|
||||
|
uint reserved1; |
||||
|
uint reserved2; |
||||
|
uint reserved3; |
||||
|
uint reserved4; |
||||
|
uint reserved5; |
||||
|
uint reserved6; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1,44 +0,0 @@ |
|||||
using Android.Views; |
|
||||
using Avalonia.Android.Platform.Specific; |
|
||||
using Avalonia.Controls; |
|
||||
using Avalonia.Input; |
|
||||
using Avalonia.Platform; |
|
||||
|
|
||||
namespace Avalonia.Android.Platform.SkiaPlatform |
|
||||
{ |
|
||||
public class MainWindowImpl : |
|
||||
WindowImpl |
|
||||
, IWindowImpl |
|
||||
{ |
|
||||
public MainWindowImpl() |
|
||||
{ |
|
||||
} |
|
||||
|
|
||||
public new WindowState WindowState |
|
||||
{ |
|
||||
get { return WindowState.Normal; } |
|
||||
set { } |
|
||||
} |
|
||||
|
|
||||
protected override void Init() |
|
||||
{ |
|
||||
base.Init(); |
|
||||
|
|
||||
HandleEvents = true; |
|
||||
_keyboardHelper.ActivateAutoShowKeybord(); |
|
||||
} |
|
||||
|
|
||||
void ITopLevelImpl.Show() |
|
||||
{ |
|
||||
(Parent as ViewGroup)?.RemoveAllViews(); |
|
||||
AvaloniaLocator.Current.GetService<IAndroidActivity>().ContentView = this; |
|
||||
//this.Visibility = ViewStates.Visible;
|
|
||||
} |
|
||||
|
|
||||
void ITopLevelImpl.SetInputRoot(IInputRoot inputRoot) |
|
||||
{ |
|
||||
base.SetInputRoot(inputRoot); |
|
||||
_keyboardHelper.UpdateKeyboardState(inputRoot); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -0,0 +1,91 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
|
||||
|
using Android.App; |
||||
|
using Android.Content; |
||||
|
using Android.Graphics; |
||||
|
using Android.OS; |
||||
|
using Android.Runtime; |
||||
|
using Android.Views; |
||||
|
using Android.Widget; |
||||
|
using Avalonia.Platform; |
||||
|
|
||||
|
namespace Avalonia.Android.Platform.SkiaPlatform |
||||
|
{ |
||||
|
class PopupImpl : TopLevelImpl, IPopupImpl |
||||
|
{ |
||||
|
private Point _position; |
||||
|
private bool _isAdded; |
||||
|
public PopupImpl() : base(ActivityTracker.Current, true) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
private Size _clientSize = new Size(1, 1); |
||||
|
public override Size ClientSize |
||||
|
{ |
||||
|
get { return base.ClientSize; } |
||||
|
set |
||||
|
{ |
||||
|
if(View == null) |
||||
|
return; |
||||
|
_clientSize = value; |
||||
|
UpdateParams(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public override Point Position |
||||
|
{ |
||||
|
get { return _position; } |
||||
|
set |
||||
|
{ |
||||
|
_position = value; |
||||
|
PositionChanged?.Invoke(_position); |
||||
|
UpdateParams(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
WindowManagerLayoutParams CreateParams() => new WindowManagerLayoutParams(0, |
||||
|
WindowManagerFlags.NotTouchModal, Format.Translucent) |
||||
|
{ |
||||
|
Gravity = GravityFlags.Left | GravityFlags.Top, |
||||
|
WindowAnimations = 0, |
||||
|
X = (int) _position.X, |
||||
|
Y = (int) _position.Y, |
||||
|
Width = Math.Max(1, (int) _clientSize.Width), |
||||
|
Height = Math.Max(1, (int) _clientSize.Height) |
||||
|
}; |
||||
|
|
||||
|
void UpdateParams() |
||||
|
{ |
||||
|
if (_isAdded) |
||||
|
ActivityTracker.Current?.WindowManager?.UpdateViewLayout(View, CreateParams()); |
||||
|
} |
||||
|
|
||||
|
public override void Show() |
||||
|
{ |
||||
|
if (_isAdded) |
||||
|
return; |
||||
|
ActivityTracker.Current.WindowManager.AddView(View, CreateParams()); |
||||
|
_isAdded = true; |
||||
|
} |
||||
|
|
||||
|
public override void Hide() |
||||
|
{ |
||||
|
if (_isAdded) |
||||
|
{ |
||||
|
var wm = View.Context.ApplicationContext.GetSystemService(Context.WindowService) |
||||
|
.JavaCast<IWindowManager>(); |
||||
|
wm.RemoveView(View); |
||||
|
_isAdded = false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public override void Dispose() |
||||
|
{ |
||||
|
Hide(); |
||||
|
base.Dispose(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,225 @@ |
|||||
|
using Android.App; |
||||
|
using Android.Content; |
||||
|
using Android.Graphics; |
||||
|
using Android.Views; |
||||
|
using Avalonia.Android.Platform.Specific; |
||||
|
using Avalonia.Android.Platform.Specific.Helpers; |
||||
|
using Avalonia.Input; |
||||
|
using Avalonia.Input.Raw; |
||||
|
using Avalonia.Platform; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Reactive.Disposables; |
||||
|
using Avalonia.Controls; |
||||
|
using Avalonia.Controls.Platform.Surfaces; |
||||
|
|
||||
|
namespace Avalonia.Android.Platform.SkiaPlatform |
||||
|
{ |
||||
|
class TopLevelImpl : IAndroidView, ITopLevelImpl, IFramebufferPlatformSurface |
||||
|
|
||||
|
{ |
||||
|
private readonly AndroidKeyboardEventsHelper<TopLevelImpl> _keyboardHelper; |
||||
|
private readonly AndroidTouchEventsHelper<TopLevelImpl> _touchHelper; |
||||
|
private ViewImpl _view; |
||||
|
|
||||
|
public TopLevelImpl(Context context, bool placeOnTop = false) |
||||
|
{ |
||||
|
_view = new ViewImpl(context, this, placeOnTop); |
||||
|
_keyboardHelper = new AndroidKeyboardEventsHelper<TopLevelImpl>(this); |
||||
|
_touchHelper = new AndroidTouchEventsHelper<TopLevelImpl>(this, () => InputRoot, |
||||
|
p => GetAvaloniaPointFromEvent(p)); |
||||
|
|
||||
|
MaxClientSize = new Size(_view.Resources.DisplayMetrics.WidthPixels, |
||||
|
_view.Resources.DisplayMetrics.HeightPixels); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
private bool _handleEvents; |
||||
|
|
||||
|
public bool HandleEvents |
||||
|
{ |
||||
|
get { return _handleEvents; } |
||||
|
set |
||||
|
{ |
||||
|
_handleEvents = value; |
||||
|
_keyboardHelper.HandleEvents = _handleEvents; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public virtual Point GetAvaloniaPointFromEvent(MotionEvent e) => new Point(e.GetX(), e.GetY()); |
||||
|
|
||||
|
public IInputRoot InputRoot { get; private set; } |
||||
|
|
||||
|
public virtual Size ClientSize |
||||
|
{ |
||||
|
get |
||||
|
{ |
||||
|
if (_view == null) |
||||
|
return new Size(0, 0); |
||||
|
return new Size(_view.Width, _view.Height); |
||||
|
} |
||||
|
set |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public Action Closed { get; set; } |
||||
|
|
||||
|
public Action Deactivated { get; set; } |
||||
|
|
||||
|
public Action<RawInputEventArgs> Input { get; set; } |
||||
|
|
||||
|
public Size MaxClientSize { get; protected set; } |
||||
|
|
||||
|
public Action<Rect> Paint { get; set; } |
||||
|
|
||||
|
public Action<Size> Resized { get; set; } |
||||
|
|
||||
|
public Action<double> ScalingChanged { get; set; } |
||||
|
|
||||
|
public Action<Point> PositionChanged { get; set; } |
||||
|
|
||||
|
public View View => _view; |
||||
|
|
||||
|
Action ITopLevelImpl.Activated { get; set; } |
||||
|
|
||||
|
IPlatformHandle ITopLevelImpl.Handle => _view; |
||||
|
|
||||
|
public IEnumerable<object> Surfaces => new object[] {this}; |
||||
|
|
||||
|
public void Activate() |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
public virtual void Hide() |
||||
|
{ |
||||
|
_view.Visibility = ViewStates.Invisible; |
||||
|
} |
||||
|
|
||||
|
public void SetSystemDecorations(bool enabled) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
public void Invalidate(Rect rect) |
||||
|
{ |
||||
|
if (_view.Holder?.Surface?.IsValid == true) _view.Invalidate(); |
||||
|
} |
||||
|
|
||||
|
public Point PointToClient(Point point) |
||||
|
{ |
||||
|
return point; |
||||
|
} |
||||
|
|
||||
|
public Point PointToScreen(Point point) |
||||
|
{ |
||||
|
return point; |
||||
|
} |
||||
|
|
||||
|
public void SetCursor(IPlatformHandle cursor) |
||||
|
{ |
||||
|
//still not implemented
|
||||
|
} |
||||
|
|
||||
|
public void SetInputRoot(IInputRoot inputRoot) |
||||
|
{ |
||||
|
InputRoot = inputRoot; |
||||
|
} |
||||
|
|
||||
|
public void SetTitle(string title) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
public virtual void Show() |
||||
|
{ |
||||
|
_view.Visibility = ViewStates.Visible; |
||||
|
} |
||||
|
|
||||
|
public void BeginMoveDrag() |
||||
|
{ |
||||
|
//Not supported
|
||||
|
} |
||||
|
|
||||
|
public void BeginResizeDrag(WindowEdge edge) |
||||
|
{ |
||||
|
//Not supported
|
||||
|
} |
||||
|
|
||||
|
public virtual Point Position { get; set; } |
||||
|
|
||||
|
public double Scaling => 1; |
||||
|
|
||||
|
void Draw() |
||||
|
{ |
||||
|
Paint?.Invoke(new Rect(new Point(0, 0), ClientSize)); |
||||
|
} |
||||
|
|
||||
|
public void SetIcon(IWindowIconImpl icon) |
||||
|
{ |
||||
|
// No window icons for mobile platforms
|
||||
|
} |
||||
|
|
||||
|
public virtual void Dispose() |
||||
|
{ |
||||
|
_view.Dispose(); |
||||
|
_view = null; |
||||
|
} |
||||
|
|
||||
|
protected virtual void OnResized(Size size) |
||||
|
{ |
||||
|
Resized?.Invoke(size); |
||||
|
} |
||||
|
|
||||
|
class ViewImpl : InvalidationAwareSurfaceView, ISurfaceHolderCallback |
||||
|
{ |
||||
|
private readonly TopLevelImpl _tl; |
||||
|
private Size _oldSize; |
||||
|
public ViewImpl(Context context, TopLevelImpl tl, bool placeOnTop) : base(context) |
||||
|
{ |
||||
|
_tl = tl; |
||||
|
if (placeOnTop) |
||||
|
SetZOrderOnTop(true); |
||||
|
} |
||||
|
|
||||
|
protected override void Draw() |
||||
|
{ |
||||
|
_tl.Draw(); |
||||
|
} |
||||
|
|
||||
|
public override bool DispatchTouchEvent(MotionEvent e) |
||||
|
{ |
||||
|
bool callBase; |
||||
|
bool? result = _tl._touchHelper.DispatchTouchEvent(e, out callBase); |
||||
|
bool baseResult = callBase ? base.DispatchTouchEvent(e) : false; |
||||
|
|
||||
|
return result != null ? result.Value : baseResult; |
||||
|
} |
||||
|
|
||||
|
public override bool DispatchKeyEvent(KeyEvent e) |
||||
|
{ |
||||
|
bool callBase; |
||||
|
bool? res = _tl._keyboardHelper.DispatchKeyEvent(e, out callBase); |
||||
|
bool baseResult = callBase ? base.DispatchKeyEvent(e) : false; |
||||
|
|
||||
|
return res != null ? res.Value : baseResult; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void ISurfaceHolderCallback.SurfaceChanged(ISurfaceHolder holder, Format format, int width, int height) |
||||
|
{ |
||||
|
var newSize = new Size(width, height); |
||||
|
|
||||
|
if (newSize != _oldSize) |
||||
|
{ |
||||
|
_oldSize = newSize; |
||||
|
_tl.OnResized(newSize); |
||||
|
} |
||||
|
|
||||
|
base.SurfaceChanged(holder, format, width, height); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
ILockedFramebuffer IFramebufferPlatformSurface.Lock()=>new AndroidFramebuffer(_view.Holder.Surface); |
||||
|
} |
||||
|
} |
||||
@ -1,197 +0,0 @@ |
|||||
using Android.App; |
|
||||
using Android.Content; |
|
||||
using Android.Graphics; |
|
||||
using Android.Views; |
|
||||
using Avalonia.Android.Platform.Specific; |
|
||||
using Avalonia.Android.Platform.Specific.Helpers; |
|
||||
using Avalonia.Input; |
|
||||
using Avalonia.Input.Raw; |
|
||||
using Avalonia.Platform; |
|
||||
using Avalonia.Skia.Android; |
|
||||
using System; |
|
||||
using Avalonia.Controls; |
|
||||
|
|
||||
namespace Avalonia.Android.Platform.SkiaPlatform |
|
||||
{ |
|
||||
public class WindowImpl : SkiaView, IAndroidView, IWindowImpl, ISurfaceHolderCallback |
|
||||
{ |
|
||||
protected AndroidKeyboardEventsHelper<WindowImpl> _keyboardHelper; |
|
||||
|
|
||||
private AndroidTouchEventsHelper<WindowImpl> _touchHelper; |
|
||||
|
|
||||
public WindowImpl(Context context) : base((Activity)context) |
|
||||
{ |
|
||||
_keyboardHelper = new AndroidKeyboardEventsHelper<WindowImpl>(this); |
|
||||
_touchHelper = new AndroidTouchEventsHelper<WindowImpl>(this, () => InputRoot, p => GetAvaloniaPointFromEvent(p)); |
|
||||
|
|
||||
MaxClientSize = new Size(Resources.DisplayMetrics.WidthPixels, Resources.DisplayMetrics.HeightPixels); |
|
||||
ClientSize = MaxClientSize; |
|
||||
Init(); |
|
||||
} |
|
||||
|
|
||||
public WindowImpl() : this(AvaloniaLocator.Current.GetService<IAndroidActivity>().Activity) |
|
||||
{ |
|
||||
} |
|
||||
|
|
||||
void ISurfaceHolderCallback.SurfaceChanged(ISurfaceHolder holder, Format format, int width, int height) |
|
||||
{ |
|
||||
var newSize = new Size(width, height); |
|
||||
if (newSize != ClientSize) |
|
||||
{ |
|
||||
MaxClientSize = newSize; |
|
||||
ClientSize = newSize; |
|
||||
Resized?.Invoke(ClientSize); |
|
||||
} |
|
||||
|
|
||||
base.SurfaceChanged(holder, format, width, height); |
|
||||
} |
|
||||
|
|
||||
protected virtual void Init() |
|
||||
{ |
|
||||
} |
|
||||
|
|
||||
private bool _handleEvents; |
|
||||
|
|
||||
public bool HandleEvents |
|
||||
{ |
|
||||
get { return _handleEvents; } |
|
||||
set |
|
||||
{ |
|
||||
_handleEvents = value; |
|
||||
_keyboardHelper.HandleEvents = _handleEvents; |
|
||||
} |
|
||||
} |
|
||||
public WindowState WindowState |
|
||||
{ |
|
||||
get { return WindowState.Normal; } |
|
||||
set { } |
|
||||
} |
|
||||
|
|
||||
public virtual Point GetAvaloniaPointFromEvent(MotionEvent e) => new Point(e.GetX(), e.GetY()); |
|
||||
|
|
||||
public IInputRoot InputRoot { get; private set; } |
|
||||
|
|
||||
public Size ClientSize { get; set; } |
|
||||
|
|
||||
public Action Closed { get; set; } |
|
||||
|
|
||||
public Action Deactivated { get; set; } |
|
||||
|
|
||||
public Action<RawInputEventArgs> Input { get; set; } |
|
||||
|
|
||||
public Size MaxClientSize { get; private set; } |
|
||||
|
|
||||
public Action<Rect> Paint { get; set; } |
|
||||
|
|
||||
public Action<Size> Resized { get; set; } |
|
||||
|
|
||||
public Action<double> ScalingChanged { get; set; } |
|
||||
|
|
||||
public Action<Point> PositionChanged { get; set; } |
|
||||
|
|
||||
public View View => this; |
|
||||
|
|
||||
Action ITopLevelImpl.Activated { get; set; } |
|
||||
|
|
||||
IPlatformHandle ITopLevelImpl.Handle => this; |
|
||||
|
|
||||
public void Activate() |
|
||||
{ |
|
||||
} |
|
||||
|
|
||||
public void Hide() |
|
||||
{ |
|
||||
this.Visibility = ViewStates.Invisible; |
|
||||
} |
|
||||
|
|
||||
public void SetSystemDecorations(bool enabled) |
|
||||
{ |
|
||||
} |
|
||||
|
|
||||
public void SetCoverTaskbarWhenMaximized(bool enable) |
|
||||
{ |
|
||||
//Not supported
|
|
||||
} |
|
||||
|
|
||||
public void Invalidate(Rect rect) |
|
||||
{ |
|
||||
if (Holder?.Surface?.IsValid == true) base.Invalidate(); |
|
||||
} |
|
||||
|
|
||||
public Point PointToClient(Point point) |
|
||||
{ |
|
||||
return point; |
|
||||
} |
|
||||
|
|
||||
public Point PointToScreen(Point point) |
|
||||
{ |
|
||||
return point; |
|
||||
} |
|
||||
|
|
||||
public void SetCursor(IPlatformHandle cursor) |
|
||||
{ |
|
||||
//still not implemented
|
|
||||
} |
|
||||
|
|
||||
public void SetInputRoot(IInputRoot inputRoot) |
|
||||
{ |
|
||||
InputRoot = inputRoot; |
|
||||
} |
|
||||
|
|
||||
public void SetTitle(string title) |
|
||||
{ |
|
||||
} |
|
||||
|
|
||||
public void Show() |
|
||||
{ |
|
||||
this.Visibility = ViewStates.Visible; |
|
||||
} |
|
||||
|
|
||||
public void BeginMoveDrag() |
|
||||
{ |
|
||||
//Not supported
|
|
||||
} |
|
||||
|
|
||||
public void BeginResizeDrag(WindowEdge edge) |
|
||||
{ |
|
||||
//Not supported
|
|
||||
} |
|
||||
|
|
||||
public Point Position { get; set; } |
|
||||
|
|
||||
public double Scaling => 1; |
|
||||
|
|
||||
public IDisposable ShowDialog() |
|
||||
{ |
|
||||
throw new NotImplementedException(); |
|
||||
} |
|
||||
|
|
||||
public override bool DispatchTouchEvent(MotionEvent e) |
|
||||
{ |
|
||||
bool callBase; |
|
||||
bool? result = _touchHelper.DispatchTouchEvent(e, out callBase); |
|
||||
bool baseResult = callBase ? base.DispatchTouchEvent(e) : false; |
|
||||
|
|
||||
return result != null ? result.Value : baseResult; |
|
||||
} |
|
||||
|
|
||||
public override bool DispatchKeyEvent(KeyEvent e) |
|
||||
{ |
|
||||
bool callBase; |
|
||||
bool? res = _keyboardHelper.DispatchKeyEvent(e, out callBase); |
|
||||
bool baseResult = callBase ? base.DispatchKeyEvent(e) : false; |
|
||||
|
|
||||
return res != null ? res.Value : baseResult; |
|
||||
} |
|
||||
|
|
||||
protected override void Draw() |
|
||||
{ |
|
||||
Paint?.Invoke(new Rect(new Point(0, 0), ClientSize)); |
|
||||
} |
|
||||
|
|
||||
public void SetIcon(IWindowIconImpl icon) |
|
||||
{ |
|
||||
// No window icons for mobile platforms
|
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -1,60 +0,0 @@ |
|||||
using System; |
|
||||
using Android.App; |
|
||||
using Android.OS; |
|
||||
using Android.Views; |
|
||||
using Android.Widget; |
|
||||
|
|
||||
namespace Avalonia.Android.Platform.Specific |
|
||||
{ |
|
||||
public class AvaloniaActivity : Activity, IAndroidActivity |
|
||||
{ |
|
||||
private IAndroidView _contentView; |
|
||||
|
|
||||
public AvaloniaActivity(Type applicationType) |
|
||||
{ |
|
||||
AndroidPlatform.Instance.Init(applicationType); |
|
||||
} |
|
||||
|
|
||||
public Activity Activity => this; |
|
||||
|
|
||||
public IAndroidView ContentView |
|
||||
{ |
|
||||
get |
|
||||
{ |
|
||||
return this._contentView; |
|
||||
} |
|
||||
|
|
||||
set |
|
||||
{ |
|
||||
this._contentView = value; |
|
||||
var fl = new FrameLayout(this); |
|
||||
fl.AddView(this._contentView.View); |
|
||||
//this.SetContentView(value.View);
|
|
||||
this.SetContentView(fl); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
protected override void OnCreate(Bundle savedInstanceState) |
|
||||
{ |
|
||||
AvaloniaLocator.CurrentMutable.Bind<IAndroidActivity>().ToConstant(this); |
|
||||
RequestWindowFeature(WindowFeatures.NoTitle); |
|
||||
base.OnCreate(savedInstanceState); |
|
||||
} |
|
||||
|
|
||||
public override void SetContentView(View view) |
|
||||
{ |
|
||||
base.SetContentView(view); |
|
||||
TakeKeyEvents(true); |
|
||||
} |
|
||||
|
|
||||
public override bool DispatchKeyEvent(KeyEvent e) |
|
||||
{ |
|
||||
if (_contentView != null) |
|
||||
{ |
|
||||
_contentView.View.DispatchKeyEvent(e); |
|
||||
} |
|
||||
|
|
||||
return base.DispatchKeyEvent(e); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -1,12 +0,0 @@ |
|||||
using Android.App; |
|
||||
using Android.Views; |
|
||||
|
|
||||
namespace Avalonia.Android.Platform.Specific |
|
||||
{ |
|
||||
public interface IAndroidActivity |
|
||||
{ |
|
||||
Activity Activity { get; } |
|
||||
|
|
||||
IAndroidView ContentView { get; set; } |
|
||||
} |
|
||||
} |
|
||||
@ -0,0 +1,19 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Avalonia.Controls.Platform.Surfaces |
||||
|
{ |
||||
|
public interface IFramebufferPlatformSurface |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Provides a framebuffer descriptor for drawing.
|
||||
|
/// </summary>
|
||||
|
/// <remarks>
|
||||
|
/// Contents should be drawn on actual window after disposing
|
||||
|
/// </remarks>
|
||||
|
ILockedFramebuffer Lock(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,37 @@ |
|||||
|
using System; |
||||
|
|
||||
|
namespace Avalonia.Controls.Platform.Surfaces |
||||
|
{ |
||||
|
public interface ILockedFramebuffer : IDisposable |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Address of the first pixel
|
||||
|
/// </summary>
|
||||
|
IntPtr Address { get; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Framebuffer width
|
||||
|
/// </summary>
|
||||
|
int Width { get; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Framebuffer height
|
||||
|
/// </summary>
|
||||
|
int Height { get; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Number of bytes per row
|
||||
|
/// </summary>
|
||||
|
int RowBytes { get; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// DPI of underling screen
|
||||
|
/// </summary>
|
||||
|
Size Dpi { get; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Pixel format
|
||||
|
/// </summary>
|
||||
|
PixelFormat Format { get; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,15 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Avalonia.Controls.Platform.Surfaces |
||||
|
{ |
||||
|
public enum PixelFormat |
||||
|
{ |
||||
|
Rgb565, |
||||
|
Rgba8888, |
||||
|
Bgra8888 |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,56 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Reflection; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Avalonia.Controls; |
||||
|
using Avalonia.Platform; |
||||
|
using Avalonia.Shared.PlatformSupport; |
||||
|
|
||||
|
namespace Avalonia |
||||
|
{ |
||||
|
public sealed class AppBuilder : AppBuilderBase<AppBuilder> |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Initializes a new instance of the <see cref="AppBuilder"/> class.
|
||||
|
/// </summary>
|
||||
|
public AppBuilder() |
||||
|
: base(new StandardRuntimePlatform(), |
||||
|
builder => StandardRuntimePlatformServices.Register(builder.Instance?.GetType() |
||||
|
?.GetTypeInfo().Assembly)) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Initializes a new instance of the <see cref="AppBuilder"/> class.
|
||||
|
/// </summary>
|
||||
|
/// <param name="app">The <see cref="Application"/> instance.</param>
|
||||
|
public AppBuilder(Application app) : this() |
||||
|
{ |
||||
|
Instance = app; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Instructs the <see cref="AppBuilder"/> to use the best settings for the platform.
|
||||
|
/// </summary>
|
||||
|
/// <returns>An <see cref="AppBuilder"/> instance.</returns>
|
||||
|
public AppBuilder UsePlatformDetect() |
||||
|
{ |
||||
|
//We don't have the ability to load every assembly right now, so we are
|
||||
|
//stuck with manual configuration here
|
||||
|
//Helpers are extracted to separate methods to take the advantage of the fact
|
||||
|
//that CLR doesn't try to load dependencies before referencing method is jitted
|
||||
|
if (RuntimePlatform.GetRuntimeInfo().OperatingSystem == OperatingSystemType.WinNT) |
||||
|
LoadWin32(); |
||||
|
else |
||||
|
LoadGtk3(); |
||||
|
this.UseSkia(); |
||||
|
|
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
void LoadWin32() => this.UseWin32(); |
||||
|
void LoadGtk3() => this.UseGtk3(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,89 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> |
||||
|
<PropertyGroup> |
||||
|
<MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion> |
||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> |
||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> |
||||
|
<ProjectGuid>{7863EA94-F0FB-4386-BF8C-E5BFA761560A}</ProjectGuid> |
||||
|
<OutputType>Library</OutputType> |
||||
|
<AppDesignerFolder>Properties</AppDesignerFolder> |
||||
|
<RootNamespace>Avalonia.DotNetCoreRuntime</RootNamespace> |
||||
|
<AssemblyName>Avalonia.DotNetCoreRuntime</AssemblyName> |
||||
|
<DefaultLanguage>en-US</DefaultLanguage> |
||||
|
<FileAlignment>512</FileAlignment> |
||||
|
<ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> |
||||
|
<TargetFrameworkProfile> |
||||
|
</TargetFrameworkProfile> |
||||
|
<TargetFrameworkVersion>v5.0</TargetFrameworkVersion> |
||||
|
</PropertyGroup> |
||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> |
||||
|
<DebugSymbols>true</DebugSymbols> |
||||
|
<DebugType>full</DebugType> |
||||
|
<Optimize>false</Optimize> |
||||
|
<OutputPath>bin\Debug\</OutputPath> |
||||
|
<DefineConstants>TRACE;DEBUG;NETSTANDARD</DefineConstants> |
||||
|
<ErrorReport>prompt</ErrorReport> |
||||
|
<WarningLevel>4</WarningLevel> |
||||
|
<DocumentationFile>bin\Debug\Avalonia.DotNetCoreRuntime.XML</DocumentationFile> |
||||
|
</PropertyGroup> |
||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Release' "> |
||||
|
<DebugType>pdbonly</DebugType> |
||||
|
<Optimize>true</Optimize> |
||||
|
<OutputPath>bin\Release\</OutputPath> |
||||
|
<DefineConstants>TRACE;NETSTANDARD</DefineConstants> |
||||
|
<ErrorReport>prompt</ErrorReport> |
||||
|
<WarningLevel>4</WarningLevel> |
||||
|
<DocumentationFile>bin\Release\Avalonia.DotNetCoreRuntime.XML</DocumentationFile> |
||||
|
</PropertyGroup> |
||||
|
<ItemGroup> |
||||
|
<!-- A reference to the entire .NET Framework is automatically included --> |
||||
|
<None Include="project.json" /> |
||||
|
</ItemGroup> |
||||
|
<ItemGroup> |
||||
|
<Compile Include="..\Shared\SharedAssemblyInfo.cs"> |
||||
|
<Link>SharedAssemblyInfo.cs</Link> |
||||
|
</Compile> |
||||
|
<Compile Include="AppBuilder.cs" /> |
||||
|
<Compile Include="NetCoreRuntimePlatform.cs" /> |
||||
|
<Compile Include="RuntimeInfo.cs" /> |
||||
|
</ItemGroup> |
||||
|
<ItemGroup> |
||||
|
<ProjectReference Include="..\Avalonia.Base\Avalonia.Base.csproj"> |
||||
|
<Project>{b09b78d8-9b26-48b0-9149-d64a2f120f3f}</Project> |
||||
|
<Name>Avalonia.Base</Name> |
||||
|
</ProjectReference> |
||||
|
<ProjectReference Include="..\Avalonia.Controls\Avalonia.Controls.csproj"> |
||||
|
<Project>{d2221c82-4a25-4583-9b43-d791e3f6820c}</Project> |
||||
|
<Name>Avalonia.Controls</Name> |
||||
|
</ProjectReference> |
||||
|
<ProjectReference Include="..\Avalonia.Visuals\Avalonia.Visuals.csproj"> |
||||
|
<Project>{eb582467-6abb-43a1-b052-e981ba910e3a}</Project> |
||||
|
<Name>Avalonia.Visuals</Name> |
||||
|
</ProjectReference> |
||||
|
<ProjectReference Include="..\Gtk\Avalonia.Gtk3\Avalonia.Gtk3.csproj"> |
||||
|
<Project>{bb1f7bb5-6ad4-4776-94d9-c09d0a972658}</Project> |
||||
|
<Name>Avalonia.Gtk3</Name> |
||||
|
</ProjectReference> |
||||
|
<ProjectReference Include="..\Skia\Avalonia.Skia.Desktop.NetStandard\Avalonia.Skia.Desktop.NetStandard.csproj"> |
||||
|
<Project>{7d2d3083-71dd-4cc9-8907-39a0d86fb322}</Project> |
||||
|
<Name>Avalonia.Skia.Desktop.NetStandard</Name> |
||||
|
</ProjectReference> |
||||
|
<ProjectReference Include="..\Windows\Avalonia.Win32.NetStandard\Avalonia.Win32.NetStandard.csproj"> |
||||
|
<Project>{40759a76-d0f2-464e-8000-6ff0f5c4bd7c}</Project> |
||||
|
<Name>Avalonia.Win32.NetStandard</Name> |
||||
|
</ProjectReference> |
||||
|
</ItemGroup> |
||||
|
<ItemGroup> |
||||
|
<Folder Include="Properties\" /> |
||||
|
</ItemGroup> |
||||
|
<Import Project="..\Shared\PlatformSupport\PlatformSupport.projitems" Label="Shared" /> |
||||
|
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" /> |
||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. |
||||
|
Other similar extension points exist, see Microsoft.Common.targets. |
||||
|
<Target Name="BeforeBuild"> |
||||
|
</Target> |
||||
|
<Target Name="AfterBuild"> |
||||
|
</Target> |
||||
|
--> |
||||
|
</Project> |
||||
@ -0,0 +1,47 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Diagnostics; |
||||
|
using System.Linq; |
||||
|
using System.Reflection; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Avalonia.Shared.PlatformSupport |
||||
|
{ |
||||
|
internal partial class StandardRuntimePlatform |
||||
|
{ |
||||
|
private static readonly Lazy<Assembly[]> Assemblies = new Lazy<Assembly[]>(LoadAssemblies); |
||||
|
public Assembly[] GetLoadedAssemblies() => Assemblies.Value; |
||||
|
|
||||
|
static Assembly[] LoadAssemblies() |
||||
|
{ |
||||
|
|
||||
|
var rv = new List<Assembly>(); |
||||
|
var entry = Assembly.GetEntryAssembly(); |
||||
|
rv.Add(entry); |
||||
|
var queue = new Queue<AssemblyName>(entry.GetReferencedAssemblies()); |
||||
|
var aset = new HashSet<string>(queue.Select(r => r.ToString())); |
||||
|
|
||||
|
while (queue.Count > 0) |
||||
|
{ |
||||
|
Assembly asm; |
||||
|
try |
||||
|
{ |
||||
|
asm = Assembly.Load(queue.Dequeue()); |
||||
|
} |
||||
|
catch (Exception e) |
||||
|
{ |
||||
|
Debug.Write(e.ToString()); |
||||
|
continue; |
||||
|
} |
||||
|
rv.Add(asm); |
||||
|
foreach (var r in asm.GetReferencedAssemblies()) |
||||
|
{ |
||||
|
if (aset.Add(r.ToString())) |
||||
|
queue.Enqueue(r); |
||||
|
} |
||||
|
} |
||||
|
return rv.Distinct().ToArray(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,41 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Runtime.InteropServices; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Avalonia.Platform; |
||||
|
|
||||
|
|
||||
|
namespace Avalonia.Shared.PlatformSupport |
||||
|
{ |
||||
|
internal partial class StandardRuntimePlatform |
||||
|
{ |
||||
|
private static readonly Lazy<RuntimePlatformInfo> Info = new Lazy<RuntimePlatformInfo>(() => |
||||
|
{ |
||||
|
OperatingSystemType os; |
||||
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) |
||||
|
os = OperatingSystemType.OSX; |
||||
|
else if(RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) |
||||
|
os = OperatingSystemType.Linux; |
||||
|
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) |
||||
|
os = OperatingSystemType.WinNT; |
||||
|
else |
||||
|
throw new Exception("Unknown OS platform " + RuntimeInformation.OSDescription); |
||||
|
|
||||
|
return new RuntimePlatformInfo |
||||
|
{ |
||||
|
IsCoreClr = true, |
||||
|
IsDesktop = true, |
||||
|
IsDotNetFramework = false, |
||||
|
IsMono = false, |
||||
|
IsMobile = false, |
||||
|
IsUnix = os != OperatingSystemType.WinNT, |
||||
|
OperatingSystem = os, |
||||
|
}; |
||||
|
}); |
||||
|
|
||||
|
|
||||
|
public RuntimePlatformInfo GetRuntimeInfo() => Info.Value; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
{ |
||||
|
"supports": {}, |
||||
|
"dependencies": { |
||||
|
"Microsoft.NETCore.Portable.Compatibility": "1.0.1", |
||||
|
"NETStandard.Library": "1.6.0", |
||||
|
"System.Threading.ThreadPool": "4.3.0" |
||||
|
}, |
||||
|
"frameworks": { |
||||
|
"netstandard1.5": {} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,7 @@ |
|||||
|
namespace Avalonia.Platform |
||||
|
{ |
||||
|
public interface IModuleEnvironmentChecker |
||||
|
{ |
||||
|
bool IsCompatible { get; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,39 @@ |
|||||
|
using System; |
||||
|
using Avalonia.Controls.Platform.Surfaces; |
||||
|
|
||||
|
namespace Avalonia.Gtk |
||||
|
{ |
||||
|
class FramebufferManager : IFramebufferPlatformSurface, IDisposable |
||||
|
{ |
||||
|
private readonly WindowImplBase _window; |
||||
|
private SurfaceFramebuffer _fb; |
||||
|
|
||||
|
public FramebufferManager(WindowImplBase window) |
||||
|
{ |
||||
|
_window = window; |
||||
|
} |
||||
|
|
||||
|
public void Dispose() |
||||
|
{ |
||||
|
_fb?.Deallocate(); |
||||
|
} |
||||
|
|
||||
|
public ILockedFramebuffer Lock() |
||||
|
{ |
||||
|
if(_window.CurrentDrawable == null) |
||||
|
throw new InvalidOperationException("Window is not in drawing state"); |
||||
|
|
||||
|
var drawable = _window.CurrentDrawable; |
||||
|
var width = (int) _window.ClientSize.Width; |
||||
|
var height = (int) _window.ClientSize.Height; |
||||
|
if (_fb == null || _fb.Width != width || |
||||
|
_fb.Height != height) |
||||
|
{ |
||||
|
_fb?.Deallocate(); |
||||
|
_fb = new SurfaceFramebuffer(width, height); |
||||
|
} |
||||
|
_fb.SetDrawable(drawable); |
||||
|
return _fb; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,224 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Avalonia.Input; |
||||
|
#if GTK3_PINVOKE
|
||||
|
using Avalonia.Gtk3; |
||||
|
#else
|
||||
|
using GdkKey = Gdk.Key; |
||||
|
#endif
|
||||
|
namespace Avalonia.Gtk.Common |
||||
|
{ |
||||
|
static class KeyTransform |
||||
|
{ |
||||
|
private static readonly Dictionary<GdkKey, Key> KeyDic = new Dictionary<GdkKey, Key> |
||||
|
{ |
||||
|
{ GdkKey.Cancel, Key.Cancel }, |
||||
|
{ GdkKey.BackSpace, Key.Back }, |
||||
|
{ GdkKey.Tab, Key.Tab }, |
||||
|
{ GdkKey.Linefeed, Key.LineFeed }, |
||||
|
{ GdkKey.Clear, Key.Clear }, |
||||
|
{ GdkKey.Return, Key.Return }, |
||||
|
{ GdkKey.Pause, Key.Pause }, |
||||
|
//{ GdkKey.?, Key.CapsLock }
|
||||
|
//{ GdkKey.?, Key.HangulMode }
|
||||
|
//{ GdkKey.?, Key.JunjaMode }
|
||||
|
//{ GdkKey.?, Key.FinalMode }
|
||||
|
//{ GdkKey.?, Key.KanjiMode }
|
||||
|
{ GdkKey.Escape, Key.Escape }, |
||||
|
//{ GdkKey.?, Key.ImeConvert }
|
||||
|
//{ GdkKey.?, Key.ImeNonConvert }
|
||||
|
//{ GdkKey.?, Key.ImeAccept }
|
||||
|
//{ GdkKey.?, Key.ImeModeChange }
|
||||
|
{ GdkKey.space, Key.Space }, |
||||
|
{ GdkKey.Prior, Key.Prior }, |
||||
|
//{ GdkKey.?, Key.PageDown }
|
||||
|
{ GdkKey.End, Key.End }, |
||||
|
{ GdkKey.Home, Key.Home }, |
||||
|
{ GdkKey.Left, Key.Left }, |
||||
|
{ GdkKey.Up, Key.Up }, |
||||
|
{ GdkKey.Right, Key.Right }, |
||||
|
{ GdkKey.Down, Key.Down }, |
||||
|
{ GdkKey.Select, Key.Select }, |
||||
|
{ GdkKey.Print, Key.Print }, |
||||
|
{ GdkKey.Execute, Key.Execute }, |
||||
|
//{ GdkKey.?, Key.Snapshot }
|
||||
|
{ GdkKey.Insert, Key.Insert }, |
||||
|
{ GdkKey.Delete, Key.Delete }, |
||||
|
{ GdkKey.Help, Key.Help }, |
||||
|
//{ GdkKey.?, Key.D0 }
|
||||
|
//{ GdkKey.?, Key.D1 }
|
||||
|
//{ GdkKey.?, Key.D2 }
|
||||
|
//{ GdkKey.?, Key.D3 }
|
||||
|
//{ GdkKey.?, Key.D4 }
|
||||
|
//{ GdkKey.?, Key.D5 }
|
||||
|
//{ GdkKey.?, Key.D6 }
|
||||
|
//{ GdkKey.?, Key.D7 }
|
||||
|
//{ GdkKey.?, Key.D8 }
|
||||
|
//{ GdkKey.?, Key.D9 }
|
||||
|
{ GdkKey.A, Key.A }, |
||||
|
{ GdkKey.B, Key.B }, |
||||
|
{ GdkKey.C, Key.C }, |
||||
|
{ GdkKey.D, Key.D }, |
||||
|
{ GdkKey.E, Key.E }, |
||||
|
{ GdkKey.F, Key.F }, |
||||
|
{ GdkKey.G, Key.G }, |
||||
|
{ GdkKey.H, Key.H }, |
||||
|
{ GdkKey.I, Key.I }, |
||||
|
{ GdkKey.J, Key.J }, |
||||
|
{ GdkKey.K, Key.K }, |
||||
|
{ GdkKey.L, Key.L }, |
||||
|
{ GdkKey.M, Key.M }, |
||||
|
{ GdkKey.N, Key.N }, |
||||
|
{ GdkKey.O, Key.O }, |
||||
|
{ GdkKey.P, Key.P }, |
||||
|
{ GdkKey.Q, Key.Q }, |
||||
|
{ GdkKey.R, Key.R }, |
||||
|
{ GdkKey.S, Key.S }, |
||||
|
{ GdkKey.T, Key.T }, |
||||
|
{ GdkKey.U, Key.U }, |
||||
|
{ GdkKey.V, Key.V }, |
||||
|
{ GdkKey.W, Key.W }, |
||||
|
{ GdkKey.X, Key.X }, |
||||
|
{ GdkKey.Y, Key.Y }, |
||||
|
{ GdkKey.Z, Key.Z }, |
||||
|
{ GdkKey.a, Key.A }, |
||||
|
{ GdkKey.b, Key.B }, |
||||
|
{ GdkKey.c, Key.C }, |
||||
|
{ GdkKey.d, Key.D }, |
||||
|
{ GdkKey.e, Key.E }, |
||||
|
{ GdkKey.f, Key.F }, |
||||
|
{ GdkKey.g, Key.G }, |
||||
|
{ GdkKey.h, Key.H }, |
||||
|
{ GdkKey.i, Key.I }, |
||||
|
{ GdkKey.j, Key.J }, |
||||
|
{ GdkKey.k, Key.K }, |
||||
|
{ GdkKey.l, Key.L }, |
||||
|
{ GdkKey.m, Key.M }, |
||||
|
{ GdkKey.n, Key.N }, |
||||
|
{ GdkKey.o, Key.O }, |
||||
|
{ GdkKey.p, Key.P }, |
||||
|
{ GdkKey.q, Key.Q }, |
||||
|
{ GdkKey.r, Key.R }, |
||||
|
{ GdkKey.s, Key.S }, |
||||
|
{ GdkKey.t, Key.T }, |
||||
|
{ GdkKey.u, Key.U }, |
||||
|
{ GdkKey.v, Key.V }, |
||||
|
{ GdkKey.w, Key.W }, |
||||
|
{ GdkKey.x, Key.X }, |
||||
|
{ GdkKey.y, Key.Y }, |
||||
|
{ GdkKey.z, Key.Z }, |
||||
|
//{ GdkKey.?, Key.LWin }
|
||||
|
//{ GdkKey.?, Key.RWin }
|
||||
|
//{ GdkKey.?, Key.Apps }
|
||||
|
//{ GdkKey.?, Key.Sleep }
|
||||
|
//{ GdkKey.?, Key.NumPad0 }
|
||||
|
//{ GdkKey.?, Key.NumPad1 }
|
||||
|
//{ GdkKey.?, Key.NumPad2 }
|
||||
|
//{ GdkKey.?, Key.NumPad3 }
|
||||
|
//{ GdkKey.?, Key.NumPad4 }
|
||||
|
//{ GdkKey.?, Key.NumPad5 }
|
||||
|
//{ GdkKey.?, Key.NumPad6 }
|
||||
|
//{ GdkKey.?, Key.NumPad7 }
|
||||
|
//{ GdkKey.?, Key.NumPad8 }
|
||||
|
//{ GdkKey.?, Key.NumPad9 }
|
||||
|
{ GdkKey.multiply, Key.Multiply }, |
||||
|
//{ GdkKey.?, Key.Add }
|
||||
|
//{ GdkKey.?, Key.Separator }
|
||||
|
//{ GdkKey.?, Key.Subtract }
|
||||
|
//{ GdkKey.?, Key.Decimal }
|
||||
|
//{ GdkKey.?, Key.Divide }
|
||||
|
{ GdkKey.F1, Key.F1 }, |
||||
|
{ GdkKey.F2, Key.F2 }, |
||||
|
{ GdkKey.F3, Key.F3 }, |
||||
|
{ GdkKey.F4, Key.F4 }, |
||||
|
{ GdkKey.F5, Key.F5 }, |
||||
|
{ GdkKey.F6, Key.F6 }, |
||||
|
{ GdkKey.F7, Key.F7 }, |
||||
|
{ GdkKey.F8, Key.F8 }, |
||||
|
{ GdkKey.F9, Key.F9 }, |
||||
|
{ GdkKey.F10, Key.F10 }, |
||||
|
{ GdkKey.F11, Key.F11 }, |
||||
|
{ GdkKey.F12, Key.F12 }, |
||||
|
{ GdkKey.L3, Key.F13 }, |
||||
|
{ GdkKey.F14, Key.F14 }, |
||||
|
{ GdkKey.L5, Key.F15 }, |
||||
|
{ GdkKey.F16, Key.F16 }, |
||||
|
{ GdkKey.F17, Key.F17 }, |
||||
|
{ GdkKey.L8, Key.F18 }, |
||||
|
{ GdkKey.L9, Key.F19 }, |
||||
|
{ GdkKey.L10, Key.F20 }, |
||||
|
{ GdkKey.R1, Key.F21 }, |
||||
|
{ GdkKey.R2, Key.F22 }, |
||||
|
{ GdkKey.F23, Key.F23 }, |
||||
|
{ GdkKey.R4, Key.F24 }, |
||||
|
//{ GdkKey.?, Key.NumLock }
|
||||
|
//{ GdkKey.?, Key.Scroll }
|
||||
|
//{ GdkKey.?, Key.LeftShift }
|
||||
|
//{ GdkKey.?, Key.RightShift }
|
||||
|
//{ GdkKey.?, Key.LeftCtrl }
|
||||
|
//{ GdkKey.?, Key.RightCtrl }
|
||||
|
//{ GdkKey.?, Key.LeftAlt }
|
||||
|
//{ GdkKey.?, Key.RightAlt }
|
||||
|
//{ GdkKey.?, Key.BrowserBack }
|
||||
|
//{ GdkKey.?, Key.BrowserForward }
|
||||
|
//{ GdkKey.?, Key.BrowserRefresh }
|
||||
|
//{ GdkKey.?, Key.BrowserStop }
|
||||
|
//{ GdkKey.?, Key.BrowserSearch }
|
||||
|
//{ GdkKey.?, Key.BrowserFavorites }
|
||||
|
//{ GdkKey.?, Key.BrowserHome }
|
||||
|
//{ GdkKey.?, Key.VolumeMute }
|
||||
|
//{ GdkKey.?, Key.VolumeDown }
|
||||
|
//{ GdkKey.?, Key.VolumeUp }
|
||||
|
//{ GdkKey.?, Key.MediaNextTrack }
|
||||
|
//{ GdkKey.?, Key.MediaPreviousTrack }
|
||||
|
//{ GdkKey.?, Key.MediaStop }
|
||||
|
//{ GdkKey.?, Key.MediaPlayPause }
|
||||
|
//{ GdkKey.?, Key.LaunchMail }
|
||||
|
//{ GdkKey.?, Key.SelectMedia }
|
||||
|
//{ GdkKey.?, Key.LaunchApplication1 }
|
||||
|
//{ GdkKey.?, Key.LaunchApplication2 }
|
||||
|
//{ GdkKey.?, Key.OemSemicolon }
|
||||
|
//{ GdkKey.?, Key.OemPlus }
|
||||
|
//{ GdkKey.?, Key.OemComma }
|
||||
|
//{ GdkKey.?, Key.OemMinus }
|
||||
|
//{ GdkKey.?, Key.OemPeriod }
|
||||
|
//{ GdkKey.?, Key.Oem2 }
|
||||
|
//{ GdkKey.?, Key.OemTilde }
|
||||
|
//{ GdkKey.?, Key.AbntC1 }
|
||||
|
//{ GdkKey.?, Key.AbntC2 }
|
||||
|
//{ GdkKey.?, Key.Oem4 }
|
||||
|
//{ GdkKey.?, Key.OemPipe }
|
||||
|
//{ GdkKey.?, Key.OemCloseBrackets }
|
||||
|
//{ GdkKey.?, Key.Oem7 }
|
||||
|
//{ GdkKey.?, Key.Oem8 }
|
||||
|
//{ GdkKey.?, Key.Oem102 }
|
||||
|
//{ GdkKey.?, Key.ImeProcessed }
|
||||
|
//{ GdkKey.?, Key.System }
|
||||
|
//{ GdkKey.?, Key.OemAttn }
|
||||
|
//{ GdkKey.?, Key.OemFinish }
|
||||
|
//{ GdkKey.?, Key.DbeHiragana }
|
||||
|
//{ GdkKey.?, Key.OemAuto }
|
||||
|
//{ GdkKey.?, Key.DbeDbcsChar }
|
||||
|
//{ GdkKey.?, Key.OemBackTab }
|
||||
|
//{ GdkKey.?, Key.Attn }
|
||||
|
//{ GdkKey.?, Key.DbeEnterWordRegisterMode }
|
||||
|
//{ GdkKey.?, Key.DbeEnterImeConfigureMode }
|
||||
|
//{ GdkKey.?, Key.EraseEof }
|
||||
|
//{ GdkKey.?, Key.Play }
|
||||
|
//{ GdkKey.?, Key.Zoom }
|
||||
|
//{ GdkKey.?, Key.NoName }
|
||||
|
//{ GdkKey.?, Key.DbeEnterDialogConversionMode }
|
||||
|
//{ GdkKey.?, Key.OemClear }
|
||||
|
//{ GdkKey.?, Key.DeadCharProcessed }
|
||||
|
}; |
||||
|
|
||||
|
public static Key ConvertKey(GdkKey key) |
||||
|
{ |
||||
|
Key result; |
||||
|
return KeyDic.TryGetValue(key, out result) ? result : Key.None; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,55 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Avalonia.Controls.Platform.Surfaces; |
||||
|
using Avalonia.Platform; |
||||
|
using Cairo; |
||||
|
using Gdk; |
||||
|
|
||||
|
namespace Avalonia.Gtk |
||||
|
{ |
||||
|
class SurfaceFramebuffer : ILockedFramebuffer |
||||
|
{ |
||||
|
private Drawable _drawable; |
||||
|
private ImageSurface _surface; |
||||
|
|
||||
|
public SurfaceFramebuffer(int width, int height) |
||||
|
{ |
||||
|
_surface = new ImageSurface(Cairo.Format.RGB24, width, height); |
||||
|
} |
||||
|
|
||||
|
public void SetDrawable(Drawable drawable) |
||||
|
{ |
||||
|
_drawable = drawable; |
||||
|
_surface.Flush(); |
||||
|
} |
||||
|
|
||||
|
public void Deallocate() |
||||
|
{ |
||||
|
_surface.Dispose(); |
||||
|
_surface = null; |
||||
|
} |
||||
|
|
||||
|
public void Dispose() |
||||
|
{ |
||||
|
using (var ctx = CairoHelper.Create(_drawable)) |
||||
|
{ |
||||
|
_surface.MarkDirty(); |
||||
|
ctx.SetSourceSurface(_surface, 0, 0); |
||||
|
ctx.Paint(); |
||||
|
} |
||||
|
_drawable = null; |
||||
|
} |
||||
|
|
||||
|
public IntPtr Address => _surface.DataPtr; |
||||
|
public int Width => _surface.Width; |
||||
|
public int Height => _surface.Height; |
||||
|
public int RowBytes => _surface.Stride; |
||||
|
//TODO: Proper DPI detect
|
||||
|
public Size Dpi => new Size(96, 96); |
||||
|
public PixelFormat Format => PixelFormat.Bgra8888; |
||||
|
} |
||||
|
} |
||||
|
|
||||
@ -0,0 +1 @@ |
|||||
|
project.lock.json |
||||
@ -0,0 +1,103 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> |
||||
|
<PropertyGroup> |
||||
|
<MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion> |
||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> |
||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> |
||||
|
<ProjectGuid>{BB1F7BB5-6AD4-4776-94D9-C09D0A972658}</ProjectGuid> |
||||
|
<OutputType>Library</OutputType> |
||||
|
<AppDesignerFolder>Properties</AppDesignerFolder> |
||||
|
<RootNamespace>Avalonia.Gtk3</RootNamespace> |
||||
|
<AssemblyName>Avalonia.Gtk3</AssemblyName> |
||||
|
<DefaultLanguage>en-US</DefaultLanguage> |
||||
|
<FileAlignment>512</FileAlignment> |
||||
|
<ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> |
||||
|
<TargetFrameworkProfile> |
||||
|
</TargetFrameworkProfile> |
||||
|
<TargetFrameworkVersion>v5.0</TargetFrameworkVersion> |
||||
|
</PropertyGroup> |
||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> |
||||
|
<DebugSymbols>true</DebugSymbols> |
||||
|
<DebugType>full</DebugType> |
||||
|
<Optimize>false</Optimize> |
||||
|
<OutputPath>bin\Debug\</OutputPath> |
||||
|
<DefineConstants>TRACE;DEBUG;GTK3_PINVOKE</DefineConstants> |
||||
|
<ErrorReport>prompt</ErrorReport> |
||||
|
<WarningLevel>4</WarningLevel> |
||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> |
||||
|
</PropertyGroup> |
||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Release' "> |
||||
|
<DebugType>pdbonly</DebugType> |
||||
|
<Optimize>true</Optimize> |
||||
|
<OutputPath>bin\Release\</OutputPath> |
||||
|
<DefineConstants>TRACE;GTK3_PINVOKE</DefineConstants> |
||||
|
<ErrorReport>prompt</ErrorReport> |
||||
|
<WarningLevel>4</WarningLevel> |
||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> |
||||
|
</PropertyGroup> |
||||
|
<ItemGroup> |
||||
|
<!-- A reference to the entire .NET Framework is automatically included --> |
||||
|
<None Include="project.json" /> |
||||
|
</ItemGroup> |
||||
|
<ItemGroup> |
||||
|
<Compile Include="..\Avalonia.Gtk\KeyTransform.cs"> |
||||
|
<Link>KeyTransform.cs</Link> |
||||
|
</Compile> |
||||
|
<Compile Include="Interop\CairoSurface.cs" /> |
||||
|
<Compile Include="ClipboardImpl.cs" /> |
||||
|
<Compile Include="CursorFactory.cs" /> |
||||
|
<Compile Include="FramebufferManager.cs" /> |
||||
|
<Compile Include="GdkCursor.cs" /> |
||||
|
<Compile Include="GdkKey.cs" /> |
||||
|
<Compile Include="Gtk3Platform.cs" /> |
||||
|
<Compile Include="Interop\GException.cs" /> |
||||
|
<Compile Include="Interop\GObject.cs" /> |
||||
|
<Compile Include="Interop\ICustomGtk3NativeLibraryResolver.cs" /> |
||||
|
<Compile Include="Interop\DynLoader.cs" /> |
||||
|
<Compile Include="Interop\GlibTimeout.cs" /> |
||||
|
<Compile Include="Interop\Native.cs" /> |
||||
|
<Compile Include="Interop\NativeException.cs" /> |
||||
|
<Compile Include="Interop\Pixbuf.cs" /> |
||||
|
<Compile Include="Interop\Resolver.cs" /> |
||||
|
<Compile Include="Interop\Signal.cs" /> |
||||
|
<Compile Include="ImageSurfaceFramebuffer.cs" /> |
||||
|
<Compile Include="PlatformIconLoader.cs" /> |
||||
|
<Compile Include="PopupImpl.cs" /> |
||||
|
<Compile Include="Properties\AssemblyInfo.cs" /> |
||||
|
<Compile Include="SystemDialogs.cs" /> |
||||
|
<Compile Include="TopLevelImpl.cs" /> |
||||
|
<Compile Include="Interop\Utf8Buffer.cs" /> |
||||
|
<Compile Include="WindowImpl.cs" /> |
||||
|
</ItemGroup> |
||||
|
<ItemGroup> |
||||
|
<ProjectReference Include="..\..\Avalonia.Base\Avalonia.Base.csproj"> |
||||
|
<Project>{B09B78D8-9B26-48B0-9149-D64A2F120F3F}</Project> |
||||
|
<Name>Avalonia.Base</Name> |
||||
|
</ProjectReference> |
||||
|
<ProjectReference Include="..\..\Avalonia.Controls\Avalonia.Controls.csproj"> |
||||
|
<Project>{D2221C82-4A25-4583-9B43-D791E3F6820C}</Project> |
||||
|
<Name>Avalonia.Controls</Name> |
||||
|
</ProjectReference> |
||||
|
<ProjectReference Include="..\..\Avalonia.Input\Avalonia.Input.csproj"> |
||||
|
<Project>{62024B2D-53EB-4638-B26B-85EEAA54866E}</Project> |
||||
|
<Name>Avalonia.Input</Name> |
||||
|
</ProjectReference> |
||||
|
<ProjectReference Include="..\..\Avalonia.Interactivity\Avalonia.Interactivity.csproj"> |
||||
|
<Project>{6b0ed19d-a08b-461c-a9d9-a9ee40b0c06b}</Project> |
||||
|
<Name>Avalonia.Interactivity</Name> |
||||
|
</ProjectReference> |
||||
|
<ProjectReference Include="..\..\Avalonia.Visuals\Avalonia.Visuals.csproj"> |
||||
|
<Project>{EB582467-6ABB-43A1-B052-E981BA910E3A}</Project> |
||||
|
<Name>Avalonia.SceneGraph</Name> |
||||
|
</ProjectReference> |
||||
|
</ItemGroup> |
||||
|
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" /> |
||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. |
||||
|
Other similar extension points exist, see Microsoft.Common.targets. |
||||
|
<Target Name="BeforeBuild"> |
||||
|
</Target> |
||||
|
<Target Name="AfterBuild"> |
||||
|
</Target> |
||||
|
--> |
||||
|
</Project> |
||||
@ -0,0 +1,53 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Runtime.InteropServices; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Avalonia.Gtk3.Interop; |
||||
|
using Avalonia.Input.Platform; |
||||
|
|
||||
|
namespace Avalonia.Gtk3 |
||||
|
{ |
||||
|
class ClipboardImpl : IClipboard |
||||
|
{ |
||||
|
|
||||
|
IntPtr GetClipboard() => Native.GtkClipboardGetForDisplay(Native.GdkGetDefaultDisplay(), IntPtr.Zero); |
||||
|
|
||||
|
static void OnText(IntPtr clipboard, IntPtr utf8string, IntPtr userdata) |
||||
|
{ |
||||
|
var handle = GCHandle.FromIntPtr(userdata); |
||||
|
|
||||
|
((TaskCompletionSource<string>) handle.Target) |
||||
|
.TrySetResult(Utf8Buffer.StringFromPtr(utf8string)); |
||||
|
handle.Free(); |
||||
|
} |
||||
|
|
||||
|
private static readonly Native.D.GtkClipboardTextReceivedFunc OnTextDelegate = OnText; |
||||
|
|
||||
|
static ClipboardImpl() |
||||
|
{ |
||||
|
GCHandle.Alloc(OnTextDelegate); |
||||
|
} |
||||
|
|
||||
|
public Task<string> GetTextAsync() |
||||
|
{ |
||||
|
var tcs = new TaskCompletionSource<string>(); |
||||
|
Native.GtkClipboardRequestText(GetClipboard(), OnTextDelegate, GCHandle.ToIntPtr(GCHandle.Alloc(tcs))); |
||||
|
return tcs.Task; |
||||
|
} |
||||
|
|
||||
|
public Task SetTextAsync(string text) |
||||
|
{ |
||||
|
using (var buf = new Utf8Buffer(text)) |
||||
|
Native.GtkClipboardSetText(GetClipboard(), buf, buf.ByteLen); |
||||
|
return Task.FromResult(0); |
||||
|
} |
||||
|
|
||||
|
public Task ClearAsync() |
||||
|
{ |
||||
|
Native.GtkClipboardRequestClear(GetClipboard()); |
||||
|
return Task.FromResult(0); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,79 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using Avalonia.Gtk3.Interop; |
||||
|
using Avalonia.Input; |
||||
|
using Avalonia.Platform; |
||||
|
using CursorType = Avalonia.Gtk3.GdkCursorType; |
||||
|
namespace Avalonia.Gtk3 |
||||
|
{ |
||||
|
class CursorFactory : IStandardCursorFactory |
||||
|
{ |
||||
|
private static readonly Dictionary<StandardCursorType, object> CursorTypeMapping = new Dictionary |
||||
|
<StandardCursorType, object> |
||||
|
{ |
||||
|
{StandardCursorType.AppStarting, CursorType.Watch}, |
||||
|
{StandardCursorType.Arrow, CursorType.LeftPtr}, |
||||
|
{StandardCursorType.Cross, CursorType.Cross}, |
||||
|
{StandardCursorType.Hand, CursorType.Hand1}, |
||||
|
{StandardCursorType.Ibeam, CursorType.Xterm}, |
||||
|
{StandardCursorType.No, "gtk-cancel"}, |
||||
|
{StandardCursorType.SizeAll, CursorType.Sizing}, |
||||
|
//{ StandardCursorType.SizeNorthEastSouthWest, 32643 },
|
||||
|
{StandardCursorType.SizeNorthSouth, CursorType.SbVDoubleArrow}, |
||||
|
//{ StandardCursorType.SizeNorthWestSouthEast, 32642 },
|
||||
|
{StandardCursorType.SizeWestEast, CursorType.SbHDoubleArrow}, |
||||
|
{StandardCursorType.UpArrow, CursorType.BasedArrowUp}, |
||||
|
{StandardCursorType.Wait, CursorType.Watch}, |
||||
|
{StandardCursorType.Help, "gtk-help"}, |
||||
|
{StandardCursorType.TopSide, CursorType.TopSide}, |
||||
|
{StandardCursorType.BottomSize, CursorType.BottomSide}, |
||||
|
{StandardCursorType.LeftSide, CursorType.LeftSide}, |
||||
|
{StandardCursorType.RightSide, CursorType.RightSide}, |
||||
|
{StandardCursorType.TopLeftCorner, CursorType.TopLeftCorner}, |
||||
|
{StandardCursorType.TopRightCorner, CursorType.TopRightCorner}, |
||||
|
{StandardCursorType.BottomLeftCorner, CursorType.BottomLeftCorner}, |
||||
|
{StandardCursorType.BottomRightCorner, CursorType.BottomRightCorner} |
||||
|
}; |
||||
|
|
||||
|
private static readonly Dictionary<StandardCursorType, IPlatformHandle> Cache = |
||||
|
new Dictionary<StandardCursorType, IPlatformHandle>(); |
||||
|
|
||||
|
private IntPtr GetCursor(object desc) |
||||
|
{ |
||||
|
IntPtr rv; |
||||
|
var name = desc as string; |
||||
|
if (name != null) |
||||
|
{ |
||||
|
var theme = Native.GtkIconThemeGetDefault(); |
||||
|
IntPtr icon, error; |
||||
|
using (var u = new Utf8Buffer(name)) |
||||
|
icon = Native.GtkIconThemeLoadIcon(theme, u, 32, 0, out error); |
||||
|
rv = icon == IntPtr.Zero |
||||
|
? Native.GdkCursorNew(GdkCursorType.XCursor) |
||||
|
: Native.GdkCursorNewFromPixbuf(Native.GdkGetDefaultDisplay(), icon, 0, 0); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
rv = Native.GdkCursorNew((CursorType)desc); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
return rv; |
||||
|
} |
||||
|
|
||||
|
public IPlatformHandle GetCursor(StandardCursorType cursorType) |
||||
|
{ |
||||
|
IPlatformHandle rv; |
||||
|
if (!Cache.TryGetValue(cursorType, out rv)) |
||||
|
{ |
||||
|
Cache[cursorType] = |
||||
|
rv = |
||||
|
new PlatformHandle( |
||||
|
GetCursor(CursorTypeMapping[cursorType]), |
||||
|
"GTKCURSOR"); |
||||
|
} |
||||
|
|
||||
|
return rv; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,32 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Avalonia.Controls.Platform.Surfaces; |
||||
|
|
||||
|
namespace Avalonia.Gtk3 |
||||
|
{ |
||||
|
class FramebufferManager : IFramebufferPlatformSurface, IDisposable |
||||
|
{ |
||||
|
private readonly TopLevelImpl _window; |
||||
|
public FramebufferManager(TopLevelImpl window) |
||||
|
{ |
||||
|
_window = window; |
||||
|
} |
||||
|
|
||||
|
public void Dispose() |
||||
|
{ |
||||
|
//
|
||||
|
} |
||||
|
|
||||
|
public ILockedFramebuffer Lock() |
||||
|
{ |
||||
|
if(_window.CurrentCairoContext == IntPtr.Zero) |
||||
|
throw new InvalidOperationException("Window is not in drawing state"); |
||||
|
var width = (int) _window.ClientSize.Width; |
||||
|
var height = (int) _window.ClientSize.Height; |
||||
|
return new ImageSurfaceFramebuffer(_window.CurrentCairoContext, _window.GtkWidget, width, height); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,91 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Avalonia.Gtk3 |
||||
|
{ |
||||
|
enum GdkCursorType |
||||
|
{ |
||||
|
CursorIsPixmap = -1, |
||||
|
XCursor = 0, |
||||
|
Arrow = 2, |
||||
|
BasedArrowDown = 4, |
||||
|
BasedArrowUp = 6, |
||||
|
Boat = 8, |
||||
|
Bogosity = 10, |
||||
|
BottomLeftCorner = 12, |
||||
|
BottomRightCorner = 14, |
||||
|
BottomSide = 16, |
||||
|
BottomTee = 18, |
||||
|
BoxSpiral = 20, |
||||
|
CenterPtr = 22, |
||||
|
Circle = 24, |
||||
|
Clock = 26, |
||||
|
CoffeeMug = 28, |
||||
|
Cross = 30, |
||||
|
CrossReverse = 32, |
||||
|
Crosshair = 34, |
||||
|
DiamondCross = 36, |
||||
|
Dot = 38, |
||||
|
Dotbox = 40, |
||||
|
DoubleArrow = 42, |
||||
|
DraftLarge = 44, |
||||
|
DraftSmall = 46, |
||||
|
DrapedBox = 48, |
||||
|
Exchange = 50, |
||||
|
Fleur = 52, |
||||
|
Gobbler = 54, |
||||
|
Gumby = 56, |
||||
|
Hand1 = 58, |
||||
|
Hand2 = 60, |
||||
|
Heart = 62, |
||||
|
Icon = 64, |
||||
|
IronCross = 66, |
||||
|
LeftPtr = 68, |
||||
|
LeftSide = 70, |
||||
|
LeftTee = 72, |
||||
|
Leftbutton = 74, |
||||
|
LlAngle = 76, |
||||
|
LrAngle = 78, |
||||
|
Man = 80, |
||||
|
Middlebutton = 82, |
||||
|
Mouse = 84, |
||||
|
Pencil = 86, |
||||
|
Pirate = 88, |
||||
|
Plus = 90, |
||||
|
QuestionArrow = 92, |
||||
|
RightPtr = 94, |
||||
|
RightSide = 96, |
||||
|
RightTee = 98, |
||||
|
Rightbutton = 100, |
||||
|
RtlLogo = 102, |
||||
|
Sailboat = 104, |
||||
|
SbDownArrow = 106, |
||||
|
SbHDoubleArrow = 108, |
||||
|
SbLeftArrow = 110, |
||||
|
SbRightArrow = 112, |
||||
|
SbUpArrow = 114, |
||||
|
SbVDoubleArrow = 116, |
||||
|
Shuttle = 118, |
||||
|
Sizing = 120, |
||||
|
Spider = 122, |
||||
|
Spraycan = 124, |
||||
|
Star = 126, |
||||
|
Target = 128, |
||||
|
Tcross = 130, |
||||
|
TopLeftArrow = 132, |
||||
|
TopLeftCorner = 134, |
||||
|
TopRightCorner = 136, |
||||
|
TopSide = 138, |
||||
|
TopTee = 140, |
||||
|
Trek = 142, |
||||
|
UlAngle = 144, |
||||
|
Umbrella = 146, |
||||
|
UrAngle = 148, |
||||
|
Watch = 150, |
||||
|
Xterm = 152, |
||||
|
LastCursor = 153, |
||||
|
} |
||||
|
} |
||||
File diff suppressed because it is too large
@ -0,0 +1,116 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading; |
||||
|
using System.Threading.Tasks; |
||||
|
using Avalonia.Controls; |
||||
|
using Avalonia.Controls.Platform; |
||||
|
using Avalonia.Gtk3.Interop; |
||||
|
using Avalonia.Input; |
||||
|
using Avalonia.Input.Platform; |
||||
|
using Avalonia.Platform; |
||||
|
using Avalonia.Rendering; |
||||
|
using Avalonia.Gtk3; |
||||
|
|
||||
|
namespace Avalonia.Gtk3 |
||||
|
{ |
||||
|
public class Gtk3Platform : IWindowingPlatform, IPlatformSettings, IPlatformThreadingInterface |
||||
|
{ |
||||
|
internal static readonly Gtk3Platform Instance = new Gtk3Platform(); |
||||
|
internal static readonly MouseDevice Mouse = new MouseDevice(); |
||||
|
internal static readonly KeyboardDevice Keyboard = new KeyboardDevice(); |
||||
|
internal static IntPtr App { get; set; } |
||||
|
public static void Initialize() |
||||
|
{ |
||||
|
Resolver.Resolve(); |
||||
|
Native.GtkInit(0, IntPtr.Zero); |
||||
|
using (var utf = new Utf8Buffer("avalonia.app." + Guid.NewGuid())) |
||||
|
App = Native.GtkApplicationNew(utf, 0); |
||||
|
//Mark current thread as UI thread
|
||||
|
s_tlsMarker = true; |
||||
|
|
||||
|
AvaloniaLocator.CurrentMutable.Bind<IWindowingPlatform>().ToConstant(Instance) |
||||
|
.Bind<IClipboard>().ToSingleton<ClipboardImpl>() |
||||
|
.Bind<IStandardCursorFactory>().ToConstant(new CursorFactory()) |
||||
|
.Bind<IKeyboardDevice>().ToConstant(Keyboard) |
||||
|
.Bind<IMouseDevice>().ToConstant(Mouse) |
||||
|
.Bind<IPlatformSettings>().ToConstant(Instance) |
||||
|
.Bind<IPlatformThreadingInterface>().ToConstant(Instance) |
||||
|
.Bind<ISystemDialogImpl>().ToSingleton<SystemDialog>() |
||||
|
.Bind<IRenderLoop>().ToConstant(new DefaultRenderLoop(60)) |
||||
|
.Bind<IPlatformIconLoader>().ToConstant(new PlatformIconLoader()); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
public IWindowImpl CreateWindow() => new WindowImpl(); |
||||
|
|
||||
|
public IEmbeddableWindowImpl CreateEmbeddableWindow() |
||||
|
{ |
||||
|
throw new NotImplementedException(); |
||||
|
} |
||||
|
|
||||
|
public IPopupImpl CreatePopup() => new PopupImpl(); |
||||
|
|
||||
|
|
||||
|
|
||||
|
public Size DoubleClickSize => new Size(4, 4); |
||||
|
|
||||
|
public TimeSpan DoubleClickTime => TimeSpan.FromMilliseconds(100); //STUB
|
||||
|
public double RenderScalingFactor { get; } = 1; |
||||
|
public double LayoutScalingFactor { get; } = 1; |
||||
|
|
||||
|
public void RunLoop(CancellationToken cancellationToken) |
||||
|
{ |
||||
|
while (!cancellationToken.IsCancellationRequested) |
||||
|
Native.GtkMainIteration(); |
||||
|
} |
||||
|
|
||||
|
public IDisposable StartTimer(TimeSpan interval, Action tick) |
||||
|
{ |
||||
|
return GlibTimeout.StarTimer((uint) interval.TotalMilliseconds, tick); |
||||
|
} |
||||
|
|
||||
|
private bool _signaled = false; |
||||
|
object _lock = new object(); |
||||
|
|
||||
|
public void Signal() |
||||
|
{ |
||||
|
lock(_lock) |
||||
|
if (!_signaled) |
||||
|
{ |
||||
|
_signaled = true; |
||||
|
GlibTimeout.Add(0, () => |
||||
|
{ |
||||
|
lock (_lock) |
||||
|
{ |
||||
|
_signaled = false; |
||||
|
} |
||||
|
Signaled?.Invoke(); |
||||
|
return false; |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
public event Action Signaled; |
||||
|
|
||||
|
|
||||
|
[ThreadStatic] |
||||
|
private static bool s_tlsMarker; |
||||
|
|
||||
|
public bool CurrentThreadIsLoopThread => s_tlsMarker; |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
namespace Avalonia |
||||
|
{ |
||||
|
public static class Gtk3AppBuilderExtensions |
||||
|
{ |
||||
|
public static T UseGtk3<T>(this AppBuilderBase<T> builder, ICustomGtk3NativeLibraryResolver resolver = null) |
||||
|
where T : AppBuilderBase<T>, new() |
||||
|
{ |
||||
|
Resolver.Custom = resolver; |
||||
|
return builder.UseWindowingSubsystem(Gtk3Platform.Initialize, "GTK3"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,69 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Avalonia.Controls.Platform.Surfaces; |
||||
|
using Avalonia.Gtk3.Interop; |
||||
|
using Avalonia.Platform; |
||||
|
|
||||
|
|
||||
|
namespace Avalonia.Gtk3 |
||||
|
{ |
||||
|
class ImageSurfaceFramebuffer : ILockedFramebuffer |
||||
|
{ |
||||
|
private IntPtr _context; |
||||
|
private readonly GtkWidget _widget; |
||||
|
private CairoSurface _surface; |
||||
|
private int _factor; |
||||
|
|
||||
|
public ImageSurfaceFramebuffer(IntPtr context, GtkWidget widget, int width, int height) |
||||
|
{ |
||||
|
_context = context; |
||||
|
_widget = widget; |
||||
|
_factor = (int)(Native.GtkWidgetGetScaleFactor?.Invoke(_widget) ?? 1u); |
||||
|
width *= _factor; |
||||
|
height *= _factor; |
||||
|
_surface = Native.CairoImageSurfaceCreate(1, width, height); |
||||
|
|
||||
|
Width = width; |
||||
|
Height = height; |
||||
|
Address = Native.CairoImageSurfaceGetData(_surface); |
||||
|
RowBytes = Native.CairoImageSurfaceGetStride(_surface); |
||||
|
Native.CairoSurfaceFlush(_surface); |
||||
|
} |
||||
|
|
||||
|
public void Dispose() |
||||
|
{ |
||||
|
if(_context == IntPtr.Zero || _surface == null) |
||||
|
return; |
||||
|
Native.CairoSurfaceMarkDirty(_surface); |
||||
|
Native.CairoScale(_context, 1d / _factor, 1d / _factor); |
||||
|
Native.CairoSetSourceSurface(_context, _surface, 0, 0); |
||||
|
Native.CairoPaint(_context); |
||||
|
_context = IntPtr.Zero; |
||||
|
_surface.Dispose(); |
||||
|
_surface = null; |
||||
|
} |
||||
|
|
||||
|
public IntPtr Address { get; } |
||||
|
public int Width { get; } |
||||
|
public int Height { get; } |
||||
|
public int RowBytes { get; } |
||||
|
|
||||
|
|
||||
|
public Size Dpi |
||||
|
{ |
||||
|
get |
||||
|
{ |
||||
|
|
||||
|
return new Size(96, 96) * _factor; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public PixelFormat Format => PixelFormat.Bgra8888; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,20 @@ |
|||||
|
using System; |
||||
|
using System.Runtime.InteropServices; |
||||
|
|
||||
|
namespace Avalonia.Gtk3.Interop |
||||
|
{ |
||||
|
class CairoSurface : SafeHandle |
||||
|
{ |
||||
|
public CairoSurface() : base(IntPtr.Zero, true) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
protected override bool ReleaseHandle() |
||||
|
{ |
||||
|
Native.CairoSurfaceDestroy(handle); |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
public override bool IsInvalid => handle == IntPtr.Zero; |
||||
|
} |
||||
|
} |
||||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue