// Copyright 2014 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.input;

@available(deprecated=13)
type KeyboardEventPhase = flexible enum {
    /// When key is pressed down.
    PRESSED = 0;
    /// When key is released.
    RELEASED = 1;
    /// This key `PRESSED` is not directed to this input client anymore.
    CANCELLED = 2;
    /// Whether this is an automatically generated key repeat
    REPEAT = 3;
};

/// `KeyboardEvent` represents event generated by a user's interaction with a
/// keyboard.
///
/// Those events are triggered by distinct pressed state changes of the keys.
///
/// The state transitions should be as follows:
/// PRESSED -> (REPEAT ->) RELEASED
/// or
/// PRESSED -> (REPEAT ->) CANCELLED
///
/// The input system will repeat those events automatically when a code_point is
/// available.
///
/// DEPRECATED: Will be removed in favor of `fuchsia.ui.input.KeyEvent`.
@available(deprecated=13)
type KeyboardEvent = struct {
    /// Time the event was delivered. The time is in nanoseconds and corresponds
    /// to the monotonic time as determined by the zx_clock_get_monotonic syscall.
    event_time uint64;

    device_id uint32;

    phase KeyboardEventPhase;

    /// Keyboard HID Usage
    /// See https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf
    hid_usage uint32;

    /// The unicode code point represented by this key event, if any.
    /// Dead keys are represented as Unicode combining characters.
    ///
    /// If there is no unicode code point, this value is zero.
    code_point uint32;

    /// Key modifiers as defined by the different kModifier constants such as
    /// `kModifierCapsLock` currently pressed
    modifiers uint32;
};

@available(deprecated=10, note="Instead, use fuchsia.ui.pointer")
type PointerEventType = strict enum {
    /// A touch-based pointer device.
    TOUCH = 0;

    /// A pointer device with a stylus.
    STYLUS = 1;

    /// A pointer device with a stylus that has been inverted.
    INVERTED_STYLUS = 2;

    /// A pointer device without a stylus.
    MOUSE = 3;
};

@available(deprecated=10, note="Instead, use fuchsia.ui.pointer")
type PointerEventPhase = strict enum {
    /// The device has started tracking the pointer.
    ///
    /// For example, the pointer might be hovering above the device, having not yet
    /// made contact with the surface of the device.
    ADD = 0;

    /// The pointer has moved with respect to the device while not in contact with
    /// the device.
    HOVER = 1;

    /// The pointer has made contact with the device.
    ///
    /// For `MOUSE` devices, this is triggered when the primary button is pressed
    /// down to emulate a touch on the screen.
    DOWN = 2;

    /// The pointer has moved with respect to the device while in contact with the
    /// device.
    MOVE = 3;

    /// The pointer has stopped making contact with the device.
    ///
    /// For `MOUSE` devices, this is triggered when the primary button is
    /// released.
    UP = 4;

    /// The device is no longer tracking the pointer.
    ///
    /// For example, the pointer might have drifted out of the device's hover
    /// detection range or might have been disconnected from the system entirely.
    REMOVE = 5;

    /// The input from the pointer is no longer directed towards this receiver.
    CANCEL = 6;

    // TODO: add phases to indicate button press / release
};

/// Pointers represent raw data about the user's interaction with the screen.
///
/// The state transitions should be as follows:
/// ADD (-> HOVER) -> DOWN -> MOVE -> UP (-> HOVER) -> REMOVE
///
/// At any point after the initial ADD, a transition to CANCEL is also possible.
@available(deprecated=10, note="Instead, use fuchsia.ui.pointer")
type PointerEvent = struct {
    /// Time the event was delivered. The time is in nanoseconds and corresponds
    /// to the monotonic time as determined by the zx_clock_get_monotonic syscall.
    event_time uint64;

    device_id uint32;

    pointer_id uint32;

    type PointerEventType;

    phase PointerEventPhase;

    /// `x` and `y` are in the coordinate system of the View.
    x float32;
    y float32;

    // TODO(jpoichet) float32 vx;
    // TODO(jpoichet) float32 vy;
    @allow_deprecated_struct_defaults
    radius_major float32 = 0.0; // DO NOT USE
    @allow_deprecated_struct_defaults
    radius_minor float32 = 0.0; // DO NOT USE
    // TODO(jpoichet) float32 orientation;
    // TODO(jpoichet) float32 tilt;
    // TODO(jpoichet) float32 altitude;
    // TODO(jpichet) float32 amplitude;

    /// Currently pressed buttons as defined the kButton constants such as
    /// `kMousePrimaryButton`
    buttons uint32;
};

@available(deprecated=10, note="Instead, use fuchsia.ui.views.ViewRefFocused")
type FocusEvent = struct {
    /// Time the event was delivered. The time is in nanoseconds and corresponds
    /// to the monotonic time as determined by the zx_clock_get_monotonic syscall.
    event_time uint64;

    /// Whether the view has gained input focused or not.
    focused bool;
};

type MediaButtonsEvent = table {
    1: volume int8;
    2: mic_mute bool;
    3: pause bool;
    4: camera_disable bool;
    @available(added=15)
    5: power bool;
};

type InputEvent = strict union {
    @available(deprecated=10, note="Instead, use fuchsia.ui.pointer")
    1: pointer PointerEvent;
    @available(deprecated=13)
    2: keyboard KeyboardEvent;
    @available(deprecated=10, note="Instead, use fuchsia.ui.views.ViewRefFocused")
    3: focus FocusEvent;
};
