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

#ifndef REMOTING_HOST_DESKTOP_RESIZER_H_
#define REMOTING_HOST_DESKTOP_RESIZER_H_

#include <list>
#include <memory>

#include "remoting/host/base/screen_resolution.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/webrtc/modules/desktop_capture/desktop_capture_types.h"

namespace remoting {

// Interface for resizing the desktop displays. These methods take an optional
// |screen_id| parameter to resize an individual monitor. If |screen_id| refers
// to a monitor that no longer exists, the implementation should do nothing, or
// return empty data. If |screen_id| is not provided, the implementation should
// operate on the single monitor if there is only one. If there are several
// monitors, the implementation should fall back to the legacy (per-platform)
// behavior.
class DesktopResizer {
 public:
  virtual ~DesktopResizer() {}

  // Create a platform-specific DesktopResizer instance.
  static std::unique_ptr<DesktopResizer> Create();

  // Return the current resolution of the monitor.
  virtual ScreenResolution GetCurrentResolution(
      absl::optional<webrtc::ScreenId> screen_id) = 0;

  // Get the list of supported resolutions for the monitor, which should ideally
  // include |preferred|. Implementations will generally do one of the
  // following:
  //   1. Return the list of resolutions supported by the underlying video
  //      driver, regardless of |preferred|.
  //   2. Return a list containing just |preferred|, perhaps after imposing
  //      some minimum size constraint. This will typically be the case if
  //      there are no constraints imposed by the underlying video driver.
  //   3. Return an empty list if resize is not supported.
  virtual std::list<ScreenResolution> GetSupportedResolutions(
      const ScreenResolution& preferred,
      absl::optional<webrtc::ScreenId> screen_id) = 0;

  // Set the resolution of the monitor. |resolution| must be one of the
  // resolutions previously returned by |GetSupportedResolutions|. Note that
  // implementations should fail gracefully if the specified resolution is no
  // longer supported, since monitor configurations may change on the fly.
  virtual void SetResolution(const ScreenResolution& resolution,
                             absl::optional<webrtc::ScreenId> screen_id) = 0;

  // Restore the original monitor resolution. The caller must provide the
  // original resolution of the monitor, as returned by GetCurrentResolution(),
  // as a hint. However, implementations are free to ignore this. For example,
  // virtual hosts will typically ignore it to avoid unnecessary resizes.
  virtual void RestoreResolution(
      const ScreenResolution& original,
      absl::optional<webrtc::ScreenId> screen_id) = 0;
};

}  // namespace remoting

#endif  // REMOTING_HOST_DESKTOP_RESIZER_H_
