/*
 *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "webrtc/modules/desktop_capture/window_finder_x11.h"

#include "webrtc/modules/desktop_capture/x11/window_list_utils.h"
#include "webrtc/rtc_base/checks.h"

namespace webrtc {

WindowFinderX11::WindowFinderX11(XAtomCache* cache)
    : cache_(cache) {
  RTC_DCHECK(cache_);
}

WindowFinderX11::~WindowFinderX11() = default;

WindowId WindowFinderX11::GetWindowUnderPoint(DesktopVector point) {
  WindowId id = kNullWindowId;
  GetWindowList(cache_,
                [&id, this, point](::Window window) {
                  DesktopRect rect;
                  if (GetWindowRect(this->cache_->display(), window, &rect) &&
                      rect.Contains(point)) {
                    id = window;
                    return false;
                  }
                  return true;
                });
  return id;
}

}  // namespace webrtc
