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")}");
        }
Beispiel #4
0
        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)}");
            }
        }
Beispiel #6
0
        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)}");
            }
        }
Beispiel #7
0
        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}]");
            }
        }