// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

[DartPackage="mojo_services"]
module mojo;

import "geometry/public/interfaces/geometry.mojom";
import "input_events/public/interfaces/input_event_constants.mojom";
import "input_events/public/interfaces/input_key_codes.mojom";

struct KeyData {
  // The chromium event key code; these values are from the ui/ KeyCode enum,
  // which has the fun property of being neither consistently the Windows key
  // code, nor the X11 keycodes. (This value is consistent across platforms
  // for basic ASCII characters; it will differ for modifiers. We don't define
  // this as a mojo enum because mojom doesn't appear to have a platform
  // dependent preprocessor yet.)
  //
  // TODO(erg): Remove this, and declare Win32 keycodes correct by fiat. We can
  // not do this until we remove ui::Event usage from within mojo.
  int32 key_code;

  // Whether this is a character event, and the character value if it is. Note
  // that this is different than |text|, which holds a value even when there
  // isn't actually a character to insert. (For example, |text| will be set and
  // have a value on backspace, and |character| won't.)
  bool is_char;
  uint16 character;

  // The Win32 key code. Because of the web, this is the closest thing that we
  // have to a cross platform key state.
  KeyboardCode windows_key_code;

  // The platform specific key code.
  //
  // TODO(erg): This exists only for NPAPI support, pepper USB keyboard support
  // and IME on android support. Theoretically, we should be able to remove this
  // in the medium to long term.
  int32 native_key_code;

  // The text generated by this keystroke. Corresponds to
  // blink::WebKeyboardEvent::text.
  uint16 text;

  // Like |text|, but unmodified by concurrently held modifier keys (except
  // shift). Corresponds to blink::WebKeyboardEvent::unmodifiedText.
  uint16 unmodified_text;
};

struct PointerData {
  int32 pointer_id;
  PointerKind kind;
  // |x| and |y| are in the coordinate system of the View.
  float x;
  float y;
  // |screen_x| and |screen_y| are in screen coordinates.
  float screen_x;
  float screen_y;
  float pressure;
  float radius_major;
  float radius_minor;
  float orientation;
  // Used for devices that support wheels. Ranges from -1 to 1.
  float horizontal_wheel;
  float vertical_wheel;
};

struct Event {
  // TODO(sky): rename to type.
  EventType action;
  // TODO(sky): parts of this should move to PointerData.
  EventFlags flags;
  // Time the event was delivered. The time is in milliseconds and corresponds
  // to the uptime of the machine.
  int64 time_stamp;
  KeyData? key_data;
  PointerData? pointer_data;
};
