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

enum KeyboardEventPhase {
    // 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|.
struct KeyboardEvent {
    // Time the event was delivered. The time is in nanoseconds and corresponds
    // to the uptime of the machine.
    uint64 event_time;

    uint32 device_id;

    KeyboardEventPhase phase;

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

    // 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.
    uint32 code_point;

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

enum PointerEventType {
    // 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;
};

enum PointerEventPhase {
    // 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.
struct PointerEvent {
    // Time the event was delivered. The time is in nanoseconds and corresponds
    // to the uptime of the machine.
    uint64 event_time;

    uint32 device_id;

    uint32 pointer_id;

    PointerEventType type;

    PointerEventPhase phase;

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

    // TODO(jpoichet) float32 vx;
    // TODO(jpoichet) float32 vy;

    float32 radius_major = 0.0; // DO NOT USE
    float32 radius_minor = 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|
    uint32 buttons;
};

struct FocusEvent {
    // Time the event was delivered. The time is in nanoseconds and corresponds
    // to the uptime of the machine.
    uint64 event_time;

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

table MediaButtonsEvent {
    1: int8 volume;
    2: bool mic_mute;
};

// This union does not include MediaButtonsEvent because it's processed differently.
union InputEvent {
    PointerEvent pointer;
    KeyboardEvent keyboard;
    FocusEvent focus;
};
