chromium/ui/display/win/local_process_window_finder_win.h

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_DISPLAY_WIN_LOCAL_PROCESS_WINDOW_FINDER_WIN_H_
#define UI_DISPLAY_WIN_LOCAL_PROCESS_WINDOW_FINDER_WIN_H_

#include <set>

#include "base/memory/raw_ptr.h"
#include "ui/display/win/base_window_finder_win.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/native_widget_types.h"

namespace display::win {

class ScreenWin;

// Helper class to determine if a particular point contains a window from our
// process.
class LocalProcessWindowFinder : public BaseWindowFinderWin {
 public:
  // Returns the hwnd from our process at screen_loc that is not obscured by
  // another window. Returns NULL otherwise.
  static gfx::NativeWindow GetProcessWindowAtPoint(const gfx::Point& screen_loc,
                                                   const std::set<HWND>& ignore,
                                                   ScreenWin* screen_win);

 protected:
  bool ShouldStopIterating(HWND hwnd) override;

 private:
  LocalProcessWindowFinder(const gfx::Point& screen_loc,
                           ScreenWin* screen_win,
                           const std::set<HWND>& ignore);
  LocalProcessWindowFinder(const LocalProcessWindowFinder& finder) = delete;
  LocalProcessWindowFinder& operator=(const LocalProcessWindowFinder& finder) =
      delete;
  ~LocalProcessWindowFinder() override;

  // Position of the mouse in pixel coordinates.
  gfx::Point screen_loc_;

  // The resulting window. This is set to true in ShouldStopIterating if an
  // appropriate window is found.
  HWND result_ = nullptr;

  // ScreenWin we're looking on. Used to access WindowTreeHost, which
  // ui/display code can't access directly.
  raw_ptr<ScreenWin> screen_win_;
};

}  // namespace display::win

#endif  // UI_DISPLAY_WIN_LOCAL_PROCESS_WINDOW_FINDER_WIN_H_