// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.ui.pointer;

///
/// Aliases
///

/// A floating-point two-dimensional point.
/// - The values are placed in (x, y) order.
using Point2 = array<float32>:2;

/// A floating-point two-dimensional vector.
/// - The values are placed in (x, y) order.
using Vec2 = array<float32>:2;

///
/// DeviceInfo
///

/// A characterization of a device that issues pointer event streams.
/// A device may track multiple pointers, and a pointer's continuous engagement
/// is modeled as a pointer event stream: a discrete stream of samples that
/// follow a simple state machine, modeled with |EventPhase|.
enum DeviceType {
    /// A device intended for manipulation by direct contact over its surface.
    TOUCH = 1;
};

/// Information about a device that issues pointer event streams.
///
/// All fields are required.
table DeviceInfo {
    /// An identifier for the pointer device that issues pointer event streams.
    /// A device may own multiple pointers, each with its own pointer id.
    1: uint32 id;

    /// A characterization of a device that issues pointer event streams.
    2: DeviceType type;
};

///
/// PointerSample
///

/// The possible states of a pointer event stream's state machine.
/// An event stream follows these state machines:
/// ADD - CHANGE* - REMOVE
/// ADD - CHANGE* - CANCEL
enum EventPhase {
    /// The device has started tracking the pointer.
    ADD = 1;

    /// The device has reported an update to the pointer state.
    CHANGE = 2;

    /// The device has stopped tracking the pointer.
    REMOVE = 3;

    /// The event stream is no longer available.
    CANCEL = 4;
};

/// A description of each sampled data point in a pointer event stream.
/// All fields are required.
table PointerSample {
    /// An identifier for the pointer device that issues pointer event streams.
    /// A device may own multiple pointers, each with its own |pointer_id|.
    1: uint32 device_id;

    /// An identifier of the pointer that issued this event. It is unique only
    /// to a specific |device_id|. Each (device_id, pointer_id) pointer issues
    /// at most one pointer event stream at a time.
    2: uint32 pointer_id;

    /// The state of this event in the pointer event stream's state machine.
    3: EventPhase phase;

    /// The position of this event, in the viewport's coordinate system.
    4: Point2 position_in_viewport;
};

///
/// EventStreamOwnership
///

/// The pointer event stream's disposition, sent from server to client.
enum EventStreamOwnershipStatus {
    /// The client has been denied ownership of the event stream.
    DENIED = 1;

    /// The client has been granted ownership of the event stream.
    GRANTED = 2;
};

/// The ownership status of a pointer event stream, sent from server to client.
///
/// All fields are required.
table EventStreamOwnership {
    /// An identifier for the pointer device that issues pointer event streams.
    /// A device may own multiple pointers, each with its own |pointer_id|.
    1: uint32 device_id;

    /// An identifier of the pointer that issues a pointer event stream. It is
    /// unique only to a specific |device_id|. Each (device_id, pointer_id)
    /// pointer issues at most one pointer event stream at a time.
    2: uint32 pointer_id;

    /// The pointer event stream's disposition, sent from server to client.
    3: EventStreamOwnershipStatus status;
};

///
/// Event
///

/// A selection of FIFO data sent over the channel.
/// Each data may have a different issuance policy.
flexible union Data {
    /// The parameters of the associated view and viewport, sufficient to
    /// correctly interpret the position, orientation, magnitude, and
    /// inter-event distance of pointer events dispatched to a view.
    /// - It is issued on connection and on change.
    1: ViewParameters view_parameters;

    /// A description of the pointer device, sufficient to correctly interpret
    /// the capabilities and usage intent of the device.
    /// - It is issued once per device.
    2: DeviceInfo device_info;

    /// A description of each sampled data point in a pointer event stream.
    /// - It is issued on every sample in the pointer event stream.
    3: PointerSample pointer_sample;

    /// The result of gesture disambiguation for a pointer event stream.
    /// - It is issued once per pointer event stream.
    4: EventStreamOwnership event_stream_ownership;
};

/// The self-sufficient, self-consistent collection of pointer-related data,
/// sent from server to client.
table Event {
    /// The time this event was observed.
    ///
    /// Required.
    1: zx.time timestamp;

    /// The event's data.
    ///
    /// Required.
    2: Data data;

    /// An identifier to correlate this event's send/receive occurrence across
    /// component boundaries or abstraction layers.
    3: uint64 trace_flow_id;
};

///
/// Response
///

/// The possible event stream dispositions that a client can respond with to a
/// given |PointerSample|. Used as part of a gesture disambiguation scheme.
///
/// The responses revolve around the idea of an ownership claim on a pointer event
/// stream (i.e., current and future events of that event stream). Clients may
/// assert a claim of ownership on the current event stream, but only one
/// client's claim is granted by the server; other clients' claims are denied.
enum ResponseType {
    /// The client declines ownership of the event stream.
    NO = 1;

    /// The client has not yet claimed ownership of the event stream.
    MAYBE = 2;

    /// The client needs to see a subsequent event stream to decide its claim on
    /// the current event stream.
    HOLD = 3;

    /// The client claims ownership the event stream.
    YES = 4;
};

/// A feedback event per |Event|, sent from client to server.
///
/// Only |PointerSample| requires a |ResponseType|; for other events, an empty
/// |Response| table is sent to the server.
table Response {
    /// The event stream disposition that a client responds with for a given
    /// |PointerSample|.
    1: ResponseType response_type;

    /// An identifier to correlate this response's send/receive occurrence across
    /// component boundaries or abstraction layers.
    2: uint64 trace_flow_id;
};
