xref: /aosp_15_r20/external/webrtc/modules/desktop_capture/mac/window_list_utils.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright (c) 2014 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 MODULES_DESKTOP_CAPTURE_MAC_WINDOW_LIST_UTILS_H_
12 #define MODULES_DESKTOP_CAPTURE_MAC_WINDOW_LIST_UTILS_H_
13 
14 #include <ApplicationServices/ApplicationServices.h>
15 
16 #include <string>
17 #include "api/function_view.h"
18 #include "modules/desktop_capture/desktop_capture_types.h"
19 #include "modules/desktop_capture/desktop_capturer.h"
20 #include "modules/desktop_capture/desktop_geometry.h"
21 #include "modules/desktop_capture/mac/desktop_configuration.h"
22 
23 namespace webrtc {
24 
25 // Iterates all on-screen windows in decreasing z-order and sends them
26 // one-by-one to `on_window` function. If `on_window` returns false, this
27 // function returns immediately. GetWindowList() returns false if native APIs
28 // failed. Menus, dock (if `only_zero_layer`), minimized windows (if
29 // `ignore_minimized` is true) and any windows which do not have a valid window
30 // id or title will be ignored.
31 bool GetWindowList(rtc::FunctionView<bool(CFDictionaryRef)> on_window,
32                    bool ignore_minimized,
33                    bool only_zero_layer);
34 
35 // Another helper function to get the on-screen windows.
36 bool GetWindowList(DesktopCapturer::SourceList* windows,
37                    bool ignore_minimized,
38                    bool only_zero_layer);
39 
40 // Returns true if the window is occupying a full screen.
41 bool IsWindowFullScreen(const MacDesktopConfiguration& desktop_config,
42                         CFDictionaryRef window);
43 
44 // Returns true if the window is occupying a full screen.
45 bool IsWindowFullScreen(const MacDesktopConfiguration& desktop_config,
46                         CGWindowID id);
47 
48 // Returns true if the `window` is on screen. This function returns false if
49 // native APIs fail.
50 bool IsWindowOnScreen(CFDictionaryRef window);
51 
52 // Returns true if the window is on screen. This function returns false if
53 // native APIs fail or `id` cannot be found.
54 bool IsWindowOnScreen(CGWindowID id);
55 
56 // Returns utf-8 encoded title of `window`. If `window` is not a window or no
57 // valid title can be retrieved, this function returns an empty string.
58 std::string GetWindowTitle(CFDictionaryRef window);
59 
60 // Returns utf-8 encoded title of window `id`. If `id` cannot be found or no
61 // valid title can be retrieved, this function returns an empty string.
62 std::string GetWindowTitle(CGWindowID id);
63 
64 // Returns utf-8 encoded owner name of `window`. If `window` is not a window or
65 // if no valid owner name can be retrieved, returns an empty string.
66 std::string GetWindowOwnerName(CFDictionaryRef window);
67 
68 // Returns utf-8 encoded owner name of the given window `id`. If `id` cannot be
69 // found or if no valid owner name can be retrieved, returns an empty string.
70 std::string GetWindowOwnerName(CGWindowID id);
71 
72 // Returns id of `window`. If `window` is not a window or the window id cannot
73 // be retrieved, this function returns kNullWindowId.
74 WindowId GetWindowId(CFDictionaryRef window);
75 
76 // Returns the pid of the process owning `window`. Return 0 if `window` is not
77 // a window or no valid owner can be retrieved.
78 int GetWindowOwnerPid(CFDictionaryRef window);
79 
80 // Returns the pid of the process owning the window `id`. Return 0 if `id`
81 // cannot be found or no valid owner can be retrieved.
82 int GetWindowOwnerPid(CGWindowID id);
83 
84 // Returns the DIP to physical pixel scale at `position`. `position` is in
85 // *unscaled* system coordinate, i.e. it's device-independent and the primary
86 // monitor starts from (0, 0). If `position` is out of the system display, this
87 // function returns 1.
88 float GetScaleFactorAtPosition(const MacDesktopConfiguration& desktop_config,
89                                DesktopVector position);
90 
91 // Returns the DIP to physical pixel scale factor of the window with `id`.
92 // The bounds of the window with `id` is in DIP coordinates and `size` is the
93 // CGImage size of the window with `id` in physical coordinates. Comparing them
94 // can give the current scale factor.
95 // If the window overlaps multiple monitors, OS will decide on which monitor the
96 // window is displayed and use its scale factor to the window. So this method
97 // still works.
98 float GetWindowScaleFactor(CGWindowID id, DesktopSize size);
99 
100 // Returns the bounds of `window`. If `window` is not a window or the bounds
101 // cannot be retrieved, this function returns an empty DesktopRect. The returned
102 // DesktopRect is in system coordinate, i.e. the primary monitor always starts
103 // from (0, 0).
104 // Deprecated: This function should be avoided in favor of the overload with
105 // MacDesktopConfiguration.
106 DesktopRect GetWindowBounds(CFDictionaryRef window);
107 
108 // Returns the bounds of window with `id`. If `id` does not represent a window
109 // or the bounds cannot be retrieved, this function returns an empty
110 // DesktopRect. The returned DesktopRect is in system coordinates.
111 // Deprecated: This function should be avoided in favor of the overload with
112 // MacDesktopConfiguration.
113 DesktopRect GetWindowBounds(CGWindowID id);
114 
115 }  // namespace webrtc
116 
117 #endif  // MODULES_DESKTOP_CAPTURE_MAC_WINDOW_LIST_UTILS_H_
118