From 148e5425280784426e0e4631622c9c2bc7c8518a Mon Sep 17 00:00:00 2001 From: X9VoiD Date: Thu, 6 Jan 2022 07:35:21 +0800 Subject: [PATCH] Box unmanaged data --- .../WindowsInk/Pointer/WinInkBasePointer.cs | 11 ++++++----- OutputMode/WindowsInk/WinInkButtonHandler.cs | 19 ++++++++++--------- OutputMode/WindowsInk/WindowsInk.csproj | 1 + VoiDPlugins.Library/VMulti/VMultiInstance.cs | 2 +- VoiDPlugins.Library/VoiD/Boxed.cs | 12 ++++++++++++ 5 files changed, 30 insertions(+), 15 deletions(-) create mode 100644 VoiDPlugins.Library/VoiD/Boxed.cs diff --git a/OutputMode/WindowsInk/Pointer/WinInkBasePointer.cs b/OutputMode/WindowsInk/Pointer/WinInkBasePointer.cs index 0be8a6b..d873626 100644 --- a/OutputMode/WindowsInk/Pointer/WinInkBasePointer.cs +++ b/OutputMode/WindowsInk/Pointer/WinInkBasePointer.cs @@ -1,6 +1,7 @@ using System.Numerics; using OpenTabletDriver.Plugin.Platform.Pointer; using OpenTabletDriver.Plugin.Tablet; +using VoiDPlugins.Library; using VoiDPlugins.Library.VMulti; using VoiDPlugins.Library.VMulti.Device; using static VoiDPlugins.OutputMode.WindowsInkConstants; @@ -16,14 +17,14 @@ namespace VoiDPlugins.OutputMode { Instance = VMultiInstanceManager.RetrieveVMultiInstance("WindowsInk", tabletReference, () => new DigitizerInputReport()); Instance.InitializeData(POINTER, this); - Instance.InitializeData(ERASER_STATE, false); - Instance.InitializeData(MANUAL_ERASER, false); + Instance.InitializeData(ERASER_STATE, new Boxed(false)); + Instance.InitializeData(MANUAL_ERASER, new Boxed(false)); RawPointer = Instance.Pointer; } public void SetEraser(bool isEraser) { - if (!Instance!.GetData(MANUAL_ERASER)) + if (!Instance!.GetData>(MANUAL_ERASER).Value) { WinInkButtonHandler.EraserStateTransition(Instance, ref GetEraser(), isEraser); } @@ -49,9 +50,9 @@ namespace VoiDPlugins.OutputMode Instance!.Write(); } - private ref bool GetEraser() + private ref Boxed GetEraser() { - return ref Instance!.GetData(ERASER_STATE); + return ref Instance!.GetData>(ERASER_STATE); } } } \ No newline at end of file diff --git a/OutputMode/WindowsInk/WinInkButtonHandler.cs b/OutputMode/WindowsInk/WinInkButtonHandler.cs index c4f2601..3e1ccd3 100644 --- a/OutputMode/WindowsInk/WinInkButtonHandler.cs +++ b/OutputMode/WindowsInk/WinInkButtonHandler.cs @@ -2,6 +2,7 @@ using System; using OpenTabletDriver.Plugin; using OpenTabletDriver.Plugin.Attributes; using OpenTabletDriver.Plugin.Tablet; +using VoiDPlugins.Library; using VoiDPlugins.Library.VMulti; using VoiDPlugins.Library.VMulti.Device; using static VoiDPlugins.OutputMode.WindowsInkConstants; @@ -50,7 +51,7 @@ namespace VoiDPlugins.OutputMode switch (Button) { case "Pen Tip": - _instance!.EnableButtonBit((int)(eraserState ? ButtonBits.Eraser : ButtonBits.Press)); + _instance!.EnableButtonBit((int)(eraserState.Value ? ButtonBits.Eraser : ButtonBits.Press)); break; case "Pen Button": @@ -59,7 +60,7 @@ namespace VoiDPlugins.OutputMode case "Eraser (Toggle)": IsManuallySet = true; - EraserStateTransition(_instance!, ref eraserState, !eraserState); + EraserStateTransition(_instance!, ref eraserState, !eraserState.Value); break; case "Eraser (Hold)": @@ -87,11 +88,11 @@ namespace VoiDPlugins.OutputMode } } - public static void EraserStateTransition(VMultiInstance instance, ref bool eraserState, bool isEraser) + public static void EraserStateTransition(VMultiInstance instance, ref Boxed eraserState, bool isEraser) { - if (eraserState != isEraser) + if (eraserState.Value != isEraser) { - eraserState = isEraser; + eraserState.Value = isEraser; var report = (DigitizerInputReport*)instance.Header; var buttons = report->Header.Buttons; var pressure = report->Pressure; @@ -107,21 +108,21 @@ namespace VoiDPlugins.OutputMode // Send In-Range but no tips instance.EnableButtonBit((int)ButtonBits.InRange); - if (eraserState) + if (eraserState.Value) instance.EnableButtonBit((int)ButtonBits.Invert); instance.Write(); // Set Proper Report if (VMultiInstance.HasBit(buttons, (int)(ButtonBits.Press | ButtonBits.Eraser))) - instance.EnableButtonBit((int)(eraserState ? ButtonBits.Eraser : ButtonBits.Press)); + instance.EnableButtonBit((int)(eraserState.Value ? ButtonBits.Eraser : ButtonBits.Press)); report->Pressure = pressure; } } - private ref bool GetEraser() + private ref Boxed GetEraser() { - return ref _instance!.GetData(ERASER_STATE); + return ref _instance!.GetData>(ERASER_STATE); } } } \ No newline at end of file diff --git a/OutputMode/WindowsInk/WindowsInk.csproj b/OutputMode/WindowsInk/WindowsInk.csproj index 05d1625..18a6654 100644 --- a/OutputMode/WindowsInk/WindowsInk.csproj +++ b/OutputMode/WindowsInk/WindowsInk.csproj @@ -1,5 +1,6 @@  true + true diff --git a/VoiDPlugins.Library/VMulti/VMultiInstance.cs b/VoiDPlugins.Library/VMulti/VMultiInstance.cs index a13042c..1fcb85b 100644 --- a/VoiDPlugins.Library/VMulti/VMultiInstance.cs +++ b/VoiDPlugins.Library/VMulti/VMultiInstance.cs @@ -33,7 +33,7 @@ namespace VoiDPlugins.Library.VMulti _data[i] = data!; } - public unsafe ref T GetData(int i) + public unsafe ref T GetData(int i) where T : class { return ref Unsafe.AsRef(Unsafe.AsPointer(ref _data[i])); } diff --git a/VoiDPlugins.Library/VoiD/Boxed.cs b/VoiDPlugins.Library/VoiD/Boxed.cs new file mode 100644 index 0000000..d9d893a --- /dev/null +++ b/VoiDPlugins.Library/VoiD/Boxed.cs @@ -0,0 +1,12 @@ +namespace VoiDPlugins.Library +{ + public class Boxed where T : unmanaged + { + public Boxed(T value) + { + Value = value; + } + + public T Value { get; set; } + } +} \ No newline at end of file