1/*
2 *  Copyright (c) 2017 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#include "modules/desktop_capture/window_finder_mac.h"
12
13#include <CoreFoundation/CoreFoundation.h>
14
15#include <memory>
16#include <utility>
17
18#include "modules/desktop_capture/mac/desktop_configuration.h"
19#include "modules/desktop_capture/mac/desktop_configuration_monitor.h"
20#include "modules/desktop_capture/mac/window_list_utils.h"
21
22namespace webrtc {
23
24WindowFinderMac::WindowFinderMac(
25    rtc::scoped_refptr<DesktopConfigurationMonitor> configuration_monitor)
26    : configuration_monitor_(std::move(configuration_monitor)) {}
27WindowFinderMac::~WindowFinderMac() = default;
28
29WindowId WindowFinderMac::GetWindowUnderPoint(DesktopVector point) {
30  WindowId id = kNullWindowId;
31  GetWindowList(
32      [&id, point](CFDictionaryRef window) {
33        DesktopRect bounds;
34        bounds = GetWindowBounds(window);
35        if (bounds.Contains(point)) {
36          id = GetWindowId(window);
37          return false;
38        }
39        return true;
40      },
41      true,
42      true);
43  return id;
44}
45
46// static
47std::unique_ptr<WindowFinder> WindowFinder::Create(
48    const WindowFinder::Options& options) {
49  return std::make_unique<WindowFinderMac>(options.configuration_monitor);
50}
51
52}  // namespace webrtc
53