16c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org/*
26c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
36c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org *
46c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org *  Use of this source code is governed by a BSD-style license
56c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org *  that can be found in the LICENSE file in the root of the source
66c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org *  tree. An additional intellectual property rights grant can be found
76c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org *  in the file PATENTS.  All contributing project authors may
86c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org *  be found in the AUTHORS file in the root of the source tree.
96c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org */
106c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
116c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#ifndef WEBRTC_MODULES_DESKTOP_CAPTURE_MAC_DESKTOP_CONFIGURATION_H_
126c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#define WEBRTC_MODULES_DESKTOP_CAPTURE_MAC_DESKTOP_CONFIGURATION_H_
136c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
146c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#include <ApplicationServices/ApplicationServices.h>
156c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#include <Carbon/Carbon.h>
166c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#include <vector>
176c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
186c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#include "webrtc/typedefs.h"
196c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#include "webrtc/modules/desktop_capture/desktop_geometry.h"
206c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
216c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgnamespace webrtc {
226c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
236c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org// Describes the configuration of a specific display.
246c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgstruct MacDisplayConfiguration {
256c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  MacDisplayConfiguration();
266c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
276c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // Cocoa identifier for this display.
286c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  CGDirectDisplayID id;
296c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
306c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // Bounds of this display in Density-Independent Pixels (DIPs).
316c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  DesktopRect bounds;
326c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
336c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // Bounds of this display in physical pixels.
346c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  DesktopRect pixel_bounds;
356c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
366c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // Scale factor from DIPs to physical pixels.
376c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  float dip_to_pixel_scale;
386c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org};
396c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
406c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgtypedef std::vector<MacDisplayConfiguration> MacDisplayConfigurations;
416c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
426c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org// Describes the configuration of the whole desktop.
436c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgstruct MacDesktopConfiguration {
446c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // Used to request bottom-up or top-down coordinates.
456c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  enum Origin { BottomLeftOrigin, TopLeftOrigin };
466c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
476c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  MacDesktopConfiguration();
486c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  ~MacDesktopConfiguration();
496c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
506c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // Returns the desktop & display configurations in Cocoa-style "bottom-up"
516c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // (the origin is the bottom-left of the primary monitor, and coordinates
526c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // increase as you move up the screen) or Carbon-style "top-down" coordinates.
536c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  static MacDesktopConfiguration GetCurrent(Origin origin);
546c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
5554ad9296e15baf36bbc485d9fe1878ba4a28ebe2jiayl@webrtc.org  // Returns true if the given desktop configuration equals this one.
5654ad9296e15baf36bbc485d9fe1878ba4a28ebe2jiayl@webrtc.org  bool Equals(const MacDesktopConfiguration& other);
5754ad9296e15baf36bbc485d9fe1878ba4a28ebe2jiayl@webrtc.org
581d23d5eec85f4b124b4941f7d583e52a85ad5deejiayl@webrtc.org  // Returns the pointer to the display configuration with the specified id.
591d23d5eec85f4b124b4941f7d583e52a85ad5deejiayl@webrtc.org  const MacDisplayConfiguration* FindDisplayConfigurationById(
601d23d5eec85f4b124b4941f7d583e52a85ad5deejiayl@webrtc.org      CGDirectDisplayID id);
611d23d5eec85f4b124b4941f7d583e52a85ad5deejiayl@webrtc.org
6274658f6b1fff3e69c2b16b8600d9e2051e505c1csergeyu@chromium.org  // Bounds of the desktop excluding monitors with DPI settings different from
6374658f6b1fff3e69c2b16b8600d9e2051e505c1csergeyu@chromium.org  // the main monitor. In Density-Independent Pixels (DIPs).
64998d063211cf856d91181e16d6eb303a1a9fd229sergeyu@chromium.org  DesktopRect bounds;
656c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
6674658f6b1fff3e69c2b16b8600d9e2051e505c1csergeyu@chromium.org  // Same as bounds, but expressed in physical pixels.
67998d063211cf856d91181e16d6eb303a1a9fd229sergeyu@chromium.org  DesktopRect pixel_bounds;
686c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
696c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // Scale factor from DIPs to physical pixels.
706c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  float dip_to_pixel_scale;
716c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
726c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  // Configurations of the displays making up the desktop area.
736c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org  MacDisplayConfigurations displays;
746c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org};
756c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
766c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org}  // namespace webrtc
776c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org
786c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_MAC_DESKTOP_CONFIGURATION_H_
79