| using System; |
| using UnityEngine.InputSystem.Utilities; |
|
|
| |
|
|
| namespace UnityEngine.InputSystem.LowLevel |
| { |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public unsafe struct InputEventPtr : IEquatable<InputEventPtr> |
| { |
| |
| |
| |
| |
| private readonly InputEvent* m_EventPtr; |
|
|
| |
| |
| |
| |
| public InputEventPtr(InputEvent* eventPtr) |
| { |
| m_EventPtr = eventPtr; |
| } |
|
|
| |
| |
| |
| |
| public bool valid => m_EventPtr != null; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public bool handled |
| { |
| get |
| { |
| if (!valid) |
| return false; |
| return m_EventPtr->handled; |
| } |
| set |
| { |
| if (!valid) |
| throw new InvalidOperationException("The InputEventPtr is not valid."); |
| m_EventPtr->handled = value; |
| } |
| } |
|
|
| public int id |
| { |
| get |
| { |
| if (!valid) |
| return 0; |
| return m_EventPtr->eventId; |
| } |
| set |
| { |
| if (!valid) |
| throw new InvalidOperationException("The InputEventPtr is not valid."); |
| m_EventPtr->eventId = value; |
| } |
| } |
|
|
| public FourCC type |
| { |
| get |
| { |
| if (!valid) |
| return new FourCC(); |
| return m_EventPtr->type; |
| } |
| } |
|
|
| public uint sizeInBytes |
| { |
| get |
| { |
| if (!valid) |
| return 0; |
| return m_EventPtr->sizeInBytes; |
| } |
| } |
|
|
| public int deviceId |
| { |
| get |
| { |
| if (!valid) |
| return InputDevice.InvalidDeviceId; |
| return m_EventPtr->deviceId; |
| } |
| set |
| { |
| if (!valid) |
| throw new InvalidOperationException("The InputEventPtr is not valid."); |
| m_EventPtr->deviceId = value; |
| } |
| } |
|
|
| public double time |
| { |
| get => valid ? m_EventPtr->time : 0.0; |
| set |
| { |
| if (!valid) |
| throw new InvalidOperationException("The InputEventPtr is not valid."); |
| m_EventPtr->time = value; |
| } |
| } |
|
|
| internal double internalTime |
| { |
| get => valid ? m_EventPtr->internalTime : 0.0; |
| set |
| { |
| if (!valid) |
| throw new InvalidOperationException("The InputEventPtr is not valid."); |
| m_EventPtr->internalTime = value; |
| } |
| } |
|
|
| public InputEvent* data => m_EventPtr; |
|
|
| |
| |
|
|
| internal FourCC stateFormat |
| { |
| get |
| { |
| var eventType = type; |
| if (eventType == StateEvent.Type) |
| return StateEvent.FromUnchecked(this)->stateFormat; |
| if (eventType == DeltaStateEvent.Type) |
| return DeltaStateEvent.FromUnchecked(this)->stateFormat; |
| throw new InvalidOperationException("Event must be a StateEvent or DeltaStateEvent but is " + this); |
| } |
| } |
|
|
| internal uint stateSizeInBytes |
| { |
| get |
| { |
| if (IsA<StateEvent>()) |
| return StateEvent.From(this)->stateSizeInBytes; |
| if (IsA<DeltaStateEvent>()) |
| return DeltaStateEvent.From(this)->deltaStateSizeInBytes; |
| throw new InvalidOperationException("Event must be a StateEvent or DeltaStateEvent but is " + this); |
| } |
| } |
|
|
| internal uint stateOffset |
| { |
| get |
| { |
| if (IsA<DeltaStateEvent>()) |
| return DeltaStateEvent.From(this)->stateOffset; |
| throw new InvalidOperationException("Event must be a DeltaStateEvent but is " + this); |
| } |
| } |
|
|
| public bool IsA<TOtherEvent>() |
| where TOtherEvent : struct, IInputEventTypeInfo |
| { |
| if (m_EventPtr == null) |
| return false; |
|
|
| |
| |
| TOtherEvent otherEvent = default; |
| return m_EventPtr->type == otherEvent.typeStatic; |
| } |
|
|
| |
| public InputEventPtr Next() |
| { |
| if (!valid) |
| return new InputEventPtr(); |
|
|
| return new InputEventPtr(InputEvent.GetNextInMemory(m_EventPtr)); |
| } |
|
|
| public override string ToString() |
| { |
| if (!valid) |
| return "null"; |
|
|
| |
| |
| |
| var eventPtr = *m_EventPtr; |
| return eventPtr.ToString(); |
| } |
|
|
| |
| |
| |
| |
| public InputEvent* ToPointer() |
| { |
| return this; |
| } |
|
|
| public bool Equals(InputEventPtr other) |
| { |
| return m_EventPtr == other.m_EventPtr || InputEvent.Equals(m_EventPtr, other.m_EventPtr); |
| } |
|
|
| public override bool Equals(object obj) |
| { |
| if (ReferenceEquals(null, obj)) |
| return false; |
| return obj is InputEventPtr ptr && Equals(ptr); |
| } |
|
|
| public override int GetHashCode() |
| { |
| return unchecked((int)(long)m_EventPtr); |
| } |
|
|
| public static bool operator==(InputEventPtr left, InputEventPtr right) |
| { |
| return left.m_EventPtr == right.m_EventPtr; |
| } |
|
|
| public static bool operator!=(InputEventPtr left, InputEventPtr right) |
| { |
| return left.m_EventPtr != right.m_EventPtr; |
| } |
|
|
| public static implicit operator InputEventPtr(InputEvent* eventPtr) |
| { |
| return new InputEventPtr(eventPtr); |
| } |
|
|
| public static InputEventPtr From(InputEvent* eventPtr) |
| { |
| return new InputEventPtr(eventPtr); |
| } |
|
|
| public static implicit operator InputEvent*(InputEventPtr eventPtr) |
| { |
| return eventPtr.data; |
| } |
|
|
| |
| public static InputEvent* FromInputEventPtr(InputEventPtr eventPtr) |
| { |
| return eventPtr.data; |
| } |
| } |
| } |
|
|