committed by
GitHub
86 changed files with 4910 additions and 369 deletions
@ -0,0 +1,53 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
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(), () => StandardRuntimePlatformServices.Register()) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
/// <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,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 @@ |
|||||
|
project.lock.json |
||||
@ -0,0 +1,102 @@ |
|||||
|
<?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="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,42 @@ |
|||||
|
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; |
||||
|
private ImageSurfaceFramebuffer _fb; |
||||
|
public FramebufferManager(TopLevelImpl window) |
||||
|
{ |
||||
|
_window = window; |
||||
|
} |
||||
|
|
||||
|
public void Dispose() |
||||
|
{ |
||||
|
_fb?.Deallocate(); |
||||
|
} |
||||
|
|
||||
|
public ILockedFramebuffer Lock() |
||||
|
{ |
||||
|
if(_window.CurrentCairoContext == IntPtr.Zero) |
||||
|
throw new InvalidOperationException("Window is not in drawing state"); |
||||
|
|
||||
|
var ctx = _window.CurrentCairoContext; |
||||
|
var width = (int) _window.ClientSize.Width; |
||||
|
var height = (int) _window.ClientSize.Height; |
||||
|
if (_fb == null || _fb.Width != width || |
||||
|
_fb.Height != height) |
||||
|
{ |
||||
|
_fb?.Dispose(); |
||||
|
_fb = new ImageSurfaceFramebuffer(width, height); |
||||
|
} |
||||
|
_fb.Prepare(ctx); |
||||
|
return _fb; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -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,63 @@ |
|||||
|
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 IntPtr _surface; |
||||
|
|
||||
|
public ImageSurfaceFramebuffer(int width, int height) |
||||
|
{ |
||||
|
_surface = Native.CairoImageSurfaceCreate(1, width, height); |
||||
|
Width = width; |
||||
|
Height = height; |
||||
|
Address = Native.CairoImageSurfaceGetData(_surface); |
||||
|
RowBytes = Native.CairoImageSurfaceGetStride(_surface); |
||||
|
Native.CairoSurfaceFlush(_surface); |
||||
|
} |
||||
|
|
||||
|
public void Prepare(IntPtr context) |
||||
|
{ |
||||
|
_context = context; |
||||
|
} |
||||
|
|
||||
|
public void Deallocate() |
||||
|
{ |
||||
|
Native.CairoSurfaceDestroy(_surface); |
||||
|
_surface = IntPtr.Zero; |
||||
|
} |
||||
|
|
||||
|
public void Dispose() |
||||
|
{ |
||||
|
if(_context == IntPtr.Zero || _surface == IntPtr.Zero) |
||||
|
return; |
||||
|
Native.CairoSurfaceMarkDirty(_surface); |
||||
|
Native.CairoSetSourceSurface(_context, _surface, 0, 0); |
||||
|
Native.CairoPaint(_context); |
||||
|
_context = IntPtr.Zero; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
public IntPtr Address { get; } |
||||
|
public int Width { get; } |
||||
|
public int Height { get; } |
||||
|
public int RowBytes { get; } |
||||
|
|
||||
|
//TODO: Proper DPI detect
|
||||
|
public Size Dpi => new Size(96, 96); |
||||
|
|
||||
|
public PixelFormat Format => PixelFormat.Bgra8888; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,129 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Runtime.InteropServices; |
||||
|
|
||||
|
/* |
||||
|
* Source code imported from https://github.com/kekekeks/evhttp-sharp
|
||||
|
* Source is provided under MIT license for Avalonia project and derived works |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
namespace Avalonia.Gtk3.Interop |
||||
|
{ |
||||
|
internal interface IDynLoader |
||||
|
{ |
||||
|
IntPtr LoadLibrary(string dll); |
||||
|
IntPtr GetProcAddress(IntPtr dll, string proc); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
class UnixLoader : IDynLoader |
||||
|
{ |
||||
|
// ReSharper disable InconsistentNaming
|
||||
|
static class LinuxImports |
||||
|
{ |
||||
|
[DllImport("libdl.so.2")] |
||||
|
private static extern IntPtr dlopen(string path, int flags); |
||||
|
|
||||
|
[DllImport("libdl.so.2")] |
||||
|
private static extern IntPtr dlsym(IntPtr handle, string symbol); |
||||
|
|
||||
|
[DllImport("libdl.so.2")] |
||||
|
private static extern IntPtr dlerror(); |
||||
|
|
||||
|
public static void Init() |
||||
|
{ |
||||
|
DlOpen = dlopen; |
||||
|
DlSym = dlsym; |
||||
|
DlError = dlerror; |
||||
|
} |
||||
|
} |
||||
|
static class OsXImports |
||||
|
{ |
||||
|
|
||||
|
|
||||
|
[DllImport("/usr/lib/libSystem.dylib")] |
||||
|
private static extern IntPtr dlopen(string path, int flags); |
||||
|
|
||||
|
[DllImport("/usr/lib/libSystem.dylib")] |
||||
|
private static extern IntPtr dlsym(IntPtr handle, string symbol); |
||||
|
|
||||
|
[DllImport("/usr/lib/libSystem.dylib")] |
||||
|
private static extern IntPtr dlerror(); |
||||
|
|
||||
|
public static void Init() |
||||
|
{ |
||||
|
DlOpen = dlopen; |
||||
|
DlSym = dlsym; |
||||
|
DlError = dlerror; |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
[DllImport("libc")] |
||||
|
static extern int uname(IntPtr buf); |
||||
|
|
||||
|
static UnixLoader() |
||||
|
{ |
||||
|
var buffer = Marshal.AllocHGlobal(0x1000); |
||||
|
uname(buffer); |
||||
|
var unixName = Marshal.PtrToStringAnsi(buffer); |
||||
|
Marshal.FreeHGlobal(buffer); |
||||
|
if(unixName == "Darwin") |
||||
|
OsXImports.Init(); |
||||
|
else |
||||
|
LinuxImports.Init(); |
||||
|
} |
||||
|
|
||||
|
private static Func<string, int, IntPtr> DlOpen; |
||||
|
private static Func<IntPtr, string, IntPtr> DlSym; |
||||
|
private static Func<IntPtr> DlError; |
||||
|
// ReSharper restore InconsistentNaming
|
||||
|
|
||||
|
static string DlErrorString() => Marshal.PtrToStringAnsi(DlError()); |
||||
|
|
||||
|
public IntPtr LoadLibrary(string dll) |
||||
|
{ |
||||
|
var handle = DlOpen(dll, 1); |
||||
|
if (handle == IntPtr.Zero) |
||||
|
throw new NativeException(DlErrorString()); |
||||
|
return handle; |
||||
|
} |
||||
|
|
||||
|
public IntPtr GetProcAddress(IntPtr dll, string proc) |
||||
|
{ |
||||
|
var ptr = DlSym(dll, proc); |
||||
|
if (ptr == IntPtr.Zero) |
||||
|
throw new NativeException(DlErrorString()); |
||||
|
return ptr; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
internal class Win32Loader : IDynLoader |
||||
|
{ |
||||
|
[DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)] |
||||
|
private static extern IntPtr GetProcAddress(IntPtr hModule, string procName); |
||||
|
|
||||
|
[DllImport("kernel32", EntryPoint = "LoadLibraryW", SetLastError = true, CharSet = CharSet.Unicode)] |
||||
|
private static extern IntPtr LoadLibrary(string lpszLib); |
||||
|
|
||||
|
IntPtr IDynLoader.LoadLibrary(string dll) |
||||
|
{ |
||||
|
var handle = LoadLibrary(dll); |
||||
|
if (handle != IntPtr.Zero) |
||||
|
return handle; |
||||
|
var err = Marshal.GetLastWin32Error(); |
||||
|
|
||||
|
throw new NativeException("Error loading " + dll + " error " + err); |
||||
|
} |
||||
|
|
||||
|
IntPtr IDynLoader.GetProcAddress(IntPtr dll, string proc) |
||||
|
{ |
||||
|
var ptr = GetProcAddress(dll, proc); |
||||
|
if (ptr == IntPtr.Zero) |
||||
|
throw new NativeException("Error " + Marshal.GetLastWin32Error()); |
||||
|
return ptr; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,33 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Runtime.InteropServices; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Avalonia.Gtk3.Interop |
||||
|
{ |
||||
|
public class GException : Exception |
||||
|
{ |
||||
|
[StructLayout(LayoutKind.Sequential)] |
||||
|
struct GError |
||||
|
{ |
||||
|
UInt32 domain; |
||||
|
int code; |
||||
|
public IntPtr message; |
||||
|
}; |
||||
|
|
||||
|
static unsafe string GetError(IntPtr error) |
||||
|
{ |
||||
|
if (error == IntPtr.Zero) |
||||
|
return "Unknown error"; |
||||
|
return Utf8Buffer.StringFromPtr(((GError*) error)->message); |
||||
|
} |
||||
|
|
||||
|
public GException(IntPtr error) : base(GetError(error)) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,62 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Runtime.InteropServices; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Avalonia.Gtk3.Interop |
||||
|
{ |
||||
|
class GObject : SafeHandle |
||||
|
{ |
||||
|
public GObject() : base(IntPtr.Zero, true) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
public GObject(IntPtr handle, bool owned = true) : base(IntPtr.Zero, owned) |
||||
|
{ |
||||
|
this.handle = handle; |
||||
|
} |
||||
|
|
||||
|
protected override bool ReleaseHandle() |
||||
|
{ |
||||
|
if (handle != IntPtr.Zero) |
||||
|
Native.GObjectUnref(handle); |
||||
|
handle = IntPtr.Zero; |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
public override bool IsInvalid => handle == IntPtr.Zero; |
||||
|
} |
||||
|
|
||||
|
class GInputStream : GObject |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
class GtkWidget : GObject |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
class GtkWindow : GtkWidget |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
class GtkImContext : GObject |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
class GtkDialog : GtkWindow |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
class GtkFileChooser : GtkDialog |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
@ -0,0 +1,64 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Runtime.InteropServices; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Avalonia.Gtk3.Interop |
||||
|
{ |
||||
|
static class GlibTimeout |
||||
|
{ |
||||
|
static bool Handler(IntPtr data) |
||||
|
{ |
||||
|
var handle = GCHandle.FromIntPtr(data); |
||||
|
var cb = (Func<bool>) handle.Target; |
||||
|
if (!cb()) |
||||
|
{ |
||||
|
handle.Free(); |
||||
|
return false; |
||||
|
} |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
private static readonly GCHandle PinnedHandle; |
||||
|
private static readonly Native.D.timeout_callback PinnedHandler; |
||||
|
static GlibTimeout() |
||||
|
{ |
||||
|
PinnedHandler = Handler; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
public static void Add(uint interval, Func<bool> callback) |
||||
|
{ |
||||
|
var handle = GCHandle.Alloc(callback); |
||||
|
Native.GTimeoutAdd(interval, PinnedHandler, GCHandle.ToIntPtr(handle)); |
||||
|
} |
||||
|
|
||||
|
class Timer : IDisposable |
||||
|
{ |
||||
|
public bool Stopped; |
||||
|
public void Dispose() |
||||
|
{ |
||||
|
|
||||
|
Stopped = true; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static IDisposable StarTimer(uint interval, Action tick) |
||||
|
{ |
||||
|
var timer = new Timer (); |
||||
|
GlibTimeout.Add(interval, |
||||
|
() => |
||||
|
{ |
||||
|
if (timer.Stopped) |
||||
|
return false; |
||||
|
tick(); |
||||
|
return !timer.Stopped; |
||||
|
}); |
||||
|
|
||||
|
return timer; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,17 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Avalonia.Gtk3.Interop; |
||||
|
|
||||
|
namespace Avalonia.Gtk3 |
||||
|
{ |
||||
|
public interface ICustomGtk3NativeLibraryResolver |
||||
|
{ |
||||
|
string GetName(GtkDll dll); |
||||
|
string BasePath { get; } |
||||
|
bool TrySystemFirst { get; } |
||||
|
string Lookup(GtkDll dll); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,571 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Runtime.InteropServices; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Avalonia.Controls; |
||||
|
using gint8 = System.Byte; |
||||
|
using gint16 = System.Int16; |
||||
|
using gint32 = System.Int32; |
||||
|
using gint = System.Int32; |
||||
|
using guint16 = System.UInt16; |
||||
|
using guint32 = System.UInt32; |
||||
|
using guint = System.UInt32; |
||||
|
using gdouble = System.Double; |
||||
|
|
||||
|
namespace Avalonia.Gtk3.Interop |
||||
|
{ |
||||
|
static class Native |
||||
|
{ |
||||
|
public static class D |
||||
|
{ |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate IntPtr gtk_application_new(Utf8Buffer appId, int flags); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_main_iteration(); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate GtkWindow gtk_window_new(GtkWindowType windowType); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate IntPtr gtk_init(int argc, IntPtr argv); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_window_present(GtkWindow gtkWindow); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_widget_hide(GtkWidget gtkWidget); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_window_set_icon(GtkWindow window, Pixbuf pixbuf); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_window_set_modal(GtkWindow window, bool modal); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] //No manual import
|
||||
|
public delegate IntPtr gdk_get_native_handle(IntPtr gdkWindow); |
||||
|
|
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate IntPtr gtk_widget_get_window(GtkWidget gtkWidget); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate IntPtr gtk_widget_get_screen(GtkWidget gtkWidget); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate IntPtr gtk_widget_set_double_buffered(GtkWidget gtkWidget, bool value); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate IntPtr gtk_widget_set_events(GtkWidget gtkWidget, uint flags); |
||||
|
|
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] |
||||
|
public delegate int gdk_screen_get_height(IntPtr screen); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] |
||||
|
public delegate int gdk_screen_get_width(IntPtr screen); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] |
||||
|
public delegate IntPtr gdk_display_get_default(); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] |
||||
|
public delegate int gdk_window_get_origin(IntPtr gdkWindow, out int x, out int y); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] |
||||
|
public delegate void gdk_window_resize(IntPtr gtkWindow, int width, int height); |
||||
|
|
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_widget_realize(GtkWidget gtkWidget); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_window_set_title(GtkWindow gtkWindow, Utf8Buffer title); |
||||
|
|
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_window_set_decorated(GtkWindow gtkWindow, bool decorated); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_window_get_size(GtkWindow gtkWindow, out int width, out int height); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_window_resize(GtkWindow gtkWindow, int width, int height); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_widget_set_size_request(GtkWidget widget, int width, int height); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_window_set_default_size(GtkWindow gtkWindow, int width, int height); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_window_get_position(GtkWindow gtkWindow, out int x, out int y); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_window_move(GtkWindow gtkWindow, int x, int y); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate GtkFileChooser gtk_file_chooser_dialog_new(Utf8Buffer title, GtkWindow parent, GtkFileChooserAction action, IntPtr ignore); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public unsafe delegate GSList* gtk_file_chooser_get_filenames(GtkFileChooser chooser); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_file_chooser_set_select_multiple(GtkFileChooser chooser, bool allow); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_file_chooser_set_filename(GtkFileChooser chooser, Utf8Buffer file); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_dialog_add_button(GtkDialog raw, Utf8Buffer button_text, GtkResponseType response_id); |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] |
||||
|
public delegate IntPtr cairo_image_surface_create(int format, int width, int height); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] |
||||
|
public delegate IntPtr cairo_image_surface_get_data(IntPtr surface); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] |
||||
|
public delegate int cairo_image_surface_get_stride(IntPtr surface); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] |
||||
|
public delegate void cairo_surface_mark_dirty(IntPtr surface); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] |
||||
|
public delegate void cairo_surface_flush(IntPtr surface); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] |
||||
|
public delegate void cairo_surface_destroy(IntPtr surface); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] |
||||
|
public delegate void cairo_set_source_surface(IntPtr cr, IntPtr surface, double x, double y); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Cairo)] |
||||
|
public delegate void cairo_paint(IntPtr context); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_widget_queue_draw_area(GtkWidget widget, int x, int y, int width, int height); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate GtkImContext gtk_im_multicontext_new(); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate IntPtr gtk_im_context_set_client_window(GtkImContext context, IntPtr window); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate bool gtk_im_context_filter_keypress(GtkImContext context, IntPtr ev); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_widget_activate(GtkWidget widget); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] |
||||
|
public delegate IntPtr gdk_screen_get_root_window(IntPtr screen); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] |
||||
|
public delegate IntPtr gdk_cursor_new(GdkCursorType type); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] |
||||
|
public delegate IntPtr gdk_window_get_pointer(IntPtr raw, out int x, out int y, out int mask); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] |
||||
|
public delegate void gtk_window_set_geometry_hints(GtkWindow window, IntPtr geometry_widget, ref GdkGeometry geometry, GdkWindowHints geom_mask); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] |
||||
|
public delegate void gdk_window_invalidate_rect(IntPtr window, ref GdkRectangle rect, bool invalidate_children); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] |
||||
|
public delegate void gdk_window_begin_move_drag(IntPtr window, gint button, gint root_x, gint root_y, guint32 timestamp); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] |
||||
|
public delegate void gdk_window_begin_resize_drag(IntPtr window, WindowEdge edge, gint button, gint root_x, gint root_y, guint32 timestamp); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] |
||||
|
public delegate void gdk_event_request_motions(IntPtr ev); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate IntPtr gtk_clipboard_get_for_display(IntPtr display, IntPtr atom); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_clipboard_request_text(IntPtr clipboard, GtkClipboardTextReceivedFunc callback, IntPtr user_data); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_clipboard_set_text(IntPtr clipboard, Utf8Buffer text, int len); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate void gtk_clipboard_clear(IntPtr clipboard); |
||||
|
|
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.GdkPixBuf)] |
||||
|
public delegate IntPtr gdk_pixbuf_new_from_file(Utf8Buffer filename, out IntPtr error); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate IntPtr gtk_icon_theme_get_default(); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] |
||||
|
public delegate IntPtr gtk_icon_theme_load_icon(IntPtr icon_theme, Utf8Buffer icon_name, gint size, int flags,out IntPtr error); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] |
||||
|
public delegate IntPtr gdk_cursor_new_from_pixbuf(IntPtr disp, IntPtr pixbuf, int x, int y); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] |
||||
|
public delegate IntPtr gdk_window_set_cursor(IntPtr window, IntPtr cursor); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.GdkPixBuf)] |
||||
|
public delegate IntPtr gdk_pixbuf_new_from_stream(GInputStream stream, IntPtr cancel, out IntPtr error); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.GdkPixBuf)] |
||||
|
public delegate bool gdk_pixbuf_save_to_bufferv(Pixbuf pixbuf, out IntPtr buffer, out IntPtr buffer_size, |
||||
|
Utf8Buffer type, IntPtr option_keys, IntPtr option_values, out IntPtr error); |
||||
|
|
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gobject)] |
||||
|
public delegate void g_object_unref(IntPtr instance); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gobject)] |
||||
|
public delegate void g_object_ref(GObject instance); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gobject)] |
||||
|
public delegate ulong g_signal_connect_object(GObject instance, Utf8Buffer signal, IntPtr handler, IntPtr userData, int flags); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gobject)] |
||||
|
public delegate ulong g_signal_handler_disconnect(GObject instance, ulong connectionId); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Glib)] |
||||
|
public delegate ulong g_timeout_add(uint interval, timeout_callback callback, IntPtr data); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Glib)] |
||||
|
public delegate ulong g_free(IntPtr data); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Glib)] |
||||
|
public unsafe delegate void g_slist_free(GSList* data); |
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gio)] |
||||
|
public delegate GInputStream g_memory_input_stream_new_from_data(IntPtr ptr, IntPtr len, IntPtr destroyCallback); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] |
||||
|
public delegate bool signal_widget_draw(IntPtr gtkWidget, IntPtr cairoContext, IntPtr userData); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] |
||||
|
public delegate bool signal_generic(IntPtr gtkWidget, IntPtr userData); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] |
||||
|
public delegate bool signal_dialog_response(IntPtr gtkWidget, GtkResponseType response, IntPtr userData); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] |
||||
|
public delegate bool signal_onevent(IntPtr gtkWidget, IntPtr ev, IntPtr userData); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] |
||||
|
public delegate bool signal_commit(IntPtr gtkWidget, IntPtr utf8string, IntPtr userData); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] |
||||
|
public delegate bool timeout_callback(IntPtr data); |
||||
|
|
||||
|
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] |
||||
|
public delegate void GtkClipboardTextReceivedFunc(IntPtr clipboard, IntPtr utf8string, IntPtr userdata); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public static D.gtk_window_set_decorated GtkWindowSetDecorated; |
||||
|
public static D.gtk_window_set_title GtkWindowSetTitle; |
||||
|
public static D.gtk_application_new GtkApplicationNew; |
||||
|
public static D.gtk_main_iteration GtkMainIteration; |
||||
|
public static D.gtk_window_new GtkWindowNew; |
||||
|
public static D.gtk_window_set_icon GtkWindowSetIcon; |
||||
|
public static D.gtk_window_set_modal GtkWindowSetModal; |
||||
|
public static D.gtk_init GtkInit; |
||||
|
public static D.gtk_window_present GtkWindowPresent; |
||||
|
public static D.gtk_widget_hide GtkWidgetHide; |
||||
|
public static D.gdk_get_native_handle GetNativeGdkWindowHandle; |
||||
|
public static D.gtk_widget_get_window GtkWidgetGetWindow; |
||||
|
public static D.gtk_widget_get_screen GtkWidgetGetScreen; |
||||
|
public static D.gtk_widget_realize GtkWidgetRealize; |
||||
|
public static D.gtk_window_get_size GtkWindowGetSize; |
||||
|
public static D.gtk_window_resize GtkWindowResize; |
||||
|
public static D.gdk_window_resize GdkWindowResize; |
||||
|
public static D.gtk_widget_set_size_request GtkWindowSetSizeRequest; |
||||
|
public static D.gtk_window_set_default_size GtkWindowSetDefaultSize; |
||||
|
public static D.gtk_window_get_position GtkWindowGetPosition; |
||||
|
public static D.gtk_window_move GtkWindowMove; |
||||
|
public static D.gtk_file_chooser_dialog_new GtkFileChooserDialogNew; |
||||
|
public static D.gtk_file_chooser_set_select_multiple GtkFileChooserSetSelectMultiple; |
||||
|
public static D.gtk_file_chooser_set_filename GtkFileChooserSetFilename; |
||||
|
public static D.gtk_file_chooser_get_filenames GtkFileChooserGetFilenames; |
||||
|
public static D.gtk_dialog_add_button GtkDialogAddButton; |
||||
|
public static D.g_object_unref GObjectUnref; |
||||
|
public static D.g_object_ref GObjectRef; |
||||
|
public static D.g_signal_connect_object GSignalConnectObject; |
||||
|
public static D.g_signal_handler_disconnect GSignalHandlerDisconnect; |
||||
|
public static D.g_timeout_add GTimeoutAdd; |
||||
|
public static D.g_free GFree; |
||||
|
public static D.g_slist_free GSlistFree; |
||||
|
public static D.g_memory_input_stream_new_from_data GMemoryInputStreamNewFromData; |
||||
|
public static D.gtk_widget_set_double_buffered GtkWidgetSetDoubleBuffered; |
||||
|
public static D.gtk_widget_set_events GtkWidgetSetEvents; |
||||
|
public static D.gdk_window_invalidate_rect GdkWindowInvalidateRect; |
||||
|
public static D.gtk_widget_queue_draw_area GtkWidgetQueueDrawArea; |
||||
|
public static D.gtk_widget_activate GtkWidgetActivate; |
||||
|
public static D.gtk_clipboard_get_for_display GtkClipboardGetForDisplay; |
||||
|
public static D.gtk_clipboard_request_text GtkClipboardRequestText; |
||||
|
public static D.gtk_clipboard_set_text GtkClipboardSetText; |
||||
|
public static D.gtk_clipboard_clear GtkClipboardRequestClear; |
||||
|
|
||||
|
|
||||
|
public static D.gtk_im_multicontext_new GtkImMulticontextNew; |
||||
|
public static D.gtk_im_context_filter_keypress GtkImContextFilterKeypress; |
||||
|
public static D.gtk_im_context_set_client_window GtkImContextSetClientWindow; |
||||
|
|
||||
|
public static D.gdk_screen_get_height GdkScreenGetHeight; |
||||
|
public static D.gdk_display_get_default GdkGetDefaultDisplay; |
||||
|
public static D.gdk_screen_get_width GdkScreenGetWidth; |
||||
|
public static D.gdk_screen_get_root_window GdkScreenGetRootWindow; |
||||
|
public static D.gdk_cursor_new GdkCursorNew; |
||||
|
public static D.gdk_window_get_origin GdkWindowGetOrigin; |
||||
|
public static D.gdk_window_get_pointer GdkWindowGetPointer; |
||||
|
public static D.gdk_window_begin_move_drag GdkWindowBeginMoveDrag; |
||||
|
public static D.gdk_window_begin_resize_drag GdkWindowBeginResizeDrag; |
||||
|
public static D.gdk_event_request_motions GdkEventRequestMotions; |
||||
|
|
||||
|
public static D.gdk_pixbuf_new_from_file GdkPixbufNewFromFile; |
||||
|
public static D.gtk_icon_theme_get_default GtkIconThemeGetDefault; |
||||
|
public static D.gtk_icon_theme_load_icon GtkIconThemeLoadIcon; |
||||
|
public static D.gdk_cursor_new_from_pixbuf GdkCursorNewFromPixbuf; |
||||
|
public static D.gdk_window_set_cursor GdkWindowSetCursor; |
||||
|
public static D.gdk_pixbuf_new_from_stream GdkPixbufNewFromStream; |
||||
|
public static D.gdk_pixbuf_save_to_bufferv GdkPixbufSaveToBufferv; |
||||
|
|
||||
|
public static D.cairo_image_surface_create CairoImageSurfaceCreate; |
||||
|
public static D.cairo_image_surface_get_data CairoImageSurfaceGetData; |
||||
|
public static D.cairo_image_surface_get_stride CairoImageSurfaceGetStride; |
||||
|
public static D.cairo_surface_mark_dirty CairoSurfaceMarkDirty; |
||||
|
public static D.cairo_surface_flush CairoSurfaceFlush; |
||||
|
public static D.cairo_surface_destroy CairoSurfaceDestroy; |
||||
|
public static D.cairo_set_source_surface CairoSetSourceSurface; |
||||
|
public static D.cairo_paint CairoPaint; |
||||
|
} |
||||
|
|
||||
|
public enum GtkWindowType |
||||
|
{ |
||||
|
TopLevel, |
||||
|
Popup |
||||
|
} |
||||
|
|
||||
|
[StructLayout(LayoutKind.Sequential)] |
||||
|
public struct GdkRectangle |
||||
|
{ |
||||
|
public int X, Y, Width, Height; |
||||
|
|
||||
|
public static GdkRectangle FromRect(Rect rect) |
||||
|
{ |
||||
|
return new GdkRectangle |
||||
|
{ |
||||
|
X = (int) rect.X, |
||||
|
Y = (int) rect.Y, |
||||
|
Width = (int) rect.Width, |
||||
|
Height = (int) rect.Height |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
enum GdkEventType |
||||
|
{ |
||||
|
Nothing = -1, |
||||
|
Delete = 0, |
||||
|
Destroy = 1, |
||||
|
Expose = 2, |
||||
|
MotionNotify = 3, |
||||
|
ButtonPress = 4, |
||||
|
TwoButtonPress = 5, |
||||
|
ThreeButtonPress = 6, |
||||
|
ButtonRelease = 7, |
||||
|
KeyPress = 8, |
||||
|
KeyRelease = 9, |
||||
|
EnterNotify = 10, |
||||
|
LeaveNotify = 11, |
||||
|
FocusChange = 12, |
||||
|
Configure = 13, |
||||
|
Map = 14, |
||||
|
Unmap = 15, |
||||
|
PropertyNotify = 16, |
||||
|
SelectionClear = 17, |
||||
|
SelectionRequest = 18, |
||||
|
SelectionNotify = 19, |
||||
|
ProximityIn = 20, |
||||
|
ProximityOut = 21, |
||||
|
DragEnter = 22, |
||||
|
DragLeave = 23, |
||||
|
DragMotion = 24, |
||||
|
DragStatus = 25, |
||||
|
DropStart = 26, |
||||
|
DropFinished = 27, |
||||
|
ClientEvent = 28, |
||||
|
VisibilityNotify = 29, |
||||
|
NoExpose = 30, |
||||
|
Scroll = 31, |
||||
|
WindowState = 32, |
||||
|
Setting = 33, |
||||
|
OwnerChange = 34, |
||||
|
GrabBroken = 35, |
||||
|
} |
||||
|
|
||||
|
enum GdkModifierType |
||||
|
{ |
||||
|
ShiftMask = 1, |
||||
|
LockMask = 2, |
||||
|
ControlMask = 4, |
||||
|
Mod1Mask = 8, |
||||
|
Mod2Mask = 16, |
||||
|
Mod3Mask = 32, |
||||
|
Mod4Mask = 64, |
||||
|
Mod5Mask = 128, |
||||
|
Button1Mask = 256, |
||||
|
Button2Mask = 512, |
||||
|
Button3Mask = 1024, |
||||
|
Button4Mask = 2048, |
||||
|
Button5Mask = 4096, |
||||
|
SuperMask = 67108864, |
||||
|
HyperMask = 134217728, |
||||
|
MetaMask = 268435456, |
||||
|
ReleaseMask = 1073741824, |
||||
|
ModifierMask = ReleaseMask | Button5Mask | Button4Mask | Button3Mask | Button2Mask | Button1Mask | Mod5Mask | Mod4Mask | Mod3Mask | Mod2Mask | Mod1Mask | ControlMask | LockMask | ShiftMask, |
||||
|
None = 0, |
||||
|
} |
||||
|
|
||||
|
enum GdkScrollDirection |
||||
|
{ |
||||
|
Up, |
||||
|
Down, |
||||
|
Left, |
||||
|
Right, |
||||
|
Smooth |
||||
|
} |
||||
|
|
||||
|
[StructLayout(LayoutKind.Sequential)] |
||||
|
unsafe struct GdkEventButton |
||||
|
{ |
||||
|
public GdkEventType type; |
||||
|
public IntPtr window; |
||||
|
public gint8 send_event; |
||||
|
public guint32 time; |
||||
|
public gdouble x; |
||||
|
public gdouble y; |
||||
|
public gdouble* axes; |
||||
|
public GdkModifierType state; |
||||
|
public guint button; |
||||
|
public IntPtr device; |
||||
|
public gdouble x_root, y_root; |
||||
|
} |
||||
|
|
||||
|
[StructLayout(LayoutKind.Sequential)] |
||||
|
unsafe struct GdkEventMotion |
||||
|
{ |
||||
|
public GdkEventType type; |
||||
|
public IntPtr window; |
||||
|
public gint8 send_event; |
||||
|
public guint32 time; |
||||
|
public gdouble x; |
||||
|
public gdouble y; |
||||
|
public gdouble* axes; |
||||
|
public GdkModifierType state; |
||||
|
public gint16 is_hint; |
||||
|
public IntPtr device; |
||||
|
public gdouble x_root, y_root; |
||||
|
} |
||||
|
|
||||
|
[StructLayout(LayoutKind.Sequential)] |
||||
|
unsafe struct GdkEventScroll |
||||
|
{ |
||||
|
public GdkEventType type; |
||||
|
public IntPtr window; |
||||
|
public gint8 send_event; |
||||
|
public guint32 time; |
||||
|
public gdouble x; |
||||
|
public gdouble y; |
||||
|
public GdkModifierType state; |
||||
|
public GdkScrollDirection direction; |
||||
|
public IntPtr device; |
||||
|
public gdouble x_root, y_root; |
||||
|
public gdouble delta_x; |
||||
|
public gdouble delta_y; |
||||
|
} |
||||
|
|
||||
|
[StructLayout(LayoutKind.Sequential)] |
||||
|
unsafe struct GdkEventWindowState |
||||
|
{ |
||||
|
public GdkEventType type; |
||||
|
public IntPtr window; |
||||
|
gint8 send_event; |
||||
|
public GdkWindowState changed_mask; |
||||
|
public GdkWindowState new_window_state; |
||||
|
} |
||||
|
|
||||
|
[StructLayout(LayoutKind.Sequential)] |
||||
|
unsafe struct GdkEventKey |
||||
|
{ |
||||
|
public GdkEventType type; |
||||
|
public IntPtr window; |
||||
|
public gint8 send_event; |
||||
|
public guint32 time; |
||||
|
public guint state; |
||||
|
public guint keyval; |
||||
|
public gint length; |
||||
|
public IntPtr pstring; |
||||
|
public guint16 hardware_keycode; |
||||
|
public byte group; |
||||
|
public guint is_modifier; |
||||
|
} |
||||
|
|
||||
|
[StructLayout(LayoutKind.Sequential)] |
||||
|
unsafe struct GSList |
||||
|
{ |
||||
|
public IntPtr Data; |
||||
|
public GSList* Next; |
||||
|
} |
||||
|
|
||||
|
[Flags] |
||||
|
public enum GdkWindowState |
||||
|
{ |
||||
|
Withdrawn = 1, |
||||
|
Iconified = 2, |
||||
|
Maximized = 4, |
||||
|
Sticky = 8, |
||||
|
Fullscreen = 16, |
||||
|
Above = 32, |
||||
|
Below = 64, |
||||
|
Focused = 128, |
||||
|
Ttiled = 256 |
||||
|
} |
||||
|
|
||||
|
public enum GtkResponseType |
||||
|
{ |
||||
|
Help = -11, |
||||
|
Apply = -10, |
||||
|
No = -9, |
||||
|
Yes = -8, |
||||
|
Close = -7, |
||||
|
Cancel = -6, |
||||
|
Ok = -5, |
||||
|
DeleteEvent = -4, |
||||
|
Accept = -3, |
||||
|
Reject = -2, |
||||
|
None = -1, |
||||
|
} |
||||
|
|
||||
|
public enum GtkFileChooserAction |
||||
|
{ |
||||
|
Open, |
||||
|
Save, |
||||
|
SelectFolder, |
||||
|
CreateFolder, |
||||
|
} |
||||
|
|
||||
|
[StructLayout(LayoutKind.Sequential)] |
||||
|
struct GdkGeometry |
||||
|
{ |
||||
|
gint min_width; |
||||
|
gint min_height; |
||||
|
gint max_width; |
||||
|
gint max_height; |
||||
|
gint base_width; |
||||
|
gint base_height; |
||||
|
gint width_inc; |
||||
|
gint height_inc; |
||||
|
gdouble min_aspect; |
||||
|
gdouble max_aspect; |
||||
|
gint win_gravity; |
||||
|
} |
||||
|
|
||||
|
enum GdkWindowHints |
||||
|
{ |
||||
|
GDK_HINT_POS = 1 << 0, |
||||
|
GDK_HINT_MIN_SIZE = 1 << 1, |
||||
|
GDK_HINT_MAX_SIZE = 1 << 2, |
||||
|
GDK_HINT_BASE_SIZE = 1 << 3, |
||||
|
GDK_HINT_ASPECT = 1 << 4, |
||||
|
GDK_HINT_RESIZE_INC = 1 << 5, |
||||
|
GDK_HINT_WIN_GRAVITY = 1 << 6, |
||||
|
GDK_HINT_USER_POS = 1 << 7, |
||||
|
GDK_HINT_USER_SIZE = 1 << 8 |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,24 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Avalonia.Gtk3.Interop |
||||
|
{ |
||||
|
public class NativeException : Exception |
||||
|
{ |
||||
|
public NativeException() |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
public NativeException(string message) : base(message) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
public NativeException(string message, Exception inner) : base(message, inner) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,68 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.IO; |
||||
|
using System.Linq; |
||||
|
using System.Runtime.InteropServices; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Avalonia.Platform; |
||||
|
|
||||
|
namespace Avalonia.Gtk3.Interop |
||||
|
{ |
||||
|
internal class Pixbuf : GObject, IWindowIconImpl |
||||
|
{ |
||||
|
Pixbuf(IntPtr handle) : base(handle) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
public static Pixbuf NewFromFile(string filename) |
||||
|
{ |
||||
|
using (var ub = new Utf8Buffer(filename)) |
||||
|
{ |
||||
|
IntPtr err; |
||||
|
var rv = Native.GdkPixbufNewFromFile(ub, out err); |
||||
|
if(rv != IntPtr.Zero) |
||||
|
return new Pixbuf(rv); |
||||
|
throw new GException(err); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static unsafe Pixbuf NewFromBytes(byte[] data) |
||||
|
{ |
||||
|
fixed (void* bytes = data) |
||||
|
{ |
||||
|
using (var stream = Native.GMemoryInputStreamNewFromData(new IntPtr(bytes), new IntPtr(data.Length), IntPtr.Zero)) |
||||
|
{ |
||||
|
IntPtr err; |
||||
|
var rv = Native.GdkPixbufNewFromStream(stream, IntPtr.Zero, out err); |
||||
|
if (rv != IntPtr.Zero) |
||||
|
return new Pixbuf(rv); |
||||
|
throw new GException(err); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static Pixbuf NewFromStream(Stream s) |
||||
|
{ |
||||
|
if (s is MemoryStream) |
||||
|
return NewFromBytes(((MemoryStream) s).ToArray()); |
||||
|
var ms = new MemoryStream(); |
||||
|
s.CopyTo(ms); |
||||
|
return NewFromBytes(ms.ToArray()); |
||||
|
} |
||||
|
|
||||
|
public void Save(Stream outputStream) |
||||
|
{ |
||||
|
IntPtr buffer, bufferLen, error; |
||||
|
using (var png = new Utf8Buffer("png")) |
||||
|
if (!Native.GdkPixbufSaveToBufferv(this, out buffer, out bufferLen, png, |
||||
|
IntPtr.Zero, IntPtr.Zero, out error)) |
||||
|
throw new GException(error); |
||||
|
var data = new byte[bufferLen.ToInt32()]; |
||||
|
Marshal.Copy(buffer, data, 0, bufferLen.ToInt32()); |
||||
|
Native.GFree(buffer); |
||||
|
outputStream.Write(data, 0, data.Length); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,155 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.IO; |
||||
|
using System.Linq; |
||||
|
using System.Reflection; |
||||
|
using System.Runtime.InteropServices; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Avalonia.Platform; |
||||
|
|
||||
|
namespace Avalonia.Gtk3.Interop |
||||
|
{ |
||||
|
internal class GtkImportAttribute : Attribute |
||||
|
{ |
||||
|
public GtkDll Dll { get; set; } |
||||
|
public string Name { get; set; } |
||||
|
public bool Optional { get; set; } |
||||
|
|
||||
|
public GtkImportAttribute(GtkDll dll, string name = null, bool optional = false) |
||||
|
{ |
||||
|
Dll = dll; |
||||
|
Name = name; |
||||
|
Optional = optional; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public enum GtkDll |
||||
|
{ |
||||
|
Gdk, |
||||
|
Gtk, |
||||
|
Glib, |
||||
|
Gio, |
||||
|
Gobject, |
||||
|
Cairo, |
||||
|
GdkPixBuf |
||||
|
} |
||||
|
|
||||
|
static class Resolver |
||||
|
{ |
||||
|
private static Lazy<OperatingSystemType> Platform = |
||||
|
new Lazy<OperatingSystemType>( |
||||
|
() => AvaloniaLocator.Current.GetService<IRuntimePlatform>().GetRuntimeInfo().OperatingSystem); |
||||
|
|
||||
|
public static ICustomGtk3NativeLibraryResolver Custom { get; set; } |
||||
|
|
||||
|
|
||||
|
static string FormatName(string name, int version = 0) |
||||
|
{ |
||||
|
if (Platform.Value == OperatingSystemType.WinNT) |
||||
|
return "lib" + name + "-" + version + ".dll"; |
||||
|
if (Platform.Value == OperatingSystemType.Linux) |
||||
|
return "lib" + name + ".so" + "." + version; |
||||
|
if (Platform.Value == OperatingSystemType.OSX) |
||||
|
return "lib" + name + "." + version + ".dylib"; |
||||
|
throw new Exception("Unknown platform, use custom name resolver"); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
static string GetDllName(GtkDll dll) |
||||
|
{ |
||||
|
var name = Custom?.GetName(dll); |
||||
|
if (name != null) |
||||
|
return name; |
||||
|
|
||||
|
switch (dll) |
||||
|
{ |
||||
|
case GtkDll.Cairo: |
||||
|
return FormatName("cairo", 2); |
||||
|
case GtkDll.Gdk: |
||||
|
return FormatName("gdk-3"); |
||||
|
case GtkDll.Glib: |
||||
|
return FormatName("glib-2.0"); |
||||
|
case GtkDll.Gio: |
||||
|
return FormatName("gio-2.0"); |
||||
|
case GtkDll.Gtk: |
||||
|
return FormatName("gtk-3"); |
||||
|
case GtkDll.Gobject: |
||||
|
return FormatName("gobject-2.0"); |
||||
|
case GtkDll.GdkPixBuf: |
||||
|
return FormatName("gdk_pixbuf-2.0"); |
||||
|
default: |
||||
|
throw new ArgumentException("Unknown lib: " + dll); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
static IntPtr LoadDll(IDynLoader loader, GtkDll dll) |
||||
|
{ |
||||
|
|
||||
|
var exceptions = new List<Exception>(); |
||||
|
|
||||
|
var name = GetDllName(dll); |
||||
|
if (Custom?.TrySystemFirst != false) |
||||
|
{ |
||||
|
try |
||||
|
{ |
||||
|
return loader.LoadLibrary(name); |
||||
|
} |
||||
|
catch (Exception e) |
||||
|
{ |
||||
|
exceptions.Add(e); |
||||
|
} |
||||
|
} |
||||
|
var path = Custom?.Lookup(dll); |
||||
|
if (path == null && Custom?.BasePath != null) |
||||
|
path = Path.Combine(Custom.BasePath, name); |
||||
|
|
||||
|
try |
||||
|
{ |
||||
|
return loader.LoadLibrary(path); |
||||
|
} |
||||
|
catch (Exception e) |
||||
|
{ |
||||
|
exceptions.Add(e); |
||||
|
} |
||||
|
throw new AggregateException("Unable to load " + dll, exceptions); |
||||
|
} |
||||
|
|
||||
|
public static void Resolve(string basePath = null) |
||||
|
{ |
||||
|
var loader = Platform.Value == OperatingSystemType.WinNT ? (IDynLoader)new Win32Loader() : new UnixLoader(); |
||||
|
|
||||
|
var dlls = Enum.GetValues(typeof(GtkDll)).Cast<GtkDll>().ToDictionary(x => x, x => LoadDll(loader, x)); |
||||
|
|
||||
|
foreach (var fieldInfo in typeof(Native).GetTypeInfo().DeclaredFields) |
||||
|
{ |
||||
|
var import = fieldInfo.FieldType.GetTypeInfo().GetCustomAttributes(typeof(GtkImportAttribute), true).Cast<GtkImportAttribute>().FirstOrDefault(); |
||||
|
if(import == null) |
||||
|
continue; |
||||
|
IntPtr lib = dlls[import.Dll]; |
||||
|
|
||||
|
var funcPtr = loader.GetProcAddress(lib, import.Name ?? fieldInfo.FieldType.Name); |
||||
|
fieldInfo.SetValue(null, Marshal.GetDelegateForFunctionPointer(funcPtr, fieldInfo.FieldType)); |
||||
|
} |
||||
|
|
||||
|
var nativeHandleNames = new[] { "gdk_win32_window_get_handle", "gdk_x11_window_get_xid", "gdk_quartz_window_get_nswindow" }; |
||||
|
foreach (var name in nativeHandleNames) |
||||
|
{ |
||||
|
try |
||||
|
{ |
||||
|
Native.GetNativeGdkWindowHandle = (Native.D.gdk_get_native_handle)Marshal |
||||
|
.GetDelegateForFunctionPointer(loader.GetProcAddress(dlls[GtkDll.Gdk], name), typeof(Native.D.gdk_get_native_handle)); |
||||
|
break; |
||||
|
} |
||||
|
catch { } |
||||
|
} |
||||
|
if (Native.GetNativeGdkWindowHandle == null) |
||||
|
throw new Exception($"Unable to locate any of [{string.Join(", ", nativeHandleNames)}] in libgdk"); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
@ -0,0 +1,50 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Runtime.InteropServices; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Avalonia.Gtk3.Interop |
||||
|
{ |
||||
|
class Signal |
||||
|
{ |
||||
|
class ConnectedSignal : IDisposable |
||||
|
{ |
||||
|
private readonly GObject _instance; |
||||
|
private GCHandle _handle; |
||||
|
private readonly ulong _id; |
||||
|
|
||||
|
public ConnectedSignal(GObject instance, GCHandle handle, ulong id) |
||||
|
{ |
||||
|
_instance = instance; |
||||
|
Native.GObjectRef(instance); |
||||
|
_handle = handle; |
||||
|
_id = id; |
||||
|
} |
||||
|
|
||||
|
public void Dispose() |
||||
|
{ |
||||
|
if (_handle.IsAllocated) |
||||
|
{ |
||||
|
Native.GObjectUnref(_instance.DangerousGetHandle()); |
||||
|
Native.GSignalHandlerDisconnect(_instance, _id); |
||||
|
_handle.Free(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static IDisposable Connect<T>(GObject obj, string name, T handler) |
||||
|
{ |
||||
|
var handle = GCHandle.Alloc(handler); |
||||
|
var ptr = Marshal.GetFunctionPointerForDelegate((Delegate)(object)handler); |
||||
|
using (var utf = new Utf8Buffer(name)) |
||||
|
{ |
||||
|
var id = Native.GSignalConnectObject(obj, utf, ptr, IntPtr.Zero, 0); |
||||
|
if (id == 0) |
||||
|
throw new ArgumentException("Unable to connect to signal " + name); |
||||
|
return new ConnectedSignal(obj, handle, id); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,45 @@ |
|||||
|
using System; |
||||
|
using System.Runtime.InteropServices; |
||||
|
using System.Text; |
||||
|
|
||||
|
namespace Avalonia.Gtk3.Interop |
||||
|
{ |
||||
|
class Utf8Buffer : SafeHandle |
||||
|
{ |
||||
|
private GCHandle _gchandle; |
||||
|
private byte[] _data; |
||||
|
|
||||
|
public Utf8Buffer(string s) : base(IntPtr.Zero, true) |
||||
|
{ |
||||
|
_data = Encoding.UTF8.GetBytes(s); |
||||
|
_gchandle = GCHandle.Alloc(_data, GCHandleType.Pinned); |
||||
|
handle = _gchandle.AddrOfPinnedObject(); |
||||
|
} |
||||
|
|
||||
|
public int ByteLen => _data.Length; |
||||
|
|
||||
|
protected override bool ReleaseHandle() |
||||
|
{ |
||||
|
if (handle != IntPtr.Zero) |
||||
|
{ |
||||
|
handle = IntPtr.Zero; |
||||
|
_data = null; |
||||
|
_gchandle.Free(); |
||||
|
} |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
public override bool IsInvalid => handle == IntPtr.Zero; |
||||
|
|
||||
|
public static unsafe string StringFromPtr(IntPtr s) |
||||
|
{ |
||||
|
var pstr = (byte*)s; |
||||
|
int len; |
||||
|
for (len = 0; pstr[len] != 0; len++) ; |
||||
|
var bytes = new byte[len]; |
||||
|
Marshal.Copy(s, bytes, 0, len); |
||||
|
|
||||
|
return Encoding.UTF8.GetString(bytes, 0, len); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,20 @@ |
|||||
|
using System.IO; |
||||
|
using Avalonia.Gtk3.Interop; |
||||
|
using Avalonia.Platform; |
||||
|
|
||||
|
namespace Avalonia.Gtk3 |
||||
|
{ |
||||
|
class PlatformIconLoader : IPlatformIconLoader |
||||
|
{ |
||||
|
public IWindowIconImpl LoadIcon(string fileName) => Pixbuf.NewFromFile(fileName); |
||||
|
|
||||
|
public IWindowIconImpl LoadIcon(Stream stream) => Pixbuf.NewFromStream(stream); |
||||
|
|
||||
|
public IWindowIconImpl LoadIcon(IBitmapImpl bitmap) |
||||
|
{ |
||||
|
var ms = new MemoryStream(); |
||||
|
bitmap.Save(ms); |
||||
|
return Pixbuf.NewFromBytes(ms.ToArray()); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,24 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Diagnostics; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Avalonia.Gtk3.Interop; |
||||
|
using Avalonia.Platform; |
||||
|
|
||||
|
namespace Avalonia.Gtk3 |
||||
|
{ |
||||
|
class PopupImpl : TopLevelImpl, IPopupImpl |
||||
|
{ |
||||
|
static GtkWindow CreateWindow() |
||||
|
{ |
||||
|
var window = Native.GtkWindowNew(GtkWindowType.Popup); |
||||
|
return window; |
||||
|
} |
||||
|
|
||||
|
public PopupImpl() : base(CreateWindow()) |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,30 @@ |
|||||
|
using System.Resources; |
||||
|
using System.Reflection; |
||||
|
using System.Runtime.CompilerServices; |
||||
|
using System.Runtime.InteropServices; |
||||
|
|
||||
|
// General Information about an assembly is controlled through the following
|
||||
|
// set of attributes. Change these attribute values to modify the information
|
||||
|
// associated with an assembly.
|
||||
|
[assembly: AssemblyTitle("Avalonia.Gtk3")] |
||||
|
[assembly: AssemblyDescription("")] |
||||
|
[assembly: AssemblyConfiguration("")] |
||||
|
[assembly: AssemblyCompany("")] |
||||
|
[assembly: AssemblyProduct("Avalonia.Gtk3")] |
||||
|
[assembly: AssemblyCopyright("Copyright © 2016")] |
||||
|
[assembly: AssemblyTrademark("")] |
||||
|
[assembly: AssemblyCulture("")] |
||||
|
[assembly: NeutralResourcesLanguage("en")] |
||||
|
|
||||
|
// Version information for an assembly consists of the following four values:
|
||||
|
//
|
||||
|
// Major Version
|
||||
|
// Minor Version
|
||||
|
// Build Number
|
||||
|
// Revision
|
||||
|
//
|
||||
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
|
// by using the '*' as shown below:
|
||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||
|
[assembly: AssemblyVersion("1.0.0.0")] |
||||
|
[assembly: AssemblyFileVersion("1.0.0.0")] |
||||
@ -0,0 +1,8 @@ |
|||||
|
P/Invoke based GTK3 backend |
||||
|
=========================== |
||||
|
|
||||
|
Code is EXPERIMENTAL at this point. It also needs Direct2D/Skia for rendering. |
||||
|
|
||||
|
Windows GTK3 binaries aren't included in the repo, you need to download them from https://sourceforge.net/projects/gtk3win/ |
||||
|
|
||||
|
On Linux it should work out of the box with system-provided GTK3. On OSX you should be able to wire GTK3 using DYLD_LIBRARY_PATH environment variable. |
||||
@ -0,0 +1,92 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Avalonia.Controls; |
||||
|
using Avalonia.Controls.Platform; |
||||
|
using Avalonia.Gtk3.Interop; |
||||
|
using Avalonia.Input.Platform; |
||||
|
using Avalonia.Platform; |
||||
|
|
||||
|
namespace Avalonia.Gtk3 |
||||
|
{ |
||||
|
class SystemDialog : ISystemDialogImpl |
||||
|
{ |
||||
|
|
||||
|
unsafe static Task<string[]> ShowDialog(string title, GtkWindow parent, GtkFileChooserAction action, |
||||
|
bool multiselect, string initialFileName) |
||||
|
{ |
||||
|
GtkFileChooser dlg; |
||||
|
using (var name = title != null ? new Utf8Buffer(title) : null) |
||||
|
dlg = Native.GtkFileChooserDialogNew(name, parent, action, IntPtr.Zero); |
||||
|
if (multiselect) |
||||
|
Native.GtkFileChooserSetSelectMultiple(dlg, true); |
||||
|
|
||||
|
Native.GtkWindowSetModal(dlg, true); |
||||
|
var tcs = new TaskCompletionSource<string[]>(); |
||||
|
List<IDisposable> disposables = null; |
||||
|
Action dispose = () => |
||||
|
{ |
||||
|
foreach (var d in disposables) |
||||
|
d.Dispose(); |
||||
|
disposables.Clear(); |
||||
|
}; |
||||
|
disposables = new List<IDisposable> |
||||
|
{ |
||||
|
Signal.Connect<Native.D.signal_generic>(dlg, "close", delegate |
||||
|
{ |
||||
|
tcs.TrySetResult(null); |
||||
|
dispose(); |
||||
|
return false; |
||||
|
}), |
||||
|
Signal.Connect<Native.D.signal_dialog_response>(dlg, "response", (_, resp, __)=> |
||||
|
{ |
||||
|
string[] result = null; |
||||
|
if (resp == GtkResponseType.Accept) |
||||
|
{ |
||||
|
var rlst = new List<string>(); |
||||
|
var gs = Native.GtkFileChooserGetFilenames(dlg); |
||||
|
var cgs = gs; |
||||
|
while (cgs != null) |
||||
|
{ |
||||
|
if (cgs->Data != IntPtr.Zero) |
||||
|
rlst.Add(Utf8Buffer.StringFromPtr(cgs->Data)); |
||||
|
cgs = cgs->Next; |
||||
|
} |
||||
|
Native.GSlistFree(gs); |
||||
|
result = rlst.ToArray(); |
||||
|
} |
||||
|
Native.GtkWidgetHide(dlg); |
||||
|
dispose(); |
||||
|
tcs.TrySetResult(result); |
||||
|
return false; |
||||
|
}), |
||||
|
dlg |
||||
|
}; |
||||
|
using (var open = new Utf8Buffer("Open")) |
||||
|
Native.GtkDialogAddButton(dlg, open, GtkResponseType.Accept); |
||||
|
using (var open = new Utf8Buffer("Cancel")) |
||||
|
Native.GtkDialogAddButton(dlg, open, GtkResponseType.Cancel); |
||||
|
if(initialFileName!=null) |
||||
|
using (var fn = new Utf8Buffer(initialFileName)) |
||||
|
Native.GtkFileChooserSetFilename(dlg, fn); |
||||
|
Native.GtkWindowPresent(dlg); |
||||
|
return tcs.Task; |
||||
|
} |
||||
|
|
||||
|
public Task<string[]> ShowFileDialogAsync(FileDialog dialog, IWindowImpl parent) |
||||
|
{ |
||||
|
return ShowDialog(dialog.Title, ((TopLevelImpl) parent)?.GtkWidget, |
||||
|
dialog is OpenFileDialog ? GtkFileChooserAction.Open : GtkFileChooserAction.Save, |
||||
|
(dialog as OpenFileDialog)?.AllowMultiple ?? false, dialog.InitialFileName); |
||||
|
} |
||||
|
|
||||
|
public async Task<string> ShowFolderDialogAsync(OpenFolderDialog dialog, IWindowImpl parent) |
||||
|
{ |
||||
|
var res = await ShowDialog(dialog.Title, ((TopLevelImpl) parent)?.GtkWidget, |
||||
|
GtkFileChooserAction.SelectFolder, false, dialog.InitialDirectory); |
||||
|
return res?.FirstOrDefault(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,334 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Diagnostics; |
||||
|
using System.Linq; |
||||
|
using System.Runtime.InteropServices; |
||||
|
using System.Text; |
||||
|
using Avalonia.Controls; |
||||
|
using Avalonia.Gtk3.Interop; |
||||
|
using Avalonia.Input; |
||||
|
using Avalonia.Input.Raw; |
||||
|
using Avalonia.Platform; |
||||
|
|
||||
|
namespace Avalonia.Gtk3 |
||||
|
{ |
||||
|
abstract class TopLevelImpl : ITopLevelImpl, IPlatformHandle |
||||
|
{ |
||||
|
public readonly GtkWindow GtkWidget; |
||||
|
private IInputRoot _inputRoot; |
||||
|
private readonly GtkImContext _imContext; |
||||
|
private readonly FramebufferManager _framebuffer; |
||||
|
protected readonly List<IDisposable> Disposables = new List<IDisposable>(); |
||||
|
private Size _lastSize; |
||||
|
private Point _lastPosition; |
||||
|
private uint _lastKbdEvent; |
||||
|
private uint _lastSmoothScrollEvent; |
||||
|
|
||||
|
public TopLevelImpl(GtkWindow gtkWidget) |
||||
|
{ |
||||
|
|
||||
|
GtkWidget = gtkWidget; |
||||
|
Disposables.Add(gtkWidget); |
||||
|
_framebuffer = new FramebufferManager(this); |
||||
|
_imContext = Native.GtkImMulticontextNew(); |
||||
|
Disposables.Add(_imContext); |
||||
|
Native.GtkWidgetSetEvents(gtkWidget, 0xFFFFFE); |
||||
|
Disposables.Add(Signal.Connect<Native.D.signal_commit>(_imContext, "commit", OnCommit)); |
||||
|
Connect<Native.D.signal_widget_draw>("draw", OnDraw); |
||||
|
Connect<Native.D.signal_generic>("realize", OnRealized); |
||||
|
ConnectEvent("configure-event", OnConfigured); |
||||
|
ConnectEvent("button-press-event", OnButton); |
||||
|
ConnectEvent("button-release-event", OnButton); |
||||
|
ConnectEvent("motion-notify-event", OnMotion); |
||||
|
ConnectEvent("scroll-event", OnScroll); |
||||
|
ConnectEvent("window-state-event", OnStateChanged); |
||||
|
ConnectEvent("key-press-event", OnKeyEvent); |
||||
|
ConnectEvent("key-release-event", OnKeyEvent); |
||||
|
Connect<Native.D.signal_generic>("destroy", OnDestroy); |
||||
|
Native.GtkWidgetRealize(gtkWidget); |
||||
|
_lastSize = ClientSize; |
||||
|
} |
||||
|
|
||||
|
private bool OnConfigured(IntPtr gtkwidget, IntPtr ev, IntPtr userdata) |
||||
|
{ |
||||
|
var size = ClientSize; |
||||
|
if (_lastSize != size) |
||||
|
{ |
||||
|
Resized?.Invoke(size); |
||||
|
_lastSize = size; |
||||
|
} |
||||
|
var pos = Position; |
||||
|
if (_lastPosition != pos) |
||||
|
{ |
||||
|
PositionChanged?.Invoke(pos); |
||||
|
_lastPosition = pos; |
||||
|
} |
||||
|
|
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
private bool OnRealized(IntPtr gtkwidget, IntPtr userdata) |
||||
|
{ |
||||
|
Native.GtkImContextSetClientWindow(_imContext, Native.GtkWidgetGetWindow(GtkWidget)); |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
private bool OnDestroy(IntPtr gtkwidget, IntPtr userdata) |
||||
|
{ |
||||
|
Closed?.Invoke(); |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
private static InputModifiers GetModifierKeys(GdkModifierType state) |
||||
|
{ |
||||
|
var rv = InputModifiers.None; |
||||
|
if (state.HasFlag(GdkModifierType.ControlMask)) |
||||
|
rv |= InputModifiers.Control; |
||||
|
if (state.HasFlag(GdkModifierType.ShiftMask)) |
||||
|
rv |= InputModifiers.Shift; |
||||
|
if (state.HasFlag(GdkModifierType.Mod1Mask)) |
||||
|
rv |= InputModifiers.Control; |
||||
|
if (state.HasFlag(GdkModifierType.Button1Mask)) |
||||
|
rv |= InputModifiers.LeftMouseButton; |
||||
|
if (state.HasFlag(GdkModifierType.Button2Mask)) |
||||
|
rv |= InputModifiers.RightMouseButton; |
||||
|
if (state.HasFlag(GdkModifierType.Button3Mask)) |
||||
|
rv |= InputModifiers.MiddleMouseButton; |
||||
|
return rv; |
||||
|
} |
||||
|
|
||||
|
private unsafe bool OnButton(IntPtr w, IntPtr ev, IntPtr userdata) |
||||
|
{ |
||||
|
var evnt = (GdkEventButton*)ev; |
||||
|
var e = new RawMouseEventArgs( |
||||
|
Gtk3Platform.Mouse, |
||||
|
evnt->time, |
||||
|
_inputRoot, |
||||
|
evnt->type == GdkEventType.ButtonRelease |
||||
|
? evnt->button == 1 |
||||
|
? RawMouseEventType.LeftButtonUp |
||||
|
: evnt->button == 3 ? RawMouseEventType.RightButtonUp : RawMouseEventType.MiddleButtonUp |
||||
|
: evnt->button == 1 |
||||
|
? RawMouseEventType.LeftButtonDown |
||||
|
: evnt->button == 3 ? RawMouseEventType.RightButtonDown : RawMouseEventType.MiddleButtonDown, |
||||
|
new Point(evnt->x, evnt->y), GetModifierKeys(evnt->state)); |
||||
|
Input?.Invoke(e); |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
protected virtual unsafe bool OnStateChanged(IntPtr w, IntPtr pev, IntPtr userData) |
||||
|
{ |
||||
|
var ev = (GdkEventWindowState*) pev; |
||||
|
if (ev->changed_mask.HasFlag(GdkWindowState.Focused)) |
||||
|
{ |
||||
|
if(ev->new_window_state.HasFlag(GdkWindowState.Focused)) |
||||
|
Activated?.Invoke(); |
||||
|
else |
||||
|
Deactivated?.Invoke(); |
||||
|
} |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
private unsafe bool OnMotion(IntPtr w, IntPtr ev, IntPtr userdata) |
||||
|
{ |
||||
|
var evnt = (GdkEventMotion*)ev; |
||||
|
var position = new Point(evnt->x, evnt->y); |
||||
|
Native.GdkEventRequestMotions(ev); |
||||
|
var e = new RawMouseEventArgs( |
||||
|
Gtk3Platform.Mouse, |
||||
|
evnt->time, |
||||
|
_inputRoot, |
||||
|
RawMouseEventType.Move, |
||||
|
position, GetModifierKeys(evnt->state)); |
||||
|
Input(e); |
||||
|
|
||||
|
return true; |
||||
|
} |
||||
|
private unsafe bool OnScroll(IntPtr w, IntPtr ev, IntPtr userdata) |
||||
|
{ |
||||
|
var evnt = (GdkEventScroll*)ev; |
||||
|
|
||||
|
//Ignore duplicates
|
||||
|
if (evnt->time - _lastSmoothScrollEvent < 10 && evnt->direction != GdkScrollDirection.Smooth) |
||||
|
return true; |
||||
|
|
||||
|
var delta = new Vector(); |
||||
|
const double step = (double) 1; |
||||
|
if (evnt->direction == GdkScrollDirection.Down) |
||||
|
delta = new Vector(0, -step); |
||||
|
else if (evnt->direction == GdkScrollDirection.Up) |
||||
|
delta = new Vector(0, step); |
||||
|
else if (evnt->direction == GdkScrollDirection.Right) |
||||
|
delta = new Vector(-step, 0); |
||||
|
else if (evnt->direction == GdkScrollDirection.Left) |
||||
|
delta = new Vector(step, 0); |
||||
|
else if (evnt->direction == GdkScrollDirection.Smooth) |
||||
|
{ |
||||
|
delta = new Vector(-evnt->delta_x, -evnt->delta_y); |
||||
|
_lastSmoothScrollEvent = evnt->time; |
||||
|
} |
||||
|
var e = new RawMouseWheelEventArgs(Gtk3Platform.Mouse, evnt->time, _inputRoot, |
||||
|
new Point(evnt->x, evnt->y), delta, GetModifierKeys(evnt->state)); |
||||
|
Input(e); |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
private unsafe bool OnKeyEvent(IntPtr w, IntPtr pev, IntPtr userData) |
||||
|
{ |
||||
|
var evnt = (GdkEventKey*) pev; |
||||
|
_lastKbdEvent = evnt->time; |
||||
|
if (Native.GtkImContextFilterKeypress(_imContext, pev)) |
||||
|
return true; |
||||
|
var e = new RawKeyEventArgs( |
||||
|
Gtk3Platform.Keyboard, |
||||
|
evnt->time, |
||||
|
evnt->type == GdkEventType.KeyPress ? RawKeyEventType.KeyDown : RawKeyEventType.KeyUp, |
||||
|
Avalonia.Gtk.Common.KeyTransform.ConvertKey((GdkKey)evnt->keyval), GetModifierKeys((GdkModifierType)evnt->state)); |
||||
|
Input(e); |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
private unsafe bool OnCommit(IntPtr gtkwidget, IntPtr utf8string, IntPtr userdata) |
||||
|
{ |
||||
|
Input(new RawTextInputEventArgs(Gtk3Platform.Keyboard, _lastKbdEvent, Utf8Buffer.StringFromPtr(utf8string))); |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
void ConnectEvent(string name, Native.D.signal_onevent handler) |
||||
|
=> Disposables.Add(Signal.Connect<Native.D.signal_onevent>(GtkWidget, name, handler)); |
||||
|
void Connect<T>(string name, T handler) => Disposables.Add(Signal.Connect(GtkWidget, name, handler)); |
||||
|
|
||||
|
internal IntPtr CurrentCairoContext { get; private set; } |
||||
|
|
||||
|
private bool OnDraw(IntPtr gtkwidget, IntPtr cairocontext, IntPtr userdata) |
||||
|
{ |
||||
|
CurrentCairoContext = cairocontext; |
||||
|
Paint?.Invoke(new Rect(ClientSize)); |
||||
|
CurrentCairoContext = IntPtr.Zero; |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
public void Dispose() |
||||
|
{ |
||||
|
Closed?.Invoke(); |
||||
|
foreach(var d in Disposables.AsEnumerable().Reverse()) |
||||
|
d.Dispose(); |
||||
|
Disposables.Clear(); |
||||
|
} |
||||
|
|
||||
|
public Size MaxClientSize |
||||
|
{ |
||||
|
get |
||||
|
{ |
||||
|
var s = Native.GtkWidgetGetScreen(GtkWidget); |
||||
|
return new Size(Native.GdkScreenGetWidth(s), Native.GdkScreenGetHeight(s)); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public double Scaling => 1; //TODO: Implement scaling
|
||||
|
public IPlatformHandle Handle => this; |
||||
|
|
||||
|
string IPlatformHandle.HandleDescriptor => "HWND"; |
||||
|
|
||||
|
public Action Activated { get; set; } |
||||
|
public Action Closed { get; set; } |
||||
|
public Action Deactivated { get; set; } |
||||
|
public Action<RawInputEventArgs> Input { get; set; } |
||||
|
public Action<Rect> Paint { get; set; } |
||||
|
public Action<Size> Resized { get; set; } |
||||
|
public Action<double> ScalingChanged { get; set; } //TODO
|
||||
|
public Action<Point> PositionChanged { get; set; } |
||||
|
|
||||
|
public void Activate() => Native.GtkWidgetActivate(GtkWidget); |
||||
|
|
||||
|
public void Invalidate(Rect rect) |
||||
|
{ |
||||
|
if(GtkWidget.IsClosed) |
||||
|
return; |
||||
|
Native.GtkWidgetQueueDrawArea(GtkWidget, (int)rect.X, (int)rect.Y, (int)rect.Width, (int)rect.Height); |
||||
|
} |
||||
|
|
||||
|
public void SetInputRoot(IInputRoot inputRoot) => _inputRoot = inputRoot; |
||||
|
|
||||
|
public Point PointToClient(Point point) |
||||
|
{ |
||||
|
int x, y; |
||||
|
Native.GdkWindowGetOrigin(Native.GtkWidgetGetWindow(GtkWidget), out x, out y); |
||||
|
|
||||
|
return new Point(point.X - x, point.Y - y); |
||||
|
} |
||||
|
|
||||
|
public Point PointToScreen(Point point) |
||||
|
{ |
||||
|
int x, y; |
||||
|
Native.GdkWindowGetOrigin(Native.GtkWidgetGetWindow(GtkWidget), out x, out y); |
||||
|
return new Point(point.X + x, point.Y + y); |
||||
|
} |
||||
|
|
||||
|
public void SetCursor(IPlatformHandle cursor) |
||||
|
{ |
||||
|
if (GtkWidget.IsClosed) |
||||
|
return; |
||||
|
Native.GdkWindowSetCursor(Native.GtkWidgetGetWindow(GtkWidget), cursor?.Handle ?? IntPtr.Zero); |
||||
|
} |
||||
|
|
||||
|
public void Show() => Native.GtkWindowPresent(GtkWidget); |
||||
|
|
||||
|
public void Hide() => Native.GtkWidgetHide(GtkWidget); |
||||
|
|
||||
|
void GetGlobalPointer(out int x, out int y) |
||||
|
{ |
||||
|
int mask; |
||||
|
Native.GdkWindowGetPointer(Native.GdkScreenGetRootWindow(Native.GtkWidgetGetScreen(GtkWidget)), |
||||
|
out x, out y, out mask); |
||||
|
} |
||||
|
|
||||
|
public void BeginMoveDrag() |
||||
|
{ |
||||
|
int x, y; |
||||
|
GetGlobalPointer(out x, out y); |
||||
|
Native.GdkWindowBeginMoveDrag(Native.GtkWidgetGetWindow(GtkWidget), 1, x, y, 0); |
||||
|
} |
||||
|
|
||||
|
public void BeginResizeDrag(WindowEdge edge) |
||||
|
{ |
||||
|
int x, y; |
||||
|
GetGlobalPointer(out x, out y); |
||||
|
Native.GdkWindowBeginResizeDrag(Native.GtkWidgetGetWindow(GtkWidget), edge, 1, x, y, 0); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public Size ClientSize |
||||
|
{ |
||||
|
get |
||||
|
{ |
||||
|
if (GtkWidget.IsClosed) |
||||
|
return new Size(); |
||||
|
int w, h; |
||||
|
Native.GtkWindowGetSize(GtkWidget, out w, out h); |
||||
|
return new Size(w, h); |
||||
|
} |
||||
|
set |
||||
|
{ |
||||
|
if (GtkWidget.IsClosed) |
||||
|
return; |
||||
|
Native.GtkWindowResize(GtkWidget, (int)value.Width, (int)value.Height); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public Point Position |
||||
|
{ |
||||
|
get |
||||
|
{ |
||||
|
int x, y; |
||||
|
Native.GtkWindowGetPosition(GtkWidget, out x, out y); |
||||
|
return new Point(x, y); |
||||
|
} |
||||
|
set { Native.GtkWindowMove(GtkWidget, (int)value.X, (int)value.Y); } |
||||
|
} |
||||
|
|
||||
|
IntPtr IPlatformHandle.Handle => Native.GetNativeGdkWindowHandle(Native.GtkWidgetGetWindow(GtkWidget)); |
||||
|
public IEnumerable<object> Surfaces => new object[] {Handle, _framebuffer}; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,45 @@ |
|||||
|
using System; |
||||
|
using Avalonia.Controls; |
||||
|
using Avalonia.Gtk3.Interop; |
||||
|
using Avalonia.Platform; |
||||
|
|
||||
|
namespace Avalonia.Gtk3 |
||||
|
{ |
||||
|
class WindowImpl : TopLevelImpl, IWindowImpl |
||||
|
{ |
||||
|
public WindowState WindowState { get; set; } //STUB
|
||||
|
public void SetTitle(string title) |
||||
|
{ |
||||
|
using (var t = new Utf8Buffer(title)) |
||||
|
Native.GtkWindowSetTitle(GtkWidget, t); |
||||
|
} |
||||
|
|
||||
|
class EmptyDisposable : IDisposable |
||||
|
{ |
||||
|
public void Dispose() |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public IDisposable ShowDialog() |
||||
|
{ |
||||
|
Native.GtkWindowSetModal(GtkWidget, true); |
||||
|
Show(); |
||||
|
return new EmptyDisposable(); |
||||
|
} |
||||
|
|
||||
|
public void SetSystemDecorations(bool enabled) => Native.GtkWindowSetDecorated(GtkWidget, enabled); |
||||
|
|
||||
|
public void SetIcon(IWindowIconImpl icon) => Native.GtkWindowSetIcon(GtkWidget, (Pixbuf) icon); |
||||
|
|
||||
|
public WindowImpl() : base(Native.GtkWindowNew(GtkWindowType.TopLevel)) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
public void SetCoverTaskbarWhenMaximized(bool enable) |
||||
|
{ |
||||
|
//Why do we even have that?
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,10 @@ |
|||||
|
{ |
||||
|
"supports": {}, |
||||
|
"dependencies": { |
||||
|
"Microsoft.NETCore.Portable.Compatibility": "1.0.1", |
||||
|
"NETStandard.Library": "1.6.0" |
||||
|
}, |
||||
|
"frameworks": { |
||||
|
"netstandard1.1": {} |
||||
|
} |
||||
|
} |
||||
@ -1,9 +1,13 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
<?xml version="1.0" encoding="utf-8"?> |
||||
<packages> |
<packages> |
||||
<package id="Sprache" version="2.0.0.51" targetFramework="portable45-net45+win8" /> |
<package id="Sprache" version="2.1.0" targetFramework="portable45-net45+win8" /> |
||||
|
<package id="System.Globalization" version="4.0.11" targetFramework="portable45-net45+win8" /> |
||||
|
<package id="System.Linq" version="4.1.0" targetFramework="portable45-net45+win8" /> |
||||
<package id="System.Reactive" version="3.0.0" targetFramework="portable45-net45+win8" /> |
<package id="System.Reactive" version="3.0.0" targetFramework="portable45-net45+win8" /> |
||||
<package id="System.Reactive.Core" version="3.0.0" targetFramework="portable45-net45+win8" /> |
<package id="System.Reactive.Core" version="3.0.0" targetFramework="portable45-net45+win8" /> |
||||
<package id="System.Reactive.Interfaces" version="3.0.0" targetFramework="portable45-net45+win8" /> |
<package id="System.Reactive.Interfaces" version="3.0.0" targetFramework="portable45-net45+win8" /> |
||||
<package id="System.Reactive.Linq" version="3.0.0" targetFramework="portable45-net45+win8" /> |
<package id="System.Reactive.Linq" version="3.0.0" targetFramework="portable45-net45+win8" /> |
||||
<package id="System.Reactive.PlatformServices" version="3.0.0" targetFramework="portable45-net45+win8" /> |
<package id="System.Reactive.PlatformServices" version="3.0.0" targetFramework="portable45-net45+win8" /> |
||||
|
<package id="System.Runtime" version="4.1.0" targetFramework="portable45-net45+win8" /> |
||||
|
<package id="System.Text.RegularExpressions" version="4.1.0" targetFramework="portable45-net45+win8" /> |
||||
</packages> |
</packages> |
||||
@ -1,4 +1,4 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
<?xml version="1.0" encoding="utf-8"?> |
||||
<packages> |
<packages> |
||||
<package id="SkiaSharp" version="1.54.1" targetFramework="monoandroid44" /> |
<package id="SkiaSharp" version="1.56.1-beta" targetFramework="monoandroid44" /> |
||||
</packages> |
</packages> |
||||
@ -0,0 +1,91 @@ |
|||||
|
<?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>{7D2D3083-71DD-4CC9-8907-39A0D86FB322}</ProjectGuid> |
||||
|
<OutputType>Library</OutputType> |
||||
|
<AppDesignerFolder>Properties</AppDesignerFolder> |
||||
|
<RootNamespace>Avalonia.Skia.Desktop</RootNamespace> |
||||
|
<AssemblyName>Avalonia.Skia.Desktop</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>DEBUG;TRACE</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</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="..\..\Shared\SharedAssemblyInfo.cs"> |
||||
|
<Link>Properties\SharedAssemblyInfo.cs</Link> |
||||
|
</Compile> |
||||
|
<Compile Include="..\Avalonia.Skia.Desktop\PlatformRenderInterfaceDesktop.cs"> |
||||
|
<Link>PlatformRenderInterfaceDesktop.cs</Link> |
||||
|
</Compile> |
||||
|
</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.Layout\Avalonia.Layout.csproj"> |
||||
|
<Project>{42472427-4774-4c81-8aff-9f27b8e31721}</Project> |
||||
|
<Name>Avalonia.Layout</Name> |
||||
|
</ProjectReference> |
||||
|
<ProjectReference Include="..\..\Avalonia.Styling\Avalonia.Styling.csproj"> |
||||
|
<Project>{f1baa01a-f176-4c6a-b39d-5b40bb1b148f}</Project> |
||||
|
<Name>Avalonia.Styling</Name> |
||||
|
</ProjectReference> |
||||
|
<ProjectReference Include="..\..\Avalonia.Visuals\Avalonia.Visuals.csproj"> |
||||
|
<Project>{eb582467-6abb-43a1-b052-e981ba910e3a}</Project> |
||||
|
<Name>Avalonia.Visuals</Name> |
||||
|
</ProjectReference> |
||||
|
</ItemGroup> |
||||
|
<Import Project="..\Avalonia.Skia\Avalonia.Skia.projitems" Label="Shared" /> |
||||
|
<Import Project="..\..\Shared\RenderHelpers\RenderHelpers.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,11 @@ |
|||||
|
{ |
||||
|
"supports": {}, |
||||
|
"dependencies": { |
||||
|
"Microsoft.NETCore.Portable.Compatibility": "1.0.1", |
||||
|
"NETStandard.Library": "1.6.0", |
||||
|
"SkiaSharp": "1.56.1-beta" |
||||
|
}, |
||||
|
"frameworks": { |
||||
|
"netstandard1.3": {} |
||||
|
} |
||||
|
} |
||||
@ -1,4 +1,4 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
<?xml version="1.0" encoding="utf-8"?> |
||||
<packages> |
<packages> |
||||
<package id="SkiaSharp" version="1.54.1" targetFramework="net45" /> |
<package id="SkiaSharp" version="1.56.1-beta" targetFramework="net45" /> |
||||
</packages> |
</packages> |
||||
@ -1,4 +1,4 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
<?xml version="1.0" encoding="utf-8"?> |
||||
<packages> |
<packages> |
||||
<package id="SkiaSharp" version="1.54.1" targetFramework="xamarinios10" /> |
<package id="SkiaSharp" version="1.56.1-beta" targetFramework="xamarinios10" /> |
||||
</packages> |
</packages> |
||||
@ -0,0 +1,94 @@ |
|||||
|
<?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>{40759A76-D0F2-464E-8000-6FF0F5C4BD7C}</ProjectGuid> |
||||
|
<OutputType>Library</OutputType> |
||||
|
<AppDesignerFolder>Properties</AppDesignerFolder> |
||||
|
<RootNamespace>Avalonia.Win32</RootNamespace> |
||||
|
<AssemblyName>Avalonia.Win32</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> |
||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> |
||||
|
</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> |
||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> |
||||
|
</PropertyGroup> |
||||
|
<ItemGroup> |
||||
|
<!-- A reference to the entire .NET Framework is automatically included --> |
||||
|
<Folder Include="Properties\" /> |
||||
|
</ItemGroup> |
||||
|
<ItemGroup> |
||||
|
<ProjectReference Include="..\..\Avalonia.Animation\Avalonia.Animation.csproj"> |
||||
|
<Project>{d211e587-d8bc-45b9-95a4-f297c8fa5200}</Project> |
||||
|
<Name>Avalonia.Animation</Name> |
||||
|
</ProjectReference> |
||||
|
<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.Layout\Avalonia.Layout.csproj"> |
||||
|
<Project>{42472427-4774-4c81-8aff-9f27b8e31721}</Project> |
||||
|
<Name>Avalonia.Layout</Name> |
||||
|
</ProjectReference> |
||||
|
<ProjectReference Include="..\..\Avalonia.Styling\Avalonia.Styling.csproj"> |
||||
|
<Project>{f1baa01a-f176-4c6a-b39d-5b40bb1b148f}</Project> |
||||
|
<Name>Avalonia.Styling</Name> |
||||
|
</ProjectReference> |
||||
|
<ProjectReference Include="..\..\Avalonia.Visuals\Avalonia.Visuals.csproj"> |
||||
|
<Project>{eb582467-6abb-43a1-b052-e981ba910e3a}</Project> |
||||
|
<Name>Avalonia.Visuals</Name> |
||||
|
</ProjectReference> |
||||
|
</ItemGroup> |
||||
|
<ItemGroup> |
||||
|
<Compile Include="IconImpl.cs" /> |
||||
|
<Compile Include="NativeWin32Platform.cs" /> |
||||
|
<Compile Include="Win32Exception.cs" /> |
||||
|
</ItemGroup> |
||||
|
<ItemGroup> |
||||
|
<None Include="project.json" /> |
||||
|
</ItemGroup> |
||||
|
<Import Project="..\Avalonia.Win32\Avalonia.Win32.Shared.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,19 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.IO; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Avalonia.Platform; |
||||
|
|
||||
|
namespace Avalonia.Win32 |
||||
|
{ |
||||
|
public class IconImpl : IWindowIconImpl |
||||
|
{ |
||||
|
public IntPtr HIcon { get; set; } |
||||
|
public void Save(Stream outputStream) |
||||
|
{ |
||||
|
throw new NotImplementedException(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,20 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.IO; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Avalonia.Platform; |
||||
|
|
||||
|
namespace Avalonia.Win32 |
||||
|
{ |
||||
|
partial class Win32Platform |
||||
|
{ |
||||
|
//TODO: An actual implementation
|
||||
|
public IWindowIconImpl LoadIcon(string fileName) => new IconImpl(); |
||||
|
|
||||
|
public IWindowIconImpl LoadIcon(Stream stream) => new IconImpl(); |
||||
|
|
||||
|
public IWindowIconImpl LoadIcon(IBitmapImpl bitmap) => new IconImpl(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,12 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Avalonia.Win32.NetStandard |
||||
|
{ |
||||
|
class AvaloniaWin32Exception : Exception |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
{ |
||||
|
"supports": {}, |
||||
|
"dependencies": { |
||||
|
"Microsoft.NETCore.Portable.Compatibility": "1.0.1", |
||||
|
"NETStandard.Library": "1.6.0", |
||||
|
"System.Reactive.Core": "3.0.0" |
||||
|
}, |
||||
|
"frameworks": { |
||||
|
"netstandard1.1": {} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,31 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
||||
|
<PropertyGroup> |
||||
|
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects> |
||||
|
<HasSharedItems>true</HasSharedItems> |
||||
|
<SharedGUID>9defc6b7-845b-4d8f-afc0-d32bf0032b8c</SharedGUID> |
||||
|
</PropertyGroup> |
||||
|
<PropertyGroup Label="Configuration"> |
||||
|
<Import_RootNamespace>Avalonia.Win32.Shared</Import_RootNamespace> |
||||
|
</PropertyGroup> |
||||
|
<ItemGroup> |
||||
|
<Compile Include="$(MSBuildThisFileDirectory)ClipboardImpl.cs" /> |
||||
|
<Compile Include="$(MSBuildThisFileDirectory)CursorFactory.cs" /> |
||||
|
<Compile Include="$(MSBuildThisFileDirectory)FramebufferManager.cs" /> |
||||
|
<Compile Include="$(MSBuildThisFileDirectory)Input\KeyInterop.cs" /> |
||||
|
<Compile Include="$(MSBuildThisFileDirectory)Input\WindowsKeyboardDevice.cs" /> |
||||
|
<Compile Include="$(MSBuildThisFileDirectory)Input\WindowsMouseDevice.cs" /> |
||||
|
<Compile Include="$(MSBuildThisFileDirectory)Interop\UnmanagedMethods.cs" /> |
||||
|
<Compile Include="$(MSBuildThisFileDirectory)PlatformConstants.cs" /> |
||||
|
<Compile Include="$(MSBuildThisFileDirectory)PopupImpl.cs" /> |
||||
|
<Compile Include="$(MSBuildThisFileDirectory)Properties\AssemblyInfo.cs" /> |
||||
|
<Compile Include="$(MSBuildThisFileDirectory)RenderLoop.cs" /> |
||||
|
<Compile Include="$(MSBuildThisFileDirectory)SystemDialogImpl.cs" /> |
||||
|
<Compile Include="$(MSBuildThisFileDirectory)Win32Platform.cs" /> |
||||
|
<Compile Include="$(MSBuildThisFileDirectory)WindowFramebuffer.cs" /> |
||||
|
<Compile Include="$(MSBuildThisFileDirectory)WindowImpl.cs" /> |
||||
|
<Compile Include="..\..\Shared\SharedAssemblyInfo.cs"> |
||||
|
<Link>Properties\SharedAssemblyInfo.cs</Link> |
||||
|
</Compile> |
||||
|
</ItemGroup> |
||||
|
</Project> |
||||
@ -0,0 +1,13 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
||||
|
<PropertyGroup Label="Globals"> |
||||
|
<ProjectGuid>9defc6b7-845b-4d8f-afc0-d32bf0032b8c</ProjectGuid> |
||||
|
<MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion> |
||||
|
</PropertyGroup> |
||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> |
||||
|
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.Default.props" /> |
||||
|
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.props" /> |
||||
|
<PropertyGroup /> |
||||
|
<Import Project="Avalonia.Win32.Shared.projitems" Label="Shared" /> |
||||
|
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.CSharp.targets" /> |
||||
|
</Project> |
||||
@ -0,0 +1,47 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.IO; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
using Avalonia.Platform; |
||||
|
|
||||
|
namespace Avalonia.Win32 |
||||
|
{ |
||||
|
partial class Win32Platform |
||||
|
{ |
||||
|
public IWindowIconImpl LoadIcon(string fileName) |
||||
|
{ |
||||
|
using (var stream = File.OpenRead(fileName)) |
||||
|
{ |
||||
|
return CreateImpl(stream); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public IWindowIconImpl LoadIcon(Stream stream) |
||||
|
{ |
||||
|
return CreateImpl(stream); |
||||
|
} |
||||
|
|
||||
|
public IWindowIconImpl LoadIcon(IBitmapImpl bitmap) |
||||
|
{ |
||||
|
using (var memoryStream = new MemoryStream()) |
||||
|
{ |
||||
|
bitmap.Save(memoryStream); |
||||
|
return new IconImpl(new System.Drawing.Bitmap(memoryStream)); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private static IconImpl CreateImpl(Stream stream) |
||||
|
{ |
||||
|
try |
||||
|
{ |
||||
|
return new IconImpl(new System.Drawing.Icon(stream)); |
||||
|
} |
||||
|
catch (ArgumentException) |
||||
|
{ |
||||
|
return new IconImpl(new System.Drawing.Bitmap(stream)); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue