// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ASH_DISPLAY_SCREEN_POSITION_CONTROLLER_H_
#define ASH_DISPLAY_SCREEN_POSITION_CONTROLLER_H_

#include <vector>

#include "base/macros.h"
#include "ui/aura/client/screen_position_client.h"

namespace ash {

class ScreenPositionController : public aura::client::ScreenPositionClient {
 public:
  // Finds the root window at |location| in |window|'s coordinates
  // from given |root_windows| and returns the found root window and
  // location in that root window's coordinates. The function usually
  // returns |window->GetRootWindow()|, but if the mouse pointer is
  // moved outside the |window|'s root while the mouse is captured, it
  // returns the other root window.
  static void ConvertHostPointToRelativeToRootWindow(
      aura::Window* root_window,
      const std::vector<aura::Window*>& root_windows,
      gfx::Point* point_in_host,
      aura::Window** target_window);

  ScreenPositionController() {}
  ~ScreenPositionController() override {}

  // aura::client::ScreenPositionClient overrides:
  void ConvertPointToScreen(const aura::Window* window,
                            gfx::Point* point) override;
  void ConvertPointFromScreen(const aura::Window* window,
                              gfx::Point* point) override;
  void ConvertHostPointToScreen(aura::Window* window,
                                gfx::Point* point) override;
  void SetBounds(aura::Window* window,
                 const gfx::Rect& bounds,
                 const display::Display& display) override;

 private:
  DISALLOW_COPY_AND_ASSIGN(ScreenPositionController);
};

}  // namespace ash

#endif  // ASH_DISPLAY_SCREEN_POSITION_CONTROLLER_H_
