// Copyright (c) 2012 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.

// Protocol for event messages.

syntax = "proto2";

option optimize_for = LITE_RUNTIME;

package remoting.protocol;

// Defines a keyboard event.
message KeyEvent {

  // The keyboard (Caps/Num) lock states.
  enum LockStates {
    LOCK_STATES_CAPSLOCK = 1;
    LOCK_STATES_NUMLOCK = 2;
  }

  // True for key press events, and false for key release.
  optional bool pressed = 2;

  // The USB key code.
  // The upper 16-bits are the USB Page (0x07 for key events).
  // The lower 16-bits are the USB Usage ID (which identifies the actual key).
  optional uint32 usb_keycode = 3;

  // Legacy keyboard lock states. Prefer the discrete entries below.
  optional uint32 lock_states = 4 [default = 0];

  // Keyboard lock states. The field should be specified only if the state can
  // be reliably determined by the client. E.g., OS X does not have num lock, so
  // only caps_lock should be provided by a client running on OS X.
  optional bool caps_lock_state = 5;
  optional bool num_lock_state = 6;
}

// Text input event for input method different from physical keyboards,
// including software keyboard, gesture typing, voice input, etc.
message TextEvent {
  // Unicode sequence for the event in UTF-8.
  optional string text = 1;
}

// Defines a mouse event message on the event channel.
message MouseEvent {

  enum MouseButton {
    BUTTON_UNDEFINED = 0;
    BUTTON_LEFT = 1;
    BUTTON_MIDDLE = 2;
    BUTTON_RIGHT = 3;
    BUTTON_BACK = 4;
    BUTTON_FORWARD = 5;
    BUTTON_MAX = 6;
  }

  // Mouse absolute position information. When using WebRTC-based protocol the
  // coordinates are in DIPs. Otherwise they are in host's physical pixels. In
  // both coordinates systems, the top-left monitor on the system always starts
  // from (0, 0).
  optional int32 x = 1;
  optional int32 y = 2;

  // Mouse button event.
  optional MouseButton button = 5;
  optional bool button_down = 6;

  // Mouse wheel information.
  // These values encode the number of pixels and 'ticks' of movement that
  // would result from the wheel event on the client system.
  optional float wheel_delta_x = 7;
  optional float wheel_delta_y = 8;
  optional float wheel_ticks_x = 9;
  optional float wheel_ticks_y = 10;

  // Mouse movement information. Provided only when mouse lock is engaged.
  optional int32 delta_x = 11;
  optional int32 delta_y = 12;
}

// Defines an event that sends clipboard data between peers.
message ClipboardEvent {

  // The MIME type of the data being sent.
  optional string mime_type = 1;

  // The data being sent.
  optional bytes data = 2;
}

message TouchEventPoint {
  // The ID for the touch point.
  optional uint32 id = 1;

  // The absolute position of the touch point. These values on-the-wire are host
  // physical pixel coordinates: the top-left monitor on the system always
  // starts from (0, 0).
  optional float x = 2;
  optional float y = 3;

  // The size of the touch point, used to aid hit-testing.
  // Scaled to match the size on host.
  optional float radius_x = 4;
  optional float radius_y = 5;

  // Angle in degrees from the y-axis of the touch point.
  optional float angle = 6;

  // The pressure of the touch point.
  // The value should be in [0.0, 1.0].
  optional float pressure = 7;
}

message TouchEvent {
  // A START event means that this event reports all the touch points that were
  // just added, e.g. a finger started touching the display.
  // A MOVE event means that the touch points that have been STARTed moved,
  // e.g. multiple fingers on the screen moved.
  // An END event means that the touch points that have been STARTed ended.
  // e.g. a finger went off the screen.
  // A CANCEL event means that the touch points that have been STARTed were
  // canceled, e.g. a finger went off the screen.
  // Cancel event is simlar to END but slighly different. For example, Android
  // MotionEvent's ACTION_CANCEL documentation mentions that a cancel should be
  // treated as an ACTION_UP (END) event but might not perform the exact same
  // actions as a normal ACTION_UP event.
  enum TouchEventType {
    TOUCH_POINT_START = 1;
    TOUCH_POINT_MOVE = 2;
    TOUCH_POINT_END = 3;
    TOUCH_POINT_CANCEL = 4;
  };

  optional TouchEventType event_type = 1;

  // Only the changed touch points are added to this field.
  // Given the existing touch point APIs (e.g. Android and PPAPI)
  // for START, END, and CANCEL events the size of this field will typically be
  // 1, but for MOVE events it is likely to have multiple points.
  repeated TouchEventPoint touch_points = 2;
}
