// Copyright 2014 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.

#include "extensions/shell/browser/shell_screen.h"

#include <stdint.h>
#include <vector>

#include "base/logging.h"
#include "extensions/shell/browser/root_window_controller.h"
#include "extensions/shell/browser/shell_desktop_controller_aura.h"
#include "ui/aura/env.h"
#include "ui/aura/window.h"
#include "ui/aura/window_tree_host.h"
#include "ui/display/display.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/native_widget_types.h"

namespace extensions {
namespace {

const int64_t kDisplayId = 0;

}  // namespace

ShellScreen::ShellScreen(ShellDesktopControllerAura* desktop_controller,
                         const gfx::Size& size)
    : desktop_controller_(desktop_controller) {
  DCHECK(!size.IsEmpty());

  // Screen is positioned at (0,0).
  display::Display display(kDisplayId);
  gfx::Rect bounds(size);
  display.SetScaleAndBounds(1.0f, bounds);
  ProcessDisplayChanged(display, true /* is_primary */);
}

ShellScreen::~ShellScreen() {
  DCHECK(!desktop_controller_ || !desktop_controller_->GetPrimaryHost())
      << "WindowTreeHost not closed before destroying ShellScreen";
}

void ShellScreen::OnHostResized(aura::WindowTreeHost* host) {
  // Based on ash::WindowTreeHostManager.
  display::Display display = GetDisplayNearestWindow(host->window());
  display.SetSize(host->GetBoundsInPixels().size());
  display_list().UpdateDisplay(display);
}

gfx::Point ShellScreen::GetCursorScreenPoint() {
  return aura::Env::GetInstance()->last_mouse_location();
}

bool ShellScreen::IsWindowUnderCursor(gfx::NativeWindow window) {
  return GetWindowAtScreenPoint(GetCursorScreenPoint()) == window;
}

gfx::NativeWindow ShellScreen::GetWindowAtScreenPoint(const gfx::Point& point) {
  return desktop_controller_->GetPrimaryHost()
      ->window()
      ->GetEventHandlerForPoint(point);
}

display::Display ShellScreen::GetDisplayNearestWindow(
    gfx::NativeWindow window) const {
  return GetPrimaryDisplay();
}

}  // namespace extensions
