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