blob: ecf914dc72016bd17c15b705fb5764d2f59db6ee [file] [log] [blame]
// 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_