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

/// The possible states of a pointer event. These phases of events in a stream
/// follow a state machine that starts with the `ADD` phase, followed by zero or
/// more `CHANGE` phases, and finally terminates with `REMOVE` or `CANCEL`
/// phase.
/// ```
/// ADD ---> CHANGE* -+-> REMOVE
///                   |
///                   +-> CANCEL
/// ```
///
/// A finite sequence of pointer events that follows this state machine,
/// starting from the initial state, is called an **interaction**. A closed (or
/// past) interaction is one where it has reached the terminal state; an open
/// (or current) interaction is one where it has not.
///
/// For a given device pointer, a stream of events is observed as a succession
/// of zero or more closed interactions (the past history of user engagement),
/// followed by at most one open interaction (the current user engagement).
///
/// When we need to group pointer events by their interaction, an event carries
/// an **interaction id** that is unique in that pointer stream. This common
/// reference makes it possible to operate on a closed interaction, as well as
/// an open interaction.
///
/// For example, touch events are typically observed as a succession of
/// interactions, as fingers engage and disengage with the display.
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 pointer is no longer available.
    CANCEL = 4;
};
