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