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

  // The keyboard lock states.
  optional uint32 lock_states = 4 [default = 0];
}

// 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_MAX = 4;
  }

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