From f0525eb6408e68a71279187dec6b2fe82c60f7f4 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Mon, 24 Sep 2018 18:41:11 +0100 Subject: [PATCH] Add cs side and interfaces for screens api. --- src/Avalonia.Native/AvaloniaNativePlatform.cs | 1 - src/Avalonia.Native/Helpers.cs | 5 +++ src/Avalonia.Native/PopupImpl.cs | 8 +++- src/Avalonia.Native/ScreenImpl.cs | 42 +++++++++++++++++++ src/Avalonia.Native/Stubs.cs | 22 +--------- src/Avalonia.Native/WindowImpl.cs | 2 +- src/Avalonia.Native/WindowImplBase.cs | 9 ++-- src/headers/avalonia-native.h | 16 +++++++ 8 files changed, 78 insertions(+), 27 deletions(-) create mode 100644 src/Avalonia.Native/ScreenImpl.cs diff --git a/src/Avalonia.Native/AvaloniaNativePlatform.cs b/src/Avalonia.Native/AvaloniaNativePlatform.cs index 7f43256ddc..3c5d04f907 100644 --- a/src/Avalonia.Native/AvaloniaNativePlatform.cs +++ b/src/Avalonia.Native/AvaloniaNativePlatform.cs @@ -70,7 +70,6 @@ namespace Avalonia.Native .Bind().ToConstant(MouseDevice) .Bind().ToConstant(this) .Bind().ToConstant(this) - .Bind().ToSingleton() .Bind().ToSingleton() .Bind().ToConstant(new RenderLoop()) .Bind().ToConstant(new DefaultRenderTimer(60)) diff --git a/src/Avalonia.Native/Helpers.cs b/src/Avalonia.Native/Helpers.cs index 77673edd1b..68b977d8b2 100644 --- a/src/Avalonia.Native/Helpers.cs +++ b/src/Avalonia.Native/Helpers.cs @@ -19,5 +19,10 @@ namespace Avalonia.Native { return new Size(size.Width, size.Height); } + + public static Rect ToAvaloniaRect (this AvnRect rect) + { + return new Rect(rect.X, rect.Y, rect.Width, rect.Height); + } } } diff --git a/src/Avalonia.Native/PopupImpl.cs b/src/Avalonia.Native/PopupImpl.cs index bed2b3f929..fa11d5469b 100644 --- a/src/Avalonia.Native/PopupImpl.cs +++ b/src/Avalonia.Native/PopupImpl.cs @@ -11,7 +11,13 @@ namespace Avalonia.Native public PopupImpl(IAvaloniaNativeFactory factory) { using (var e = new PopupEvents(this)) - Init(_native = factory.CreatePopup(e)); + Init(_native = factory.CreatePopup(e), factory.CreateScreens()); + } + + public override void Dispose() + { + _native.Dispose(); + base.Dispose(); } class PopupEvents : WindowBaseEvents, IAvnWindowEvents diff --git a/src/Avalonia.Native/ScreenImpl.cs b/src/Avalonia.Native/ScreenImpl.cs new file mode 100644 index 0000000000..ddee8cbc56 --- /dev/null +++ b/src/Avalonia.Native/ScreenImpl.cs @@ -0,0 +1,42 @@ +using System; +using Avalonia.Native.Interop; +using Avalonia.Platform; + +namespace Avalonia.Native +{ + class ScreenImpl : IScreenImpl, IDisposable + { + private IAvnScreens _native; + + public ScreenImpl(IAvnScreens native) + { + _native = native; + } + + public int ScreenCount => _native.GetScreenCount(); + + public Screen[] AllScreens + { + get + { + var count = ScreenCount; + var result = new Screen[count]; + + for(int i = 0; i < count; i++) + { + var screen = _native.GetScreen(i); + + result[i] = new Screen(screen.Bounds.ToAvaloniaRect(), screen.WorkingArea.ToAvaloniaRect(), screen.Primary); + } + + return result; + } + } + + public void Dispose () + { + _native.Dispose(); + _native = null; + } + } +} diff --git a/src/Avalonia.Native/Stubs.cs b/src/Avalonia.Native/Stubs.cs index 5b4a55d729..a452d993e7 100644 --- a/src/Avalonia.Native/Stubs.cs +++ b/src/Avalonia.Native/Stubs.cs @@ -7,20 +7,7 @@ using Avalonia.Input.Platform; using Avalonia.Platform; namespace Avalonia.Native -{ - class SystemDialogImpl : ISystemDialogImpl - { - public Task ShowFileDialogAsync(FileDialog dialog, IWindowImpl parent) - { - return Task.FromResult((string[])null); - } - - public Task ShowFolderDialogAsync(OpenFolderDialog dialog, IWindowImpl parent) - { - return Task.FromResult(null); - } - } - +{ class ClipboardImpl : IClipboard { public Task ClearAsync() @@ -38,11 +25,4 @@ namespace Avalonia.Native return Task.CompletedTask; } } - - class ScreenImpl : IScreenImpl - { - public int ScreenCount => 1; - - public Screen[] AllScreens => new[] { new Screen(new Rect(0, 0, 1600, 900), new Rect(0, 0, 1600, 900), true) }; - } } diff --git a/src/Avalonia.Native/WindowImpl.cs b/src/Avalonia.Native/WindowImpl.cs index 301071ac25..aefc950b94 100644 --- a/src/Avalonia.Native/WindowImpl.cs +++ b/src/Avalonia.Native/WindowImpl.cs @@ -11,7 +11,7 @@ namespace Avalonia.Native public WindowImpl(IAvaloniaNativeFactory factory) { using (var e = new WindowEvents(this)) - Init(_native = factory.CreateWindow(e)); + Init(_native = factory.CreateWindow(e), factory.CreateScreens()); } class WindowEvents : WindowBaseEvents, IAvnWindowEvents diff --git a/src/Avalonia.Native/WindowImplBase.cs b/src/Avalonia.Native/WindowImplBase.cs index 5a37f33cdf..09bba2c1c9 100644 --- a/src/Avalonia.Native/WindowImplBase.cs +++ b/src/Avalonia.Native/WindowImplBase.cs @@ -24,9 +24,10 @@ namespace Avalonia.Native _mouse = AvaloniaLocator.Current.GetService(); } - protected void Init(IAvnWindowBase window) + protected void Init(IAvnWindowBase window, IAvnScreens screens) { _native = window; + Screen = new ScreenImpl(screens); } public Size ClientSize @@ -144,11 +145,13 @@ namespace Avalonia.Native return new ImmediateRenderer(root); } - public void Dispose() + public virtual void Dispose() { _native.Close(); _native.Dispose(); _native = null; + + (Screen as ScreenImpl)?.Dispose(); } @@ -217,7 +220,7 @@ namespace Avalonia.Native public IPlatformHandle Handle => new PlatformHandle(IntPtr.Zero, "NOT SUPPORTED"); - public IScreenImpl Screen => new ScreenImpl(); + public IScreenImpl Screen { get; private set; } Action ITopLevelImpl.ScalingChanged { get; set; } diff --git a/src/headers/avalonia-native.h b/src/headers/avalonia-native.h index 1cc4b92de8..48a409e28d 100644 --- a/src/headers/avalonia-native.h +++ b/src/headers/avalonia-native.h @@ -9,6 +9,7 @@ struct IAvnMacOptions; struct IAvnPlatformThreadingInterface; struct IAvnSystemDialogEvents; struct IAvnSystemDialogs; +struct IAvnScreens; struct AvnSize { @@ -30,6 +31,13 @@ struct AvnPoint double X, Y; }; +struct AvnScreen +{ + AvnRect Bounds; + AvnRect WorkingArea; + bool Primary; +}; + enum AvnRawMouseEventType { LeaveWindow, @@ -65,6 +73,7 @@ public: virtual HRESULT CreatePopup (IAvnWindowEvents* cb, IAvnPopup** ppv) = 0; virtual HRESULT CreatePlatformThreadingInterface(IAvnPlatformThreadingInterface** ppv) = 0; virtual HRESULT CreateSystemDialogs (IAvnSystemDialogs** ppv) = 0; + virtual HRESULT CreateScreens (IAvnScreens** ppv) = 0; }; AVNCOM(IAvnWindowBase, 02) : virtual IUnknown @@ -179,4 +188,11 @@ AVNCOM(IAvnSystemDialogs, 0d) : virtual IUnknown const char* filters) = 0; }; +AVNCOM(IAvnScreens, 0e) : virtual IUnknown +{ + virtual HRESULT GetScreenCount (int* ret) = 0; + virtual HRESULT GetScreen (int index, AvnScreen** ret) = 0; + +}; + extern "C" IAvaloniaNativeFactory* CreateAvaloniaNative();