1ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org/*
2ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org *
4ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org *  Use of this source code is governed by a BSD-style license
5ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org *  that can be found in the LICENSE file in the root of the source
6ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org *  tree. An additional intellectual property rights grant can be found
7ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org *  in the file PATENTS.  All contributing project authors may
8ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org *  be found in the AUTHORS file in the root of the source tree.
9ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org */
10ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
11ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org#ifndef WEBRTC_BASE_WINDOW_H_
12ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org#define WEBRTC_BASE_WINDOW_H_
13ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
14ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org#include "webrtc/base/basictypes.h"
15ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org#include "webrtc/base/stringencode.h"
16ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
17ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// Define platform specific window types.
18ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
19ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgtypedef unsigned long Window;  // Avoid include <X11/Xlib.h>.
20ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org#elif defined(WEBRTC_WIN)
21ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// We commonly include win32.h in webrtc/base so just include it here.
22ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org#include "webrtc/base/win32.h"  // Include HWND, HMONITOR.
23ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org#elif defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
24ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgtypedef unsigned int CGWindowID;
25ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgtypedef unsigned int CGDirectDisplayID;
26ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org#endif
27ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
28a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgnamespace rtc {
29a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org
30ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgclass WindowId {
31ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org public:
32ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // Define WindowT for each platform.
33ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
34ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  typedef Window WindowT;
35ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org#elif defined(WEBRTC_WIN)
36ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  typedef HWND WindowT;
37ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org#elif defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
38ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  typedef CGWindowID WindowT;
399bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org#else
40ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  typedef unsigned int WindowT;
419bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org#endif
429bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org
43ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  static WindowId Cast(uint64 id) {
44ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org#if defined(WEBRTC_WIN)
45ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    return WindowId(reinterpret_cast<WindowId::WindowT>(id));
46ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org#else
479bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org    return WindowId(static_cast<WindowId::WindowT>(id));
48ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org#endif
49ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
50ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
51ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  static uint64 Format(const WindowT& id) {
52ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org#if defined(WEBRTC_WIN)
539bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org    return static_cast<uint64>(reinterpret_cast<uintptr_t>(id));
54ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org#else
559bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org    return static_cast<uint64>(id);
569bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org#endif
57ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
58ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
59ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  WindowId() : id_(0) {}
60ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  WindowId(const WindowT& id) : id_(id) {}  // NOLINT
619bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  const WindowT& id() const { return id_; }
62ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  bool IsValid() const { return id_ != 0; }
63ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  bool Equals(const WindowId& other) const {
64ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    return id_ == other.id();
65ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
66ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
67ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org private:
68ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  WindowT id_;
699bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org};
70ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
71ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgclass DesktopId {
72a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org public:
73d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  // Define DesktopT for each platform.
74d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
75a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  typedef Window DesktopT;
76a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org#elif defined(WEBRTC_WIN)
779bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  typedef HMONITOR DesktopT;
78ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org#elif defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
79ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  typedef CGDirectDisplayID DesktopT;
809bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org#else
819bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  typedef unsigned int DesktopT;
829bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org#endif
839bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org
84ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  static DesktopId Cast(int id, int index) {
85ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org#if defined(WEBRTC_WIN)
86ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    return DesktopId(reinterpret_cast<DesktopId::DesktopT>(id), index);
879bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org#else
889bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org    return DesktopId(static_cast<DesktopId::DesktopT>(id), index);
89ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org#endif
90ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
91ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
92ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  DesktopId() : id_(0), index_(-1) {}
93ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  DesktopId(const DesktopT& id, int index)  // NOLINT
94ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org      : id_(id), index_(index) {
95ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
96ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  const DesktopT& id() const { return id_; }
97ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  int index() const { return index_; }
98ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  bool IsValid() const { return index_ != -1; }
99ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  bool Equals(const DesktopId& other) const {
100ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org    return id_ == other.id() && index_ == other.index();
1012356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org  }
102ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
103ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org private:
104ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // Id is the platform specific desktop identifier.
105ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  DesktopT id_;
106ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // Index is the desktop index as enumerated by each platform.
107ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  // Desktop capturer typically takes the index instead of id.
108ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  int index_;
109ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org};
110ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
111ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org// Window event types.
112ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgenum WindowEvent {
113ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  WE_RESIZE = 0,
114ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  WE_CLOSE = 1,
1159bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  WE_MINIMIZE = 2,
116ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  WE_RESTORE = 3,
117ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org};
118ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
119inline std::string ToString(const WindowId& window) {
120  return ToString(window.id());
121}
122
123}  // namespace rtc
124
125#endif  // WEBRTC_BASE_WINDOW_H_
126