Browse Source

Do not enable MouseInPointerEnabled automatically and remove EnableWmPointerEvents option

Max Katz 3 years ago
parent
commit
5000a4ffe3

+ 1 - 1
.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

+ 0 - 1
samples/ControlCatalog.NetCore/Program.cs

@@ -115,7 +115,6 @@ namespace ControlCatalog.NetCore
                 })
                 .With(new Win32PlatformOptions
                 {
-                    EnableWmPointerEvents = true
                 })
                 .UseSkia()
                 .AfterSetup(builder =>

+ 1 - 9
src/Windows/Avalonia.Win32/Win32Platform.cs

@@ -68,17 +68,9 @@ namespace Avalonia
         /// <remarks>
         /// 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.
         /// </remarks>
-        [Obsolete("Multitouch is always enabled")]
+        [Obsolete("Multitouch is always enabled on supported Windows versions")]
         public bool? EnableMultitouch { get; set; } = true;
 
-        /// <summary>
-        /// Enables Win8+ WM_POINTER events support. The default value is false.
-        /// </summary>
-        /// <remarks>
-        /// Required for extended Pen and Touch support.
-        /// </remarks>
-        public bool? EnableWmPointerEvents { get; set; } = false;
-
         /// <summary>
         /// Embeds popups to the window when set to true. The default value is false.
         /// </summary>

+ 23 - 19
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<RECT>(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<MINMAXINFO>(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)

+ 8 - 12
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<RawPointerPoint> 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<RawPointerPoint> 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);