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