// 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.
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;
    float32 radius_minor;
    // 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;
};

union InputEvent {
    PointerEvent pointer;
    KeyboardEvent keyboard;
    FocusEvent focus;
};
