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);