// 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.pointerinjector;

using fuchsia.input.report;
using zx;

/// The possible states of a pointer event stream's state machine.
///
/// A typical pointer will move through this state machine:
/// ADD - CHANGE* - REMOVE
type EventPhase = strict enum {
    /// 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;
};

/// The relative motion performed by a mouse device.
/// - The valid range is defined in [`Config.RelativeMotionRange`].
/// - The values are placed in (x, y) order.
alias RelativeMotion = array<float32, 2>;

/// A description of each sampled data point for a pointer device.
type PointerSample = table {
    /// An identifier of the pointer that issued this event.
    /// It is unique only to a specific pointer device.
    1: pointer_id uint32;

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

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

    /// The movement of a mouse, independent of the viewport's coordinate
    /// system.
    7: relative_motion RelativeMotion;

    /// Relative vertical scrolling displacement by detent.
    4: scroll_v int64;

    /// Relative horizontal scrolling displacement by detent.
    5: scroll_h int64;

    /// Recommended vertical scrolling displacement by physical pixel, it is
    /// computed with accelerator, detent / mm to pixel ratio, etc.
    8: scroll_v_physical_pixel float64;

    /// Recommended horizontal scrolling displacement by physical pixel, it
    /// is computed with accelerator, detent / mm to pixel ratio, etc.
    9: scroll_h_physical_pixel float64;

    /// Indicated if the scroll event is from a precision scroll device (HI_RES
    /// mouse or touchpad). Clients may want to play interpolation animations
    /// on non precision scroll device for smooth scrolling.
    10: is_precision_scroll bool;

    /// Identifiers of currently pressed buttons.
    6: pressed_buttons vector<uint8>:fuchsia.input.report.MOUSE_MAX_NUM_BUTTONS;
};

/// A selection of FIFO data sent over the channel.
/// Each data may have a different issuance policy.
type Data = flexible union {
    /// The parameters of the viewport, sufficient for a client to correctly
    /// interpret the position and scale of pointer events dispatched to it.
    /// - It is issued on every change to the viewport.
    1: viewport Viewport;

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

// A per-device collection of pointer-related data, sent from server to client.
type Event = table {
    /// The time when this event was observed.
    ///
    /// Required.
    1: timestamp zx.Time;

    /// 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: trace_flow_id uint64;
};
