| // 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 "ui/aura/env.h" |
| #include "ui/aura/window.h" |
| #include "ui/aura/window_tree_host.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(const gfx::Size& size) : host_(nullptr) { |
| 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(!host_) << "Window not closed before destroying ShellScreen"; |
| } |
| |
| aura::WindowTreeHost* ShellScreen::CreateHostForPrimaryDisplay() { |
| DCHECK(!host_); |
| host_ = aura::WindowTreeHost::Create( |
| gfx::Rect(GetPrimaryDisplay().GetSizeInPixel())); |
| host_->window()->AddObserver(this); |
| host_->InitHost(); |
| host_->window()->Show(); |
| return host_; |
| } |
| |
| // aura::WindowObserver overrides: |
| |
| void ShellScreen::OnWindowBoundsChanged(aura::Window* window, |
| const gfx::Rect& old_bounds, |
| const gfx::Rect& new_bounds) { |
| DCHECK_EQ(host_->window(), window); |
| display::Display display(GetPrimaryDisplay()); |
| display.SetSize(new_bounds.size()); |
| display_list().UpdateDisplay(display); |
| } |
| |
| void ShellScreen::OnWindowDestroying(aura::Window* window) { |
| DCHECK_EQ(host_->window(), window); |
| host_->window()->RemoveObserver(this); |
| host_ = nullptr; |
| } |
| |
| // display::Screen overrides: |
| |
| 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 host_->window()->GetEventHandlerForPoint(point); |
| } |
| |
| display::Display ShellScreen::GetDisplayNearestWindow( |
| gfx::NativeWindow window) const { |
| return GetPrimaryDisplay(); |
| } |
| |
| } // namespace extensions |