diff --git a/.modules/OpenTabletDriver b/.modules/OpenTabletDriver index 78e9d03..b8b346c 160000 --- a/.modules/OpenTabletDriver +++ b/.modules/OpenTabletDriver @@ -1 +1 @@ -Subproject commit 78e9d03766e61f986d3b510dfd3b23c74917d895 +Subproject commit b8b346c4e50186f5f623beedb2fdb682600c2b61 diff --git a/OutputMode/VMultiMode/Output/VMultiAbsoluteMode.cs b/OutputMode/VMultiMode/Output/VMultiAbsoluteMode.cs index 04d1008..b3918ef 100644 --- a/OutputMode/VMultiMode/Output/VMultiAbsoluteMode.cs +++ b/OutputMode/VMultiMode/Output/VMultiAbsoluteMode.cs @@ -11,17 +11,18 @@ namespace VoiDPlugins.OutputMode public class VMultiAbsoluteMode : AbsoluteOutputMode { private VMultiAbsolutePointer? _pointer; + private IVirtualScreen? _virtualScreen; [Resolved] public IServiceProvider ServiceProvider { - set => _pointer = new VMultiAbsolutePointer((IVirtualScreen)value.GetService(typeof(IVirtualScreen))!); + set => _virtualScreen = (IVirtualScreen)value.GetService(typeof(IVirtualScreen))!; } [OnDependencyLoad] public void Initialize() { - _pointer!.Initialize(TabletReference); + _pointer = new VMultiAbsolutePointer(TabletReference, _virtualScreen!); } public override IAbsolutePointer Pointer diff --git a/OutputMode/VMultiMode/Output/VMultiRelativeMode.cs b/OutputMode/VMultiMode/Output/VMultiRelativeMode.cs index 9853fb0..22e4cab 100644 --- a/OutputMode/VMultiMode/Output/VMultiRelativeMode.cs +++ b/OutputMode/VMultiMode/Output/VMultiRelativeMode.cs @@ -13,8 +13,7 @@ namespace VoiDPlugins.OutputMode [OnDependencyLoad] public void Initialize() { - _pointer = new VMultiRelativePointer(); - _pointer!.Initialize(TabletReference); + _pointer = new VMultiRelativePointer(TabletReference); } public override IRelativePointer Pointer diff --git a/OutputMode/VMultiMode/Pointer/VMultiAbsolutePointer.cs b/OutputMode/VMultiMode/Pointer/VMultiAbsolutePointer.cs index b7f6196..15fd301 100644 --- a/OutputMode/VMultiMode/Pointer/VMultiAbsolutePointer.cs +++ b/OutputMode/VMultiMode/Pointer/VMultiAbsolutePointer.cs @@ -9,19 +9,15 @@ namespace VoiDPlugins.OutputMode { public unsafe class VMultiAbsolutePointer : IAbsolutePointer, ISynchronousPointer { - private AbsoluteInputReport* _rawPointer; - private VMultiInstance? _instance; + private readonly AbsoluteInputReport* _rawPointer; + private readonly VMultiInstance? _instance; private Vector2 _conversionFactor; - public VMultiAbsolutePointer(IVirtualScreen virtualScreen) - { - _conversionFactor = new Vector2(virtualScreen.Width, virtualScreen.Height) / (1 / 32767); - } - - public void Initialize(TabletReference tabletReference) + public VMultiAbsolutePointer(TabletReference tabletReference, IVirtualScreen virtualScreen) { _instance = VMultiInstanceManager.RetrieveVMultiInstance("VMultiAbs", tabletReference, () => new AbsoluteInputReport()); _rawPointer = _instance.Pointer; + _conversionFactor = new Vector2(32767, 32767) / new Vector2(virtualScreen.Width, virtualScreen.Height); } public void SetPosition(Vector2 pos) diff --git a/OutputMode/VMultiMode/Pointer/VMultiRelativePointer.cs b/OutputMode/VMultiMode/Pointer/VMultiRelativePointer.cs index 686a03b..be755c3 100644 --- a/OutputMode/VMultiMode/Pointer/VMultiRelativePointer.cs +++ b/OutputMode/VMultiMode/Pointer/VMultiRelativePointer.cs @@ -8,11 +8,11 @@ namespace VoiDPlugins.OutputMode { public unsafe class VMultiRelativePointer : IRelativePointer, ISynchronousPointer { - private RelativeInputReport* _rawPointer; - private VMultiInstance? _instance; + private readonly RelativeInputReport* _rawPointer; + private readonly VMultiInstance? _instance; private Vector2 _error; - public void Initialize(TabletReference tabletReference) + public VMultiRelativePointer(TabletReference tabletReference) { _instance = VMultiInstanceManager.RetrieveVMultiInstance("VMultiRel", tabletReference, () => new RelativeInputReport()); _rawPointer = _instance.Pointer; diff --git a/OutputMode/WindowsInk/Output/WinInkAbsoluteMode.cs b/OutputMode/WindowsInk/Output/WinInkAbsoluteMode.cs index 67514ce..155e8fe 100644 --- a/OutputMode/WindowsInk/Output/WinInkAbsoluteMode.cs +++ b/OutputMode/WindowsInk/Output/WinInkAbsoluteMode.cs @@ -11,17 +11,18 @@ namespace VoiDPlugins.OutputMode public class WinInkAbsoluteMode : AbsoluteOutputMode { private WinInkAbsolutePointer? _pointer; + private IVirtualScreen? _virtualScreen; [Resolved] public IServiceProvider ServiceProvider { - set => _pointer = new WinInkAbsolutePointer((IVirtualScreen)value.GetService(typeof(IVirtualScreen))!); + set => _virtualScreen = (IVirtualScreen)value.GetService(typeof(IVirtualScreen))!; } [OnDependencyLoad] public void Initialize() { - _pointer!.Initialize(TabletReference); + _pointer = new WinInkAbsolutePointer(TabletReference, _virtualScreen!); } public override IAbsolutePointer Pointer diff --git a/OutputMode/WindowsInk/Output/WinInkRelativeMode.cs b/OutputMode/WindowsInk/Output/WinInkRelativeMode.cs index b7e3b54..50c9d1f 100644 --- a/OutputMode/WindowsInk/Output/WinInkRelativeMode.cs +++ b/OutputMode/WindowsInk/Output/WinInkRelativeMode.cs @@ -11,17 +11,18 @@ namespace VoiDPlugins.OutputMode public class WinInkRelativeMode : RelativeOutputMode { private WinInkRelativePointer? _pointer; + private IVirtualScreen? _virtualScreen; [Resolved] public IServiceProvider ServiceProvider { - set => _pointer = new WinInkRelativePointer((IVirtualScreen)value.GetService(typeof(IVirtualScreen))!); + set => _virtualScreen = (IVirtualScreen)value.GetService(typeof(IVirtualScreen))!; } [OnDependencyLoad] public void Initialize() { - _pointer!.Initialize(TabletReference); + _pointer = new WinInkRelativePointer(TabletReference, _virtualScreen!); } public override IRelativePointer Pointer diff --git a/OutputMode/WindowsInk/Pointer/WinInkAbsolutePointer.cs b/OutputMode/WindowsInk/Pointer/WinInkAbsolutePointer.cs index 550a3e1..44c0ff1 100644 --- a/OutputMode/WindowsInk/Pointer/WinInkAbsolutePointer.cs +++ b/OutputMode/WindowsInk/Pointer/WinInkAbsolutePointer.cs @@ -1,6 +1,7 @@ using System.Numerics; using OpenTabletDriver.Plugin.Platform.Display; using OpenTabletDriver.Plugin.Platform.Pointer; +using OpenTabletDriver.Plugin.Tablet; namespace VoiDPlugins.OutputMode { @@ -8,13 +9,14 @@ namespace VoiDPlugins.OutputMode { private readonly Vector2 _conversionFactor; - public WinInkAbsolutePointer(IVirtualScreen screen) + public WinInkAbsolutePointer(TabletReference tabletReference, IVirtualScreen screen) : base(tabletReference) { - _conversionFactor = new Vector2(screen.Width, screen.Height) / (1 / 32767); + _conversionFactor = new Vector2(32767, 32767) / new Vector2(screen.Width, screen.Height); } public void SetPosition(Vector2 pos) { + Instance!.EnableButtonBit((int)WindowsInkButtonFlags.InRange); pos *= _conversionFactor; RawPointer->X = (ushort)pos.X; RawPointer->Y = (ushort)pos.Y; diff --git a/OutputMode/WindowsInk/Pointer/WinInkBasePointer.cs b/OutputMode/WindowsInk/Pointer/WinInkBasePointer.cs index d873626..615c720 100644 --- a/OutputMode/WindowsInk/Pointer/WinInkBasePointer.cs +++ b/OutputMode/WindowsInk/Pointer/WinInkBasePointer.cs @@ -10,10 +10,10 @@ namespace VoiDPlugins.OutputMode { public unsafe abstract class WinInkBasePointer : IPressureHandler, ITiltHandler, IEraserHandler, ISynchronousPointer { - protected DigitizerInputReport* RawPointer { get; private set; } - protected VMultiInstance? Instance { get; private set; } + protected DigitizerInputReport* RawPointer { get; } + protected VMultiInstance? Instance { get; } - public void Initialize(TabletReference tabletReference) + public WinInkBasePointer(TabletReference tabletReference) { Instance = VMultiInstanceManager.RetrieveVMultiInstance("WindowsInk", tabletReference, () => new DigitizerInputReport()); Instance.InitializeData(POINTER, this); @@ -26,7 +26,7 @@ namespace VoiDPlugins.OutputMode { if (!Instance!.GetData>(MANUAL_ERASER).Value) { - WinInkButtonHandler.EraserStateTransition(Instance, ref GetEraser(), isEraser); + WindowsInkButtonHandler.EraserStateTransition(Instance, ref GetEraser(), isEraser); } } @@ -43,6 +43,7 @@ namespace VoiDPlugins.OutputMode public void Reset() { + Instance!.DisableButtonBit((int)WindowsInkButtonFlags.InRange); } public void Flush() diff --git a/OutputMode/WindowsInk/Pointer/WinInkRelativePointer.cs b/OutputMode/WindowsInk/Pointer/WinInkRelativePointer.cs index c45a1d1..c4eb21d 100644 --- a/OutputMode/WindowsInk/Pointer/WinInkRelativePointer.cs +++ b/OutputMode/WindowsInk/Pointer/WinInkRelativePointer.cs @@ -1,6 +1,7 @@ using System.Numerics; using OpenTabletDriver.Plugin.Platform.Display; using OpenTabletDriver.Plugin.Platform.Pointer; +using OpenTabletDriver.Plugin.Tablet; namespace VoiDPlugins.OutputMode { @@ -10,7 +11,7 @@ namespace VoiDPlugins.OutputMode private Vector2 _currentPoint; private Vector2 _error; - public WinInkRelativePointer(IVirtualScreen screen) + public WinInkRelativePointer(TabletReference tabletReference, IVirtualScreen screen) : base(tabletReference) { _maxPoint = new Vector2(screen.Width, screen.Height); _currentPoint = _maxPoint / 2; @@ -18,6 +19,7 @@ namespace VoiDPlugins.OutputMode public void SetPosition(Vector2 delta) { + Instance!.EnableButtonBit((int)WindowsInkButtonFlags.InRange); delta += _error; _error = new Vector2(delta.X % 1, delta.Y % 1); diff --git a/OutputMode/WindowsInk/WinInkButtonHandler.cs b/OutputMode/WindowsInk/WinInkButtonHandler.cs index 3e1ccd3..c6a15c1 100644 --- a/OutputMode/WindowsInk/WinInkButtonHandler.cs +++ b/OutputMode/WindowsInk/WinInkButtonHandler.cs @@ -1,4 +1,3 @@ -using System; using OpenTabletDriver.Plugin; using OpenTabletDriver.Plugin.Attributes; using OpenTabletDriver.Plugin.Tablet; @@ -10,7 +9,7 @@ using static VoiDPlugins.OutputMode.WindowsInkConstants; namespace VoiDPlugins.OutputMode { [PluginName("Windows Ink")] - public unsafe class WinInkButtonHandler : IStateBinding + public unsafe partial class WindowsInkButtonHandler : IStateBinding { private VMultiInstance? _instance; @@ -25,16 +24,6 @@ namespace VoiDPlugins.OutputMode [Property("Button"), PropertyValidated(nameof(ValidButtons))] public string? Button { get; set; } - [Flags] - private enum ButtonBits : byte - { - Press = 1, - Barrel = 2, - Eraser = 4, - Invert = 8, - InRange = 16 - } - public bool IsManuallySet { get; set; } [TabletReference] @@ -51,11 +40,11 @@ namespace VoiDPlugins.OutputMode switch (Button) { case "Pen Tip": - _instance!.EnableButtonBit((int)(eraserState.Value ? ButtonBits.Eraser : ButtonBits.Press)); + _instance!.EnableButtonBit((int)(eraserState.Value ? WindowsInkButtonFlags.Eraser : WindowsInkButtonFlags.Press)); break; case "Pen Button": - _instance!.EnableButtonBit((int)ButtonBits.Barrel); + _instance!.EnableButtonBit((int)WindowsInkButtonFlags.Barrel); break; case "Eraser (Toggle)": @@ -75,11 +64,11 @@ namespace VoiDPlugins.OutputMode switch (Button) { case "Pen Tip": - _instance!.DisableButtonBit((int)(ButtonBits.Press | ButtonBits.Eraser)); + _instance!.DisableButtonBit((int)(WindowsInkButtonFlags.Press | WindowsInkButtonFlags.Eraser)); break; case "Pen Button": - _instance!.DisableButtonBit((int)ButtonBits.Barrel); + _instance!.DisableButtonBit((int)WindowsInkButtonFlags.Barrel); break; case "Eraser (Hold)": @@ -98,7 +87,7 @@ namespace VoiDPlugins.OutputMode var pressure = report->Pressure; // Send In-Range but no tips - instance.DisableButtonBit((int)(ButtonBits.Press | ButtonBits.Eraser)); + instance.DisableButtonBit((int)(WindowsInkButtonFlags.Press | WindowsInkButtonFlags.Eraser)); report->Pressure = 0; instance.Write(); @@ -107,15 +96,15 @@ namespace VoiDPlugins.OutputMode instance.Write(); // Send In-Range but no tips - instance.EnableButtonBit((int)ButtonBits.InRange); + instance.EnableButtonBit((int)WindowsInkButtonFlags.InRange); if (eraserState.Value) - instance.EnableButtonBit((int)ButtonBits.Invert); + instance.EnableButtonBit((int)WindowsInkButtonFlags.Invert); instance.Write(); // Set Proper Report - if (VMultiInstance.HasBit(buttons, (int)(ButtonBits.Press | ButtonBits.Eraser))) - instance.EnableButtonBit((int)(eraserState.Value ? ButtonBits.Eraser : ButtonBits.Press)); + if (VMultiInstance.HasBit(buttons, (int)(WindowsInkButtonFlags.Press | WindowsInkButtonFlags.Eraser))) + instance.EnableButtonBit((int)(eraserState.Value ? WindowsInkButtonFlags.Eraser : WindowsInkButtonFlags.Press)); report->Pressure = pressure; } } diff --git a/OutputMode/WindowsInk/WindowsInkButtonFlags.cs b/OutputMode/WindowsInk/WindowsInkButtonFlags.cs new file mode 100644 index 0000000..6ebe66b --- /dev/null +++ b/OutputMode/WindowsInk/WindowsInkButtonFlags.cs @@ -0,0 +1,14 @@ +using System; + +namespace VoiDPlugins.OutputMode +{ + [Flags] + public enum WindowsInkButtonFlags : byte + { + Press = 1, + Barrel = 2, + Eraser = 4, + Invert = 8, + InRange = 16 + } +} \ No newline at end of file diff --git a/VoiDPlugins.Library/VMulti/Device/DigitizerInputReport.cs b/VoiDPlugins.Library/VMulti/Device/DigitizerInputReport.cs index d3b7837..f7d1964 100644 --- a/VoiDPlugins.Library/VMulti/Device/DigitizerInputReport.cs +++ b/VoiDPlugins.Library/VMulti/Device/DigitizerInputReport.cs @@ -6,9 +6,9 @@ namespace VoiDPlugins.Library.VMulti.Device [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct DigitizerInputReport { - public DigitizerInputReport(byte reportID) + public DigitizerInputReport() { - Header = new VMultiReportHeader(Unsafe.SizeOf(), reportID); + Header = new VMultiReportHeader(Unsafe.SizeOf(), 0x05); X = 0; Y = 0; Pressure = 0; diff --git a/VoiDPlugins.Library/VMulti/Device/RelativeInputReport.cs b/VoiDPlugins.Library/VMulti/Device/RelativeInputReport.cs index d3f1a31..42ae917 100644 --- a/VoiDPlugins.Library/VMulti/Device/RelativeInputReport.cs +++ b/VoiDPlugins.Library/VMulti/Device/RelativeInputReport.cs @@ -6,9 +6,9 @@ namespace VoiDPlugins.Library.VMulti.Device [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct RelativeInputReport { - public RelativeInputReport(byte reportID) + public RelativeInputReport() { - Header = new VMultiReportHeader(Unsafe.SizeOf(), reportID); + Header = new VMultiReportHeader(Unsafe.SizeOf(), 0x04); X = 0; Y = 0; WheelPos = 0; diff --git a/VoiDPlugins.Library/VMulti/VMultiInstance.cs b/VoiDPlugins.Library/VMulti/VMultiInstance.cs index 1fcb85b..38a2f00 100644 --- a/VoiDPlugins.Library/VMulti/VMultiInstance.cs +++ b/VoiDPlugins.Library/VMulti/VMultiInstance.cs @@ -19,7 +19,7 @@ namespace VoiDPlugins.Library.VMulti Buffer = GC.AllocateArray(size, true); Header = (VMultiReportHeader*)Unsafe.AsPointer(ref Buffer[0]); _device = Retrieve(name); - _data = GC.AllocateArray(32, true); + _data = new object[32]; } public void Write() @@ -29,7 +29,6 @@ namespace VoiDPlugins.Library.VMulti public void InitializeData(int i, T data) { - Check(); _data[i] = data!; } @@ -79,13 +78,6 @@ namespace VoiDPlugins.Library.VMulti return VMultiDev; } - - [Conditional("DEBUG")] - private void Check() - { - if (Unsafe.SizeOf() > IntPtr.Size) - throw new InvalidOperationException(); - } } public class VMultiInstance : VMultiInstance where T : unmanaged