From 5000a4ffe35699233e1bd7039a9e380718e93994 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Sat, 2 Jul 2022 18:17:35 -0400 Subject: [PATCH] Do not enable MouseInPointerEnabled automatically and remove EnableWmPointerEvents option --- .editorconfig | 2 +- samples/ControlCatalog.NetCore/Program.cs | 1 - src/Windows/Avalonia.Win32/Win32Platform.cs | 10 +---- .../Avalonia.Win32/WindowImpl.AppWndProc.cs | 42 ++++++++++--------- src/Windows/Avalonia.Win32/WindowImpl.cs | 20 ++++----- 5 files changed, 33 insertions(+), 42 deletions(-) diff --git a/.editorconfig b/.editorconfig index cb589a5ce1..30edee1633 100644 --- a/.editorconfig +++ b/.editorconfig @@ -21,7 +21,7 @@ csharp_new_line_before_finally = true csharp_new_line_before_members_in_object_initializers = true csharp_new_line_before_members_in_anonymous_types = true csharp_new_line_between_query_expression_clauses = true -trim_trailing_whitespace = true +# trim_trailing_whitespace = true # Indentation preferences csharp_indent_block_contents = true diff --git a/samples/ControlCatalog.NetCore/Program.cs b/samples/ControlCatalog.NetCore/Program.cs index d6a297858d..13751b56b5 100644 --- a/samples/ControlCatalog.NetCore/Program.cs +++ b/samples/ControlCatalog.NetCore/Program.cs @@ -115,7 +115,6 @@ namespace ControlCatalog.NetCore }) .With(new Win32PlatformOptions { - EnableWmPointerEvents = true }) .UseSkia() .AfterSetup(builder => diff --git a/src/Windows/Avalonia.Win32/Win32Platform.cs b/src/Windows/Avalonia.Win32/Win32Platform.cs index aa597d6809..8f6993c040 100644 --- a/src/Windows/Avalonia.Win32/Win32Platform.cs +++ b/src/Windows/Avalonia.Win32/Win32Platform.cs @@ -68,17 +68,9 @@ namespace Avalonia /// /// Multitouch allows a surface (a touchpad or touchscreen) to recognize the presence of more than one point of contact with the surface at the same time. /// - [Obsolete("Multitouch is always enabled")] + [Obsolete("Multitouch is always enabled on supported Windows versions")] public bool? EnableMultitouch { get; set; } = true; - /// - /// Enables Win8+ WM_POINTER events support. The default value is false. - /// - /// - /// Required for extended Pen and Touch support. - /// - public bool? EnableWmPointerEvents { get; set; } = false; - /// /// Embeds popups to the window when set to true. The default value is false. /// diff --git a/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs b/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs index a2f9b7886a..4c7b9a0348 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs @@ -84,7 +84,7 @@ namespace Avalonia.Win32 case WindowsMessage.WM_DESTROY: { UiaCoreProviderApi.UiaReturnRawElementProvider(_hwnd, IntPtr.Zero, IntPtr.Zero, null); - + // We need to release IMM context and state to avoid leaks. if (Imm32InputMethod.Current.HWND == _hwnd) { @@ -110,9 +110,9 @@ namespace Avalonia.Win32 var newDisplayRect = Marshal.PtrToStructure(lParam); _scaling = dpi / 96.0; ScalingChanged?.Invoke(_scaling); - + using (SetResizeReason(PlatformResizeReason.DpiChange)) - { + { SetWindowPos(hWnd, IntPtr.Zero, newDisplayRect.left, @@ -180,7 +180,7 @@ namespace Avalonia.Win32 case WindowsMessage.WM_MBUTTONDOWN: case WindowsMessage.WM_XBUTTONDOWN: { - if (_wmPointerEnabled) + if (IsMouseInPointerEnabled) { break; } @@ -213,7 +213,7 @@ namespace Avalonia.Win32 case WindowsMessage.WM_MBUTTONUP: case WindowsMessage.WM_XBUTTONUP: { - if (_wmPointerEnabled) + if (IsMouseInPointerEnabled) { break; } @@ -241,12 +241,16 @@ namespace Avalonia.Win32 } // Mouse capture is lost case WindowsMessage.WM_CANCELMODE: - _mouseDevice.Capture(null); + if (!IsMouseInPointerEnabled) + { + _mouseDevice.Capture(null); + } + break; case WindowsMessage.WM_MOUSEMOVE: { - if (_wmPointerEnabled) + if (IsMouseInPointerEnabled) { break; } @@ -273,7 +277,7 @@ namespace Avalonia.Win32 timestamp, _owner, RawPointerEventType.Move, - DipFromLParam(lParam), + DipFromLParam(lParam), GetMouseModifiers(wParam)); break; @@ -281,7 +285,7 @@ namespace Avalonia.Win32 case WindowsMessage.WM_MOUSEWHEEL: { - if (_wmPointerEnabled) + if (IsMouseInPointerEnabled) { break; } @@ -290,14 +294,14 @@ namespace Avalonia.Win32 timestamp, _owner, PointToClient(PointFromLParam(lParam)), - new Vector(0, (ToInt32(wParam) >> 16) / wheelDelta), + new Vector(0, (ToInt32(wParam) >> 16) / wheelDelta), GetMouseModifiers(wParam)); break; } case WindowsMessage.WM_MOUSEHWHEEL: { - if (_wmPointerEnabled) + if (IsMouseInPointerEnabled) { break; } @@ -306,14 +310,14 @@ namespace Avalonia.Win32 timestamp, _owner, PointToClient(PointFromLParam(lParam)), - new Vector(-(ToInt32(wParam) >> 16) / wheelDelta, 0), + new Vector(-(ToInt32(wParam) >> 16) / wheelDelta, 0), GetMouseModifiers(wParam)); break; } case WindowsMessage.WM_MOUSELEAVE: { - if (_wmPointerEnabled) + if (IsMouseInPointerEnabled) { break; } @@ -323,7 +327,7 @@ namespace Avalonia.Win32 timestamp, _owner, RawPointerEventType.LeaveWindow, - new Point(-1, -1), + new Point(-1, -1), WindowsKeyboardDevice.Instance.Modifiers); break; } @@ -333,7 +337,7 @@ namespace Avalonia.Win32 case WindowsMessage.WM_NCMBUTTONDOWN: case WindowsMessage.WM_NCXBUTTONDOWN: { - if (_wmPointerEnabled) + if (IsMouseInPointerEnabled) { break; } @@ -598,7 +602,7 @@ namespace Avalonia.Win32 case WindowsMessage.WM_GETMINMAXINFO: { MINMAXINFO mmi = Marshal.PtrToStructure(lParam); - + _maxTrackSize = mmi.ptMaxTrackSize; if (_minSize.Width > 0) @@ -682,7 +686,7 @@ namespace Avalonia.Win32 if (_managedDrag.PreprocessInputEvent(ref e)) return UnmanagedMethods.DefWindowProc(hWnd, msg, wParam, lParam); #endif - + if(shouldTakeFocus) { SetFocus(_hwnd); @@ -915,11 +919,11 @@ namespace Avalonia.Win32 if (langid == _langid && Imm32InputMethod.Current.HWND == Hwnd) { return; - } + } _langid = langid; Imm32InputMethod.Current.SetLanguageAndWindow(this, Hwnd, hkl); - + } private static int ToInt32(IntPtr ptr) diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 95dac19d04..31f30a6e47 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -74,12 +74,12 @@ namespace Avalonia.Win32 private readonly ManagedDeferredRendererLock _rendererLock; private readonly FramebufferManager _framebuffer; private readonly IGlPlatformSurface _gl; + private readonly bool _wmPointerEnabled; private Win32NativeControlHost _nativeControlHost; private WndProc _wndProcDelegate; private string _className; private IntPtr _hwnd; - private bool _wmPointerEnabled; private IInputRoot _owner; private WindowProperties _windowProperties; private bool _trackingMouse;//ToDo - there is something missed. Needs investigation @Steven Kirk @@ -100,10 +100,10 @@ namespace Avalonia.Win32 private bool _ignoreWmChar; private const int MaxPointerHistorySize = 512; - private readonly static PooledList s_intermediatePointsPooledList = new(); - private readonly static POINTER_TOUCH_INFO[] s_historyTouchInfos = new POINTER_TOUCH_INFO[MaxPointerHistorySize]; - private readonly static POINTER_PEN_INFO[] s_historyPenInfos = new POINTER_PEN_INFO[MaxPointerHistorySize]; - private readonly static POINTER_INFO[] s_historyInfos = new POINTER_INFO[MaxPointerHistorySize]; + private static readonly PooledList s_intermediatePointsPooledList = new(); + private static readonly POINTER_TOUCH_INFO[] s_historyTouchInfos = new POINTER_TOUCH_INFO[MaxPointerHistorySize]; + private static readonly POINTER_PEN_INFO[] s_historyPenInfos = new POINTER_PEN_INFO[MaxPointerHistorySize]; + private static readonly POINTER_INFO[] s_historyInfos = new POINTER_INFO[MaxPointerHistorySize]; public WindowImpl() { @@ -138,13 +138,7 @@ namespace Avalonia.Win32 egl.Display is AngleWin32EglDisplay angleDisplay && angleDisplay.PlatformApi == AngleOptions.PlatformApi.DirectX11; - _wmPointerEnabled = Win32Platform.Options.EnableWmPointerEvents - ?? Win32Platform.WindowsVersion >= PlatformConstants.Windows8; - - if (_wmPointerEnabled && !IsMouseInPointerEnabled()) - { - EnableMouseInPointer(true); - } + _wmPointerEnabled = Win32Platform.WindowsVersion >= PlatformConstants.Windows8; CreateWindow(); _framebuffer = new FramebufferManager(_hwnd); @@ -300,6 +294,8 @@ namespace Avalonia.Win32 protected IntPtr Hwnd => _hwnd; + private bool IsMouseInPointerEnabled => _wmPointerEnabled && IsMouseInPointerEnabled(); + public void SetTransparencyLevelHint(WindowTransparencyLevel transparencyLevel) { TransparencyLevel = EnableBlur(transparencyLevel);