diff --git a/src/Avalonia.Controls/Application.cs b/src/Avalonia.Controls/Application.cs index 3bf72460df..4b3fb70d72 100644 --- a/src/Avalonia.Controls/Application.cs +++ b/src/Avalonia.Controls/Application.cs @@ -55,6 +55,8 @@ namespace Avalonia /// public event EventHandler ResourcesChanged; + public event EventHandler UrlOpened; + /// /// Creates an instance of the class. /// @@ -247,7 +249,17 @@ namespace Avalonia public virtual void OnFrameworkInitializationCompleted() { - + var applicationPlatform = AvaloniaLocator.Current.GetService(); + + if (applicationPlatform != null) + { + applicationPlatform.FilesOpened = OnFilesOpened; + } + } + + private void OnFilesOpened(string[] urls) + { + UrlOpened?.Invoke(this, new UrlOpenedEventArgs (urls)); } private void NotifyResourcesChanged(ResourcesChangedEventArgs e) diff --git a/src/Avalonia.Controls/Platform/IApplicationPlatform.cs b/src/Avalonia.Controls/Platform/IApplicationPlatform.cs new file mode 100644 index 0000000000..ec193ce0d6 --- /dev/null +++ b/src/Avalonia.Controls/Platform/IApplicationPlatform.cs @@ -0,0 +1,9 @@ +using System; + +namespace Avalonia.Platform +{ + public interface IApplicationPlatform + { + Action FilesOpened { get; set; } + } +} diff --git a/src/Avalonia.Controls/UrlOpenedEventArgs.cs b/src/Avalonia.Controls/UrlOpenedEventArgs.cs new file mode 100644 index 0000000000..bc29d7ffa2 --- /dev/null +++ b/src/Avalonia.Controls/UrlOpenedEventArgs.cs @@ -0,0 +1,14 @@ +using System; + +namespace Avalonia +{ + public class UrlOpenedEventArgs : EventArgs + { + public UrlOpenedEventArgs(string[] urls) + { + Urls = urls; + } + + public string[] Urls { get; } + } +} diff --git a/src/Avalonia.Native/AvaloniaNativeApplicationPlatform.cs b/src/Avalonia.Native/AvaloniaNativeApplicationPlatform.cs new file mode 100644 index 0000000000..ff7c4fdd6e --- /dev/null +++ b/src/Avalonia.Native/AvaloniaNativeApplicationPlatform.cs @@ -0,0 +1,16 @@ +using System; +using Avalonia.Native.Interop; +using Avalonia.Platform; + +namespace Avalonia.Native +{ + internal class AvaloniaNativeApplicationPlatform : CallbackBase, IApplicationPlatform, IAvnApplicationEvents + { + public Action FilesOpened { get; set; } + + void IAvnApplicationEvents.FilesOpened(IAvnStringArray urls) + { + FilesOpened?.Invoke(urls.ToStringArray()); + } + } +} diff --git a/src/Avalonia.Native/AvaloniaNativePlatform.cs b/src/Avalonia.Native/AvaloniaNativePlatform.cs index 35d21a75d3..f9806f02a4 100644 --- a/src/Avalonia.Native/AvaloniaNativePlatform.cs +++ b/src/Avalonia.Native/AvaloniaNativePlatform.cs @@ -1,6 +1,5 @@ using System; using System.Runtime.InteropServices; -using System.Security.Cryptography; using Avalonia.Controls.Platform; using Avalonia.Input; using Avalonia.Input.Platform; @@ -9,7 +8,6 @@ using Avalonia.Native.Interop; using Avalonia.OpenGL; using Avalonia.Platform; using Avalonia.Rendering; -using Avalonia.Platform.Interop; namespace Avalonia.Native { @@ -86,7 +84,10 @@ namespace Avalonia.Native void DoInitialize(AvaloniaNativePlatformOptions options) { _options = options; - _factory.Initialize(new GCHandleDeallocator()); + + var applicationPlatform = new AvaloniaNativeApplicationPlatform(); + + _factory.Initialize(new GCHandleDeallocator(), applicationPlatform); if (_factory.MacOptions != null) { var macOpts = AvaloniaLocator.Current.GetService(); @@ -97,6 +98,7 @@ namespace Avalonia.Native } AvaloniaLocator.CurrentMutable + .Bind().ToConstant(applicationPlatform) .Bind() .ToConstant(new PlatformThreadingInterface(_factory.CreatePlatformThreadingInterface())) .Bind().ToConstant(new CursorFactory(_factory.CreateCursorFactory()))