private void SetBindingHandlerSettings(InputDeviceTree dev, IOutputMode outputMode, BindingSettings settings) { string group = dev.Properties.Name; var bindingHandler = new BindingHandler(outputMode); var bindingServiceProvider = new ServiceManager(); object pointer = outputMode switch { AbsoluteOutputMode absoluteOutputMode => absoluteOutputMode.Pointer, RelativeOutputMode relativeOutputMode => relativeOutputMode.Pointer, _ => null }; if (pointer is IVirtualMouse virtualMouse) { bindingServiceProvider.AddService <IVirtualMouse>(() => virtualMouse); } var tipbinding = bindingHandler.TipBinding = settings.TipButton?.Construct <IBinding>(); bindingServiceProvider.Inject(tipbinding); bindingHandler.TipActivationPressure = settings.TipActivationPressure; Log.Write(group, $"Tip Binding: [{bindingHandler.TipBinding}]@{bindingHandler.TipActivationPressure}%"); var eraserBinding = bindingHandler.EraserBinding = settings.EraserButton?.Construct <IBinding>(); bindingServiceProvider.Inject(eraserBinding); bindingHandler.EraserActivationPressure = settings.EraserActivationPressure; Log.Write(group, $"Eraser Binding: [{bindingHandler.EraserBinding}]@{bindingHandler.EraserActivationPressure}%"); if (settings.PenButtons != null) { for (int index = 0; index < settings.PenButtons.Count; index++) { var bind = settings.PenButtons[index]?.Construct <IBinding>(); if (!bindingHandler.PenButtonBindings.TryAdd(index, bind)) { bindingHandler.PenButtonBindings[index] = bind; bindingServiceProvider.Inject(bind); } } Log.Write(group, $"Pen Bindings: " + string.Join(", ", bindingHandler.PenButtonBindings)); } if (settings.AuxButtons != null) { for (int index = 0; index < settings.AuxButtons.Count; index++) { var bind = settings.AuxButtons[index]?.Construct <IBinding>(); if (!bindingHandler.AuxButtonBindings.TryAdd(index, bind)) { bindingHandler.AuxButtonBindings[index] = bind; bindingServiceProvider.Inject(bind); } } Log.Write(group, $"Express Key Bindings: " + string.Join(", ", bindingHandler.AuxButtonBindings)); } }
private void SetRelativeModeSettings(InputDeviceTree dev, RelativeOutputMode relativeMode, RelativeModeSettings settings) { string group = dev.Properties.Name; relativeMode.Sensitivity = settings.Sensitivity; Log.Write(group, $"Relative Mode Sensitivity (X, Y): {relativeMode.Sensitivity}"); relativeMode.Rotation = settings.RelativeRotation; Log.Write(group, $"Relative Mode Rotation: {relativeMode.Rotation}"); relativeMode.ResetTime = settings.ResetTime; Log.Write(group, $"Reset time: {relativeMode.ResetTime}"); }
private void SetAbsoluteModeSettings(InputDeviceTree dev, AbsoluteOutputMode absoluteMode, AbsoluteModeSettings settings) { string group = dev.Properties.Name; absoluteMode.Output = settings.Display.Area; Log.Write(group, $"Display area: {absoluteMode.Output}"); absoluteMode.Input = settings.Tablet.Area; Log.Write(group, $"Tablet area: {absoluteMode.Input}"); absoluteMode.AreaClipping = settings.EnableClipping; Log.Write(group, $"Clipping: {(absoluteMode.AreaClipping ? "Enabled" : "Disabled")}"); absoluteMode.AreaLimiting = settings.EnableAreaLimiting; Log.Write(group, $"Ignoring reports outside area: {(absoluteMode.AreaLimiting ? "Enabled" : "Disabled")}"); }
private void updateInputArea([CanBeNull] InputDeviceTree inputDevice) { if (inputDevice == null) { return; } var digitizer = inputDevice.Properties.Specifications.Digitizer; float inputWidth = digitizer.Width; float inputHeight = digitizer.Height; AreaSize.Default = new Vector2(inputWidth, inputHeight); // if it's clear the user has not configured the area, take the full area from the tablet that was just found. if (AreaSize.Value == Vector2.Zero) { AreaSize.SetDefault(); } AreaOffset.Default = new Vector2(inputWidth / 2, inputHeight / 2); // likewise with the position, use the centre point if it has not been configured. // it's safe to assume no user would set their centre point to 0,0 for now. if (AreaOffset.Value == Vector2.Zero) { AreaOffset.SetDefault(); } tablet.Value = new TabletInfo(inputDevice.Properties.Name, AreaSize.Default); switch (inputDevice.OutputMode) { case AbsoluteOutputMode absoluteOutputMode: { // Set input area in millimeters absoluteOutputMode.Input = new Area { Width = AreaSize.Value.X, Height = AreaSize.Value.Y, Position = new System.Numerics.Vector2(AreaOffset.Value.X, AreaOffset.Value.Y), Rotation = Rotation.Value }; break; } } }
private void SetOutputModeSettings(InputDeviceTree dev, IOutputMode outputMode, Profile profile, TabletReference tabletReference) { string group = dev.Properties.Name; outputMode.Tablet = dev; var elements = from store in profile.Filters where store.Enable == true let filter = store.Construct <IPositionedPipelineElement <IDeviceReport> >(tabletReference) where filter != null select filter; outputMode.Elements = elements.ToList(); if (outputMode.Elements != null && outputMode.Elements.Count > 0) { Log.Write(group, $"Filters: {string.Join(", ", outputMode.Elements)}"); } }
private void SetOutputModeSettings(IServiceCollection serviceCollection, InputDeviceTree dev, IOutputMode outputMode, Profile profile) { var provider = serviceCollection.BuildServiceProvider(); string group = dev.Properties.Name; outputMode.Tablet = dev; var elements = from store in profile.Filters where store.Enable let filter = store.Construct <IPositionedPipelineElement <IDeviceReport> >(provider) where filter != null select filter; outputMode.Elements = elements.ToList(); if (outputMode.Elements != null && outputMode.Elements.Count() > 0) { Log.Write(group, $"Filters: {string.Join(", ", outputMode.Elements)}"); } }
public override bool Initialize(GameHost host) { outputMode = new AbsoluteTabletMode(this); host.Window.Resized += () => updateOutputArea(host.Window); AreaOffset.BindValueChanged(_ => updateInputArea(device)); AreaSize.BindValueChanged(_ => updateInputArea(device), true); Rotation.BindValueChanged(_ => updateInputArea(device), true); Enabled.BindValueChanged(d => { if (d.NewValue && tabletDriver == null) { tabletDriver = TabletDriver.Create(); tabletDriver.TabletsChanged += (s, e) => { device = e.Any() ? tabletDriver.InputDevices.First() : null; if (device != null) { device.OutputMode = outputMode; outputMode.Tablet = device.CreateReference(); updateInputArea(device); updateOutputArea(host.Window); } }; tabletDriver.DeviceReported += handleDeviceReported; tabletDriver.Detect(); } else if (!d.NewValue && tabletDriver != null) { tabletDriver.Dispose(); tabletDriver = null; } }, true); return(true); }
private void SetBindingHandlerSettings(InputDeviceTree dev, IOutputMode outputMode, BindingSettings settings, TabletReference tabletReference) { string group = dev.Properties.Name; var bindingHandler = new BindingHandler(outputMode); var bindingServiceProvider = new ServiceManager(); object?pointer = outputMode switch { AbsoluteOutputMode absoluteOutputMode => absoluteOutputMode.Pointer, RelativeOutputMode relativeOutputMode => relativeOutputMode.Pointer, _ => null }; if (pointer is IMouseButtonHandler mouseButtonHandler) { bindingServiceProvider.AddService(() => mouseButtonHandler); } var tip = bindingHandler.Tip = new ThresholdBindingState { Binding = settings.TipButton?.Construct <IBinding>(bindingServiceProvider, tabletReference), ActivationThreshold = settings.TipActivationThreshold }; if (tip.Binding != null) { Log.Write(group, $"Tip Binding: [{tip.Binding}]@{tip.ActivationThreshold}%"); } var eraser = bindingHandler.Eraser = new ThresholdBindingState { Binding = settings.EraserButton?.Construct <IBinding>(bindingServiceProvider, tabletReference), ActivationThreshold = settings.EraserActivationThreshold }; if (eraser.Binding != null) { Log.Write(group, $"Eraser Binding: [{eraser.Binding}]@{eraser.ActivationThreshold}%"); } if (settings.PenButtons != null && settings.PenButtons.Any(b => b?.Path != null)) { SetBindingHandlerCollectionSettings(bindingServiceProvider, settings.PenButtons, bindingHandler.PenButtons, tabletReference); Log.Write(group, $"Pen Bindings: " + string.Join(", ", bindingHandler.PenButtons.Select(b => b.Value?.Binding))); } if (settings.AuxButtons != null && settings.AuxButtons.Any(b => b?.Path != null)) { SetBindingHandlerCollectionSettings(bindingServiceProvider, settings.AuxButtons, bindingHandler.AuxButtons, tabletReference); Log.Write(group, $"Express Key Bindings: " + string.Join(", ", bindingHandler.AuxButtons.Select(b => b.Value?.Binding))); } if (settings.MouseButtons != null && settings.MouseButtons.Any(b => b?.Path != null)) { SetBindingHandlerCollectionSettings(bindingServiceProvider, settings.MouseButtons, bindingHandler.MouseButtons, tabletReference); Log.Write(group, $"Mouse Button Bindings: [" + string.Join("], [", bindingHandler.MouseButtons.Select(b => b.Value?.Binding)) + "]"); } var scrollUp = bindingHandler.MouseScrollUp = new BindingState { Binding = settings.MouseScrollUp?.Construct <IBinding>(bindingServiceProvider, tabletReference) }; var scrollDown = bindingHandler.MouseScrollDown = new BindingState { Binding = settings.MouseScrollDown?.Construct <IBinding>(bindingServiceProvider, tabletReference) }; if (scrollUp.Binding != null || scrollDown.Binding != null) { Log.Write(group, $"Mouse Scroll: Up: [{scrollUp?.Binding}] Down: [{scrollDown?.Binding}]"); } }