// 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 control messages.

syntax = "proto2";

option optimize_for = LITE_RUNTIME;

package remoting.protocol;

// Set the host resolution to match the client. If none of the fields are
// present, restore the host resolution instead.
message ClientResolution {
  // Width and height of the client in Density-Independent Pixels.
  optional int32 dips_width = 1;
  optional int32 dips_height = 2;

  // Deprecated width and height of the client in device pixels.
  optional int32 width_deprecated = 3;
  optional int32 height_deprecated = 4;

  // Horizontal and vertical DPI of the screen. If either of these is zero or
  // unset, the corresponding DPI should be assumed to be 96 (Windows' default)
  optional int32 x_dpi = 5;
  optional int32 y_dpi = 6;
}

message VideoControl {
  // Enables the video channel if true, pauses if false.
  optional bool enable = 1;

  // Controls whether lossless encode and color translation are requested.
  optional bool lossless_encode = 2;
  optional bool lossless_color = 3;
}

message AudioControl {
  // Enables the audio channel if true, pauses if false.
  optional bool enable = 1;
}

message CursorShapeInfo {
  // Width, height (in screen pixels) of the cursor.
  optional int32 width = 1;
  optional int32 height = 2;

  // X,Y coordinates (relative to upper-left corner) of the cursor hotspot.
  optional int32 hotspot_x = 3;
  optional int32 hotspot_y = 4;

  // Cursor pixmap data in 32-bit BGRA format.
  optional bytes data = 5;
}

message Capabilities {
  // List of capabilities supported by the sender (case sensitive, capabilities
  // are separated by spaces).
  optional string capabilities = 1;
}

message PairingRequest {
  // Human-readable name of the client.
  optional string client_name = 1;
}

message PairingResponse {
  // Unique identifier for this client.
  optional string client_id = 1;

  // Shared secret for this client.
  optional string shared_secret = 2;
}

message ExtensionMessage {
  // The message type. This is used to dispatch the message to the correct
  // recipient.
  optional string type = 1;

  // String-encoded message data. The client and host must agree on the encoding
  // for each message type; different message types need not shared the same
  // encoding.
  optional string data = 2;
}

message VideoTrackLayout {
  // Name of the video track.
  optional string track_name = 1;

  // Position of the top left corner of the rectangle covered by the video
  // track in DIPs (device independent pixels).
  optional int32 position_x = 2;
  optional int32 position_y = 3;

  // Size of the area covered by the video track in DIPs.
  optional int32 width = 4;
  optional int32 height = 5;

  // DPI of the screen.
  optional int32 x_dpi = 6;
  optional int32 y_dpi = 7;
}

message VideoLayout {
  // Layout for each video track.
  repeated VideoTrackLayout video_track = 1;
}
