/// <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); }