From 77b7026ac9c92b1d42b43dc8ae5184d6741582ff Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Mon, 5 Jun 2017 21:32:37 +0300 Subject: [PATCH 1/3] Removed IMouseDevice from service locator --- src/Android/Avalonia.Android/AndroidPlatform.cs | 1 - .../Avalonia.Android/Platform/Input/AndroidMouseDevice.cs | 2 ++ .../Platform/SkiaPlatform/TopLevelImpl.cs | 3 +++ src/Avalonia.Controls/Platform/ITopLevelImpl.cs | 7 +++++++ src/Avalonia.Controls/Primitives/Popup.cs | 4 ++-- src/Avalonia.Controls/ToolTip.cs | 3 +-- src/Avalonia.Controls/TopLevel.cs | 3 +++ src/Avalonia.Diagnostics/DevTools.xaml.cs | 3 ++- src/Avalonia.HtmlRenderer/Adapters/ControlAdapter.cs | 5 ++++- src/Avalonia.HtmlRenderer/HtmlControl.cs | 3 ++- src/Avalonia.Input/IInputRoot.cs | 8 ++++++++ src/Avalonia.Input/MouseDevice.cs | 7 +------ src/Gtk/Avalonia.Gtk/GtkPlatform.cs | 1 - src/Gtk/Avalonia.Gtk/TopLevelImpl.cs | 2 ++ src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs | 1 - src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs | 3 +++ .../Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs | 3 +++ .../Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs | 1 - src/Windows/Avalonia.Win32/Win32Platform.cs | 1 - src/Windows/Avalonia.Win32/WindowImpl.cs | 2 ++ src/iOS/Avalonia.iOS/TopLevelImpl.cs | 3 +++ src/iOS/Avalonia.iOS/iOSPlatform.cs | 1 - 22 files changed, 48 insertions(+), 19 deletions(-) diff --git a/src/Android/Avalonia.Android/AndroidPlatform.cs b/src/Android/Avalonia.Android/AndroidPlatform.cs index c779031e6c..e9b4ad0a6d 100644 --- a/src/Android/Avalonia.Android/AndroidPlatform.cs +++ b/src/Android/Avalonia.Android/AndroidPlatform.cs @@ -51,7 +51,6 @@ namespace Avalonia.Android .Bind().ToTransient() .Bind().ToTransient() .Bind().ToSingleton() - .Bind().ToSingleton() .Bind().ToConstant(Instance) .Bind().ToConstant(ImmediateRenderer.Factory) .Bind().ToConstant(new AndroidThreadingInterface()) diff --git a/src/Android/Avalonia.Android/Platform/Input/AndroidMouseDevice.cs b/src/Android/Avalonia.Android/Platform/Input/AndroidMouseDevice.cs index 9ae79efb48..d52eeb15e4 100644 --- a/src/Android/Avalonia.Android/Platform/Input/AndroidMouseDevice.cs +++ b/src/Android/Avalonia.Android/Platform/Input/AndroidMouseDevice.cs @@ -4,6 +4,8 @@ namespace Avalonia.Android.Platform.Input { public class AndroidMouseDevice : MouseDevice { + public static AndroidMouseDevice Instance { get; } = new AndroidMouseDevice(); + public AndroidMouseDevice() { diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs index 75772be171..dc6d6628e4 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs @@ -10,6 +10,7 @@ using Avalonia.Platform; using System; using System.Collections.Generic; using System.Reactive.Disposables; +using Avalonia.Android.Platform.Input; using Avalonia.Controls; using Avalonia.Controls.Platform.Surfaces; @@ -67,6 +68,8 @@ namespace Avalonia.Android.Platform.SkiaPlatform public Action Closed { get; set; } + public IMouseDevice MouseDevice => AndroidMouseDevice.Instance; + public Action Input { get; set; } public Size MaxClientSize { get; protected set; } diff --git a/src/Avalonia.Controls/Platform/ITopLevelImpl.cs b/src/Avalonia.Controls/Platform/ITopLevelImpl.cs index 16f436fd45..ba3ecb99c5 100644 --- a/src/Avalonia.Controls/Platform/ITopLevelImpl.cs +++ b/src/Avalonia.Controls/Platform/ITopLevelImpl.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using Avalonia.Input; using Avalonia.Input.Raw; +using JetBrains.Annotations; namespace Avalonia.Platform { @@ -93,5 +94,11 @@ namespace Avalonia.Platform /// Gets or sets a method called when the underlying implementation is destroyed. /// Action Closed { get; set; } + + /// + /// Gets a mouse device associated with toplevel + /// + [CanBeNull] + IMouseDevice MouseDevice { get; } } } diff --git a/src/Avalonia.Controls/Primitives/Popup.cs b/src/Avalonia.Controls/Primitives/Popup.cs index bb2a61c024..e69aaa10e9 100644 --- a/src/Avalonia.Controls/Primitives/Popup.cs +++ b/src/Avalonia.Controls/Primitives/Popup.cs @@ -340,11 +340,11 @@ namespace Avalonia.Controls.Primitives switch (mode) { case PlacementMode.Pointer: - if (MouseDevice.Instance != null) + if(PopupRoot != null) { // Scales the Horizontal and Vertical offset to screen co-ordinates. var screenOffset = new Point(HorizontalOffset * (PopupRoot as ILayoutRoot).LayoutScaling, VerticalOffset * (PopupRoot as ILayoutRoot).LayoutScaling); - return MouseDevice.Instance.Position + screenOffset; + return ((IInputRoot)PopupRoot).MouseDevice.Position + screenOffset; } return default(Point); diff --git a/src/Avalonia.Controls/ToolTip.cs b/src/Avalonia.Controls/ToolTip.cs index cff3dab150..b8896a3acf 100644 --- a/src/Avalonia.Controls/ToolTip.cs +++ b/src/Avalonia.Controls/ToolTip.cs @@ -109,8 +109,7 @@ namespace Avalonia.Controls { throw new AvaloniaInternalException("Previous ToolTip not disposed."); } - - var cp = MouseDevice.Instance?.GetPosition(control); + var cp = (control.GetVisualRoot() as IInputRoot)?.MouseDevice?.GetPosition(control); var position = control.PointToScreen(cp ?? new Point(0, 0)) + new Vector(0, 22); s_popup = new PopupRoot(); diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 1f1a29afa3..a0a8f6b27e 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -163,6 +163,9 @@ namespace Avalonia.Controls set { SetValue(PointerOverElementProperty, value); } } + /// + IMouseDevice IInputRoot.MouseDevice => PlatformImpl?.MouseDevice; + /// /// Gets or sets a value indicating whether access keys are shown in the window. /// diff --git a/src/Avalonia.Diagnostics/DevTools.xaml.cs b/src/Avalonia.Diagnostics/DevTools.xaml.cs index 10337d7386..b735372b59 100644 --- a/src/Avalonia.Diagnostics/DevTools.xaml.cs +++ b/src/Avalonia.Diagnostics/DevTools.xaml.cs @@ -106,7 +106,8 @@ namespace Avalonia.Diagnostics if ((e.Modifiers) == modifiers) { - var point = MouseDevice.Instance.GetPosition(Root); + + var point = (Root.VisualRoot as IInputRoot)?.MouseDevice?.GetPosition(Root) ?? default(Point); var control = Root.GetVisualsAt(point, x => (!(x is AdornerLayer) && x.IsVisible)) .FirstOrDefault(); diff --git a/src/Avalonia.HtmlRenderer/Adapters/ControlAdapter.cs b/src/Avalonia.HtmlRenderer/Adapters/ControlAdapter.cs index 523da3508e..9a55768f6a 100644 --- a/src/Avalonia.HtmlRenderer/Adapters/ControlAdapter.cs +++ b/src/Avalonia.HtmlRenderer/Adapters/ControlAdapter.cs @@ -10,9 +10,11 @@ // - Sun Tsu, // "The Art of War" +using Avalonia; using Avalonia.Controls; using Avalonia.Controls.Html; using Avalonia.Input; +using Avalonia.VisualTree; using TheArtOfDev.HtmlRenderer.Adapters; using TheArtOfDev.HtmlRenderer.Adapters.Entities; using TheArtOfDev.HtmlRenderer.Core.Utils; @@ -54,7 +56,8 @@ namespace TheArtOfDev.HtmlRenderer.Avalonia.Adapters { get { - return Util.Convert(MouseDevice.Instance.GetPosition(_control)); + var pos = (_control.GetVisualRoot() as IInputRoot)?.MouseDevice?.Position ?? default(Point); + return Util.Convert(pos); } } diff --git a/src/Avalonia.HtmlRenderer/HtmlControl.cs b/src/Avalonia.HtmlRenderer/HtmlControl.cs index 88a6e5fda4..0051f6427b 100644 --- a/src/Avalonia.HtmlRenderer/HtmlControl.cs +++ b/src/Avalonia.HtmlRenderer/HtmlControl.cs @@ -17,6 +17,7 @@ using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.Media; using Avalonia.Threading; +using Avalonia.VisualTree; using TheArtOfDev.HtmlRenderer.Core; using TheArtOfDev.HtmlRenderer.Core.Entities; using TheArtOfDev.HtmlRenderer.Avalonia; @@ -512,7 +513,7 @@ namespace Avalonia.Controls.Html protected virtual void InvokeMouseMove() { - _htmlContainer.HandleMouseMove(this, MouseDevice.Instance?.GetPosition(this) ?? default(Point)); + _htmlContainer.HandleMouseMove(this, (this.GetVisualRoot() as IInputRoot)?.MouseDevice?.GetPosition(this) ?? default(Point)); } /// diff --git a/src/Avalonia.Input/IInputRoot.cs b/src/Avalonia.Input/IInputRoot.cs index 6c01bb9c0e..6b3e1e6bc5 100644 --- a/src/Avalonia.Input/IInputRoot.cs +++ b/src/Avalonia.Input/IInputRoot.cs @@ -1,6 +1,8 @@ // Copyright (c) The Avalonia Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. +using JetBrains.Annotations; + namespace Avalonia.Input { /// @@ -27,5 +29,11 @@ namespace Avalonia.Input /// Gets or sets a value indicating whether access keys are shown in the window. /// bool ShowAccessKeys { get; set; } + + /// + /// Gets associated mouse device + /// + [CanBeNull] + IMouseDevice MouseDevice { get; } } } diff --git a/src/Avalonia.Input/MouseDevice.cs b/src/Avalonia.Input/MouseDevice.cs index cbcb4382ec..383032c625 100644 --- a/src/Avalonia.Input/MouseDevice.cs +++ b/src/Avalonia.Input/MouseDevice.cs @@ -31,12 +31,7 @@ namespace Avalonia.Input .Where(e => e.Device == this && !e.Handled) .Subscribe(ProcessRawEvent); } - - /// - /// Gets the current mouse device instance. - /// - public static IMouseDevice Instance => AvaloniaLocator.Current.GetService(); - + /// /// Gets the control that is currently capturing by the mouse, if any. /// diff --git a/src/Gtk/Avalonia.Gtk/GtkPlatform.cs b/src/Gtk/Avalonia.Gtk/GtkPlatform.cs index d387ed0320..ef7e4d3362 100644 --- a/src/Gtk/Avalonia.Gtk/GtkPlatform.cs +++ b/src/Gtk/Avalonia.Gtk/GtkPlatform.cs @@ -51,7 +51,6 @@ namespace Avalonia.Gtk .Bind().ToSingleton() .Bind().ToConstant(CursorFactory.Instance) .Bind().ToConstant(GtkKeyboardDevice.Instance) - .Bind().ToConstant(GtkMouseDevice.Instance) .Bind().ToConstant(s_instance) .Bind().ToConstant(s_instance) .Bind().ToConstant(s_instance) diff --git a/src/Gtk/Avalonia.Gtk/TopLevelImpl.cs b/src/Gtk/Avalonia.Gtk/TopLevelImpl.cs index a1bb3f847e..93175547ce 100644 --- a/src/Gtk/Avalonia.Gtk/TopLevelImpl.cs +++ b/src/Gtk/Avalonia.Gtk/TopLevelImpl.cs @@ -114,6 +114,8 @@ namespace Avalonia.Gtk public Action Closed { get; set; } + public IMouseDevice MouseDevice => GtkMouseDevice.Instance; + public Action Deactivated { get; set; } public Action Input { get; set; } diff --git a/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs b/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs index a2913b4066..a3db0def74 100644 --- a/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs +++ b/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs @@ -34,7 +34,6 @@ namespace Avalonia.Gtk3 .Bind().ToSingleton() .Bind().ToConstant(new CursorFactory()) .Bind().ToConstant(Keyboard) - .Bind().ToConstant(Mouse) .Bind().ToConstant(Instance) .Bind().ToConstant(Instance) .Bind().ToSingleton() diff --git a/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs b/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs index 478580e65e..eae882bd3b 100644 --- a/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs +++ b/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs @@ -242,6 +242,9 @@ namespace Avalonia.Gtk3 public Action Activated { get; set; } public Action Closed { get; set; } + + public IMouseDevice MouseDevice => Gtk3Platform.Mouse; + public Action Deactivated { get; set; } public Action Input { get; set; } public Action Paint { get; set; } diff --git a/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs b/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs index 193d2c1d05..504fbf0d2a 100644 --- a/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs +++ b/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs @@ -63,6 +63,9 @@ namespace Avalonia.LinuxFramebuffer public Action Resized { get; set; } public Action ScalingChanged { get; set; } public Action Closed { get; set; } + + public IMouseDevice MouseDevice => LinuxFramebufferPlatform.MouseDevice; + public event Action LostFocus; } } diff --git a/src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs b/src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs index a65a91d6b0..5f1c55fd5d 100644 --- a/src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs +++ b/src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs @@ -33,7 +33,6 @@ namespace Avalonia.LinuxFramebuffer AvaloniaLocator.CurrentMutable .Bind().ToTransient() .Bind().ToConstant(KeyboardDevice) - .Bind().ToConstant(MouseDevice) .Bind().ToSingleton() .Bind().ToConstant(ImmediateRenderer.Factory) .Bind().ToConstant(PlatformThreadingInterface.Instance) diff --git a/src/Windows/Avalonia.Win32/Win32Platform.cs b/src/Windows/Avalonia.Win32/Win32Platform.cs index b6cfb03221..e02c67c0e6 100644 --- a/src/Windows/Avalonia.Win32/Win32Platform.cs +++ b/src/Windows/Avalonia.Win32/Win32Platform.cs @@ -66,7 +66,6 @@ namespace Avalonia.Win32 .Bind().ToSingleton() .Bind().ToConstant(CursorFactory.Instance) .Bind().ToConstant(WindowsKeyboardDevice.Instance) - .Bind().ToConstant(WindowsMouseDevice.Instance) .Bind().ToConstant(s_instance) .Bind().ToConstant(s_instance) .Bind().ToConstant(new RenderLoop(60)) diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index f2d7e0e043..d1ce385810 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -49,6 +49,8 @@ namespace Avalonia.Win32 public Action Closed { get; set; } + public IMouseDevice MouseDevice => WindowsMouseDevice.Instance; + public Action Deactivated { get; set; } public Action Input { get; set; } diff --git a/src/iOS/Avalonia.iOS/TopLevelImpl.cs b/src/iOS/Avalonia.iOS/TopLevelImpl.cs index 7949e331fe..b65082bdc2 100644 --- a/src/iOS/Avalonia.iOS/TopLevelImpl.cs +++ b/src/iOS/Avalonia.iOS/TopLevelImpl.cs @@ -47,6 +47,9 @@ namespace Avalonia.iOS public override bool CanBecomeFirstResponder => _keyboardHelper.CanBecomeFirstResponder(); public Action Closed { get; set; } + + public IMouseDevice MouseDevice => iOSPlatform.MouseDevice; + public Action Input { get; set; } public Action Paint { get; set; } public Action Resized { get; set; } diff --git a/src/iOS/Avalonia.iOS/iOSPlatform.cs b/src/iOS/Avalonia.iOS/iOSPlatform.cs index 6d6e1fab03..4c4e497cd7 100644 --- a/src/iOS/Avalonia.iOS/iOSPlatform.cs +++ b/src/iOS/Avalonia.iOS/iOSPlatform.cs @@ -57,7 +57,6 @@ namespace Avalonia.iOS //.Bind().ToTransient() .Bind().ToTransient() .Bind().ToConstant(KeyboardDevice) - .Bind().ToConstant(MouseDevice) .Bind().ToConstant(ImmediateRenderer.Factory) .Bind().ToSingleton() .Bind().ToConstant(PlatformThreadingInterface.Instance) From 21da2df1ec4d9c52386f5cb41957e811df8aa2ce Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Mon, 5 Jun 2017 21:51:08 +0300 Subject: [PATCH 2/3] Call ProcessRawEvent directly from the input manager --- src/Avalonia.Input/IInputDevice.cs | 7 +++++++ src/Avalonia.Input/InputManager.cs | 1 + src/Avalonia.Input/KeyboardDevice.cs | 12 +++--------- src/Avalonia.Input/MouseDevice.cs | 26 ++++++++------------------ 4 files changed, 19 insertions(+), 27 deletions(-) diff --git a/src/Avalonia.Input/IInputDevice.cs b/src/Avalonia.Input/IInputDevice.cs index 916f29376a..5a47504b1b 100644 --- a/src/Avalonia.Input/IInputDevice.cs +++ b/src/Avalonia.Input/IInputDevice.cs @@ -1,9 +1,16 @@ // Copyright (c) The Avalonia Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. +using Avalonia.Input.Raw; + namespace Avalonia.Input { public interface IInputDevice { + /// + /// Processes raw event. Is called after preprocessing by InputManager + /// + /// + void ProcessOwnRawEvent(RawInputEventArgs ev); } } diff --git a/src/Avalonia.Input/InputManager.cs b/src/Avalonia.Input/InputManager.cs index 7aa609e65c..b9aacb6a4b 100644 --- a/src/Avalonia.Input/InputManager.cs +++ b/src/Avalonia.Input/InputManager.cs @@ -35,6 +35,7 @@ namespace Avalonia.Input public void ProcessInput(RawInputEventArgs e) { _preProcess.OnNext(e); + e.Device?.ProcessOwnRawEvent(e); _process.OnNext(e); _postProcess.OnNext(e); } diff --git a/src/Avalonia.Input/KeyboardDevice.cs b/src/Avalonia.Input/KeyboardDevice.cs index 51af01f69b..aa90dd1772 100644 --- a/src/Avalonia.Input/KeyboardDevice.cs +++ b/src/Avalonia.Input/KeyboardDevice.cs @@ -16,14 +16,6 @@ namespace Avalonia.Input { private IInputElement _focusedElement; - public KeyboardDevice() - { - InputManager.Process - .OfType() - .Where(e => e.Device == this && !e.Handled) - .Subscribe(ProcessRawEvent); - } - public event PropertyChangedEventHandler PropertyChanged; public static IKeyboardDevice Instance => AvaloniaLocator.Current.GetService(); @@ -77,8 +69,10 @@ namespace Avalonia.Input PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } - private void ProcessRawEvent(RawInputEventArgs e) + public void ProcessOwnRawEvent(RawInputEventArgs e) { + if(e.Handled) + return; IInputElement element = FocusedElement; if (element != null) diff --git a/src/Avalonia.Input/MouseDevice.cs b/src/Avalonia.Input/MouseDevice.cs index 383032c625..9fba5799b5 100644 --- a/src/Avalonia.Input/MouseDevice.cs +++ b/src/Avalonia.Input/MouseDevice.cs @@ -20,18 +20,7 @@ namespace Avalonia.Input private int _clickCount; private Rect _lastClickRect; private uint _lastClickTime; - - /// - /// Intializes a new instance of . - /// - public MouseDevice() - { - InputManager.Process - .OfType() - .Where(e => e.Device == this && !e.Handled) - .Subscribe(ProcessRawEvent); - } - + /// /// Gets the control that is currently capturing by the mouse, if any. /// @@ -45,12 +34,7 @@ namespace Avalonia.Input get; protected set; } - - /// - /// Gets the application's input manager. - /// - public IInputManager InputManager => AvaloniaLocator.Current.GetService(); - + /// /// Gets the mouse position, in screen coordinates. /// @@ -97,6 +81,12 @@ namespace Avalonia.Input return root.PointToClient(Position) - p; } + public void ProcessOwnRawEvent(RawInputEventArgs e) + { + if (!e.Handled && e is RawMouseEventArgs margs) + ProcessRawEvent(margs); + } + private void ProcessRawEvent(RawMouseEventArgs e) { Contract.Requires(e != null); From 91691c30a700194b139a9dee0909fe27edaead81 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Tue, 6 Jun 2017 01:25:45 +0300 Subject: [PATCH 3/3] PR notes --- .../Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs | 4 ++-- src/Avalonia.Input/IInputDevice.cs | 2 +- src/Avalonia.Input/InputManager.cs | 2 +- src/Avalonia.Input/KeyboardDevice.cs | 2 +- src/Avalonia.Input/MouseDevice.cs | 2 +- src/Gtk/Avalonia.Gtk/TopLevelImpl.cs | 3 ++- src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs | 4 +--- .../Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs | 4 +--- src/Windows/Avalonia.Win32/WindowImpl.cs | 4 ++-- src/iOS/Avalonia.iOS/TopLevelImpl.cs | 5 ++--- 10 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs index dc6d6628e4..0c62eb9060 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs @@ -66,10 +66,10 @@ namespace Avalonia.Android.Platform.SkiaPlatform } } - public Action Closed { get; set; } - public IMouseDevice MouseDevice => AndroidMouseDevice.Instance; + public Action Closed { get; set; } + public Action Input { get; set; } public Size MaxClientSize { get; protected set; } diff --git a/src/Avalonia.Input/IInputDevice.cs b/src/Avalonia.Input/IInputDevice.cs index 5a47504b1b..72fa2ab9bf 100644 --- a/src/Avalonia.Input/IInputDevice.cs +++ b/src/Avalonia.Input/IInputDevice.cs @@ -11,6 +11,6 @@ namespace Avalonia.Input /// Processes raw event. Is called after preprocessing by InputManager /// /// - void ProcessOwnRawEvent(RawInputEventArgs ev); + void ProcessRawEvent(RawInputEventArgs ev); } } diff --git a/src/Avalonia.Input/InputManager.cs b/src/Avalonia.Input/InputManager.cs index b9aacb6a4b..9e2d5ffea3 100644 --- a/src/Avalonia.Input/InputManager.cs +++ b/src/Avalonia.Input/InputManager.cs @@ -35,7 +35,7 @@ namespace Avalonia.Input public void ProcessInput(RawInputEventArgs e) { _preProcess.OnNext(e); - e.Device?.ProcessOwnRawEvent(e); + e.Device?.ProcessRawEvent(e); _process.OnNext(e); _postProcess.OnNext(e); } diff --git a/src/Avalonia.Input/KeyboardDevice.cs b/src/Avalonia.Input/KeyboardDevice.cs index aa90dd1772..d815f8082b 100644 --- a/src/Avalonia.Input/KeyboardDevice.cs +++ b/src/Avalonia.Input/KeyboardDevice.cs @@ -69,7 +69,7 @@ namespace Avalonia.Input PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } - public void ProcessOwnRawEvent(RawInputEventArgs e) + public void ProcessRawEvent(RawInputEventArgs e) { if(e.Handled) return; diff --git a/src/Avalonia.Input/MouseDevice.cs b/src/Avalonia.Input/MouseDevice.cs index 9fba5799b5..875a5ebaee 100644 --- a/src/Avalonia.Input/MouseDevice.cs +++ b/src/Avalonia.Input/MouseDevice.cs @@ -81,7 +81,7 @@ namespace Avalonia.Input return root.PointToClient(Position) - p; } - public void ProcessOwnRawEvent(RawInputEventArgs e) + public void ProcessRawEvent(RawInputEventArgs e) { if (!e.Handled && e is RawMouseEventArgs margs) ProcessRawEvent(margs); diff --git a/src/Gtk/Avalonia.Gtk/TopLevelImpl.cs b/src/Gtk/Avalonia.Gtk/TopLevelImpl.cs index 93175547ce..ce1f50ac0f 100644 --- a/src/Gtk/Avalonia.Gtk/TopLevelImpl.cs +++ b/src/Gtk/Avalonia.Gtk/TopLevelImpl.cs @@ -75,6 +75,8 @@ namespace Avalonia.Gtk } } + public IMouseDevice MouseDevice => GtkMouseDevice.Instance; + public Avalonia.Controls.WindowState WindowState { get @@ -114,7 +116,6 @@ namespace Avalonia.Gtk public Action Closed { get; set; } - public IMouseDevice MouseDevice => GtkMouseDevice.Instance; public Action Deactivated { get; set; } diff --git a/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs b/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs index eae882bd3b..00130346e8 100644 --- a/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs +++ b/src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs @@ -233,6 +233,7 @@ namespace Avalonia.Gtk3 } } + public IMouseDevice MouseDevice => Gtk3Platform.Mouse; public double Scaling => (double) 1 / (Native.GtkWidgetGetScaleFactor?.Invoke(GtkWidget) ?? 1); @@ -242,9 +243,6 @@ namespace Avalonia.Gtk3 public Action Activated { get; set; } public Action Closed { get; set; } - - public IMouseDevice MouseDevice => Gtk3Platform.Mouse; - public Action Deactivated { get; set; } public Action Input { get; set; } public Action Paint { get; set; } diff --git a/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs b/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs index 504fbf0d2a..0854f9acf4 100644 --- a/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs +++ b/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs @@ -56,6 +56,7 @@ namespace Avalonia.LinuxFramebuffer } public Size ClientSize => _fb.PixelSize; + public IMouseDevice MouseDevice => LinuxFramebufferPlatform.MouseDevice; public double Scaling => 1; public IEnumerable Surfaces => new object[] {_fb}; public Action Input { get; set; } @@ -63,9 +64,6 @@ namespace Avalonia.LinuxFramebuffer public Action Resized { get; set; } public Action ScalingChanged { get; set; } public Action Closed { get; set; } - - public IMouseDevice MouseDevice => LinuxFramebufferPlatform.MouseDevice; - public event Action LostFocus; } } diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index d1ce385810..f1537e53f5 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -49,8 +49,6 @@ namespace Avalonia.Win32 public Action Closed { get; set; } - public IMouseDevice MouseDevice => WindowsMouseDevice.Instance; - public Action Deactivated { get; set; } public Action Input { get; set; } @@ -135,6 +133,8 @@ namespace Avalonia.Win32 } } + public IMouseDevice MouseDevice => WindowsMouseDevice.Instance; + public WindowState WindowState { get diff --git a/src/iOS/Avalonia.iOS/TopLevelImpl.cs b/src/iOS/Avalonia.iOS/TopLevelImpl.cs index b65082bdc2..cf4801dbb7 100644 --- a/src/iOS/Avalonia.iOS/TopLevelImpl.cs +++ b/src/iOS/Avalonia.iOS/TopLevelImpl.cs @@ -47,9 +47,6 @@ namespace Avalonia.iOS public override bool CanBecomeFirstResponder => _keyboardHelper.CanBecomeFirstResponder(); public Action Closed { get; set; } - - public IMouseDevice MouseDevice => iOSPlatform.MouseDevice; - public Action Input { get; set; } public Action Paint { get; set; } public Action Resized { get; set; } @@ -64,6 +61,8 @@ namespace Avalonia.iOS public Size ClientSize => Bounds.Size.ToAvalonia(); + public IMouseDevice MouseDevice => iOSPlatform.MouseDevice; + public override void Draw(CGRect rect) { Paint?.Invoke(new Rect(rect.X, rect.Y, rect.Width, rect.Height));