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/basictypes.h"
15 #include "webrtc/base/stringencode.h"
16 
17 // Define platform specific window types.
18 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
19 typedef unsigned long Window;  // Avoid include <X11/Xlib.h>.
20 #elif defined(WEBRTC_WIN)
21 // We commonly include win32.h in webrtc/base so just include it here.
22 #include "webrtc/base/win32.h"  // Include HWND, HMONITOR.
23 #elif defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
24 typedef unsigned int CGWindowID;
25 typedef unsigned int CGDirectDisplayID;
26 #endif
27 
28 namespace rtc {
29 
30 class WindowId {
31  public:
32   // Define WindowT for each platform.
33 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
34   typedef Window WindowT;
35 #elif defined(WEBRTC_WIN)
36   typedef HWND WindowT;
37 #elif defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
38   typedef CGWindowID WindowT;
39 #else
40   typedef unsigned int WindowT;
41 #endif
42 
Cast(uint64_t id)43   static WindowId Cast(uint64_t id) {
44 #if defined(WEBRTC_WIN)
45     return WindowId(reinterpret_cast<WindowId::WindowT>(id));
46 #else
47     return WindowId(static_cast<WindowId::WindowT>(id));
48 #endif
49   }
50 
Format(const WindowT & id)51   static uint64_t Format(const WindowT& id) {
52 #if defined(WEBRTC_WIN)
53     return static_cast<uint64_t>(reinterpret_cast<uintptr_t>(id));
54 #else
55     return static_cast<uint64_t>(id);
56 #endif
57   }
58 
WindowId()59   WindowId() : id_(0) {}
WindowId(const WindowT & id)60   WindowId(const WindowT& id) : id_(id) {}  // NOLINT
id()61   const WindowT& id() const { return id_; }
IsValid()62   bool IsValid() const { return id_ != 0; }
Equals(const WindowId & other)63   bool Equals(const WindowId& other) const {
64     return id_ == other.id();
65   }
66 
67  private:
68   WindowT id_;
69 };
70 
71 class DesktopId {
72  public:
73   // Define DesktopT for each platform.
74 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
75   typedef Window DesktopT;
76 #elif defined(WEBRTC_WIN)
77   typedef HMONITOR DesktopT;
78 #elif defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
79   typedef CGDirectDisplayID DesktopT;
80 #else
81   typedef unsigned int DesktopT;
82 #endif
83 
Cast(int id,int index)84   static DesktopId Cast(int id, int index) {
85 #if defined(WEBRTC_WIN)
86     return DesktopId(reinterpret_cast<DesktopId::DesktopT>(id), index);
87 #else
88     return DesktopId(static_cast<DesktopId::DesktopT>(id), index);
89 #endif
90   }
91 
DesktopId()92   DesktopId() : id_(0), index_(-1) {}
DesktopId(const DesktopT & id,int index)93   DesktopId(const DesktopT& id, int index)  // NOLINT
94       : id_(id), index_(index) {
95   }
id()96   const DesktopT& id() const { return id_; }
index()97   int index() const { return index_; }
IsValid()98   bool IsValid() const { return index_ != -1; }
Equals(const DesktopId & other)99   bool Equals(const DesktopId& other) const {
100     return id_ == other.id() && index_ == other.index();
101   }
102 
103  private:
104   // Id is the platform specific desktop identifier.
105   DesktopT id_;
106   // Index is the desktop index as enumerated by each platform.
107   // Desktop capturer typically takes the index instead of id.
108   int index_;
109 };
110 
111 // Window event types.
112 enum WindowEvent {
113   WE_RESIZE = 0,
114   WE_CLOSE = 1,
115   WE_MINIMIZE = 2,
116   WE_RESTORE = 3,
117 };
118 
ToString(const WindowId & window)119 inline std::string ToString(const WindowId& window) {
120   return ToString(window.id());
121 }
122 
123 }  // namespace rtc
124 
125 #endif  // WEBRTC_BASE_WINDOW_H_
126