示例#1
0
        /// <summary>
        /// Checks an Input Event for any significant changes that would be considered user activity.
        /// </summary>
        /// <param name="inputEvent">The input event being checked for changes</param>
        /// <param name="device">The input device being checked against </param>
        /// <param name="offset">The offset into the device that the event is placed</param>
        /// <param name="sizeInBytes">The size of the event in bytes</param>
        /// <returns>True if any changes exist in the event once the device has been filtered through for noise and non-significant changes.  False otherwise.</returns>
        public unsafe bool EventHasValidData(InputDevice device, InputEventPtr inputEvent, uint offset, uint sizeInBytes)
        {
            if (!inputEvent.valid)
            {
                throw new ArgumentException("Invalid or unset event being checked.", "inputEvent");
            }

            if (device == null)
            {
                throw new ArgumentNullException("device");
            }

            if (IsEmpty())
            {
                return(true);
            }

            if ((offset + sizeInBytes) * 8 > device.stateBlock.sizeInBits)
            {
                return(false);
            }

            var noiseFilterPtr = InputStateBuffers.s_NoiseBitmaskBuffer;

            if (noiseFilterPtr == IntPtr.Zero)
            {
                throw new Exception("Noise Filter Buffer is uninitialized while trying to check state events for data.");
            }

            var ptrToEventState = IntPtr.Zero;

            if (inputEvent.IsA <StateEvent>())
            {
                var stateEvent = StateEvent.From(inputEvent);
                ptrToEventState = stateEvent->state;
            }
            else if (inputEvent.IsA <DeltaStateEvent>())
            {
                var stateEvent = DeltaStateEvent.From(inputEvent);
                ptrToEventState = stateEvent->deltaState;
            }
            else
            {
                throw new ArgumentException(string.Format(
                                                "Invalid event type '{0}', we can only check for valid data on StateEvents and DeltaStateEvents.",
                                                inputEvent.type),
                                            "inputEvent");
            }

            if (MemoryHelpers.HasAnyNonZeroBitsAfterMaskingWithBuffer(ptrToEventState, noiseFilterPtr, offset, sizeInBytes * 8))
            {
                return(true);
            }

            for (var i = 0; i < elements.Length; i++)
            {
                if (elements[i].EventHasValidData(inputEvent, device))
                {
                    return(true);
                }
            }

            return(false);
        }