// 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 {
  // Unique display identifier.
  optional int32 id = 8;

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

message SelectDesktopDisplayRequest {
  // Identifier for display to select. Valid strings are "0", "1", ...
  // The "all" string is used to select the entire desktop.
  optional string id = 1;
}

message DesktopDisplayInfo {
  // Unique display identifier.
  optional int32 id = 1;

  // Position of the top left corner of this display (in pixels).
  optional int32 x = 2;
  optional int32 y = 3;

  // Size of the display (in pixels).
  optional int32 width = 4;
  optional int32 height = 5;

  // DPI of the screen.
  optional int32 dpi = 6;

  // Bits per pixel.
  optional int32 bpp = 7;

  // True if this is the default display.
  optional bool is_default = 8;
}
