11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/env/public/athena_env.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <vector> 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/util/fill_layout_manager.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/sys_info.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/aura/client/aura_constants.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/aura/client/cursor_client.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/aura/client/default_capture_client.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/aura/env.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/aura/test/test_screen.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/aura/window_event_dispatcher.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/aura/window_tree_host.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/aura/window_tree_host_observer.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/cursor/cursor.h" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/cursor/image_cursors.h" 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/chromeos/user_activity_power_manager_notifier.h" 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/display/chromeos/display_configurator.h" 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/display/types/display_mode.h" 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/display/types/display_snapshot.h" 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/gfx/screen.h" 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/wm/core/compound_event_filter.h" 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/wm/core/cursor_manager.h" 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/wm/core/input_method_event_filter.h" 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/wm/core/native_cursor_manager.h" 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/wm/core/native_cursor_manager_delegate.h" 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/wm/core/user_activity_detector.h" 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace athena { 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace { 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciAthenaEnv* instance = NULL; 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Screen object used during shutdown. 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccigfx::Screen* screen_for_shutdown = NULL; 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// TODO(flackr:oshima): Remove this once athena switches to share 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// ash::DisplayManager. 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ScreenForShutdown : public gfx::Screen { 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Creates and sets the screen for shutdown. Deletes existing one if any. 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static void Create(const gfx::Screen* screen) { 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delete screen_for_shutdown; 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci screen_for_shutdown = new ScreenForShutdown(screen->GetPrimaryDisplay()); 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci screen_for_shutdown); 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci explicit ScreenForShutdown(const gfx::Display& primary_display) 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : primary_display_(primary_display) {} 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // gfx::Screen overrides: 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool IsDIPEnabled() OVERRIDE { return true; } 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual gfx::Point GetCursorScreenPoint() OVERRIDE { return gfx::Point(); } 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual gfx::NativeWindow GetWindowUnderCursor() OVERRIDE { return NULL; } 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual gfx::NativeWindow GetWindowAtScreenPoint( 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::Point& point) OVERRIDE { 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual int GetNumDisplays() const OVERRIDE { return 1; } 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual std::vector<gfx::Display> GetAllDisplays() const OVERRIDE { 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<gfx::Display> displays(1, primary_display_); 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return displays; 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual gfx::Display GetDisplayNearestWindow( 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::NativeView view) const OVERRIDE { 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return primary_display_; 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual gfx::Display GetDisplayNearestPoint( 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::Point& point) const OVERRIDE { 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return primary_display_; 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual gfx::Display GetDisplayMatching( 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::Rect& match_rect) const OVERRIDE { 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return primary_display_; 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual gfx::Display GetPrimaryDisplay() const OVERRIDE { 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return primary_display_; 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void AddObserver(gfx::DisplayObserver* observer) OVERRIDE { 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NOTREACHED() << "Observer should not be added during shutdown"; 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void RemoveObserver(gfx::DisplayObserver* observer) OVERRIDE {} 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::Display primary_display_; 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(ScreenForShutdown); 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// A class that bridges the gap between CursorManager and Aura. It borrows 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// heavily from AshNativeCursorManager. 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass AthenaNativeCursorManager : public wm::NativeCursorManager { 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci explicit AthenaNativeCursorManager(aura::WindowTreeHost* host) 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : host_(host), image_cursors_(new ui::ImageCursors) {} 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~AthenaNativeCursorManager() {} 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // wm::NativeCursorManager overrides. 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void SetDisplay(const gfx::Display& display, 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci wm::NativeCursorManagerDelegate* delegate) OVERRIDE { 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (image_cursors_->SetDisplay(display, display.device_scale_factor())) 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetCursor(delegate->GetCursor(), delegate); 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void SetCursor(gfx::NativeCursor cursor, 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci wm::NativeCursorManagerDelegate* delegate) OVERRIDE { 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci image_cursors_->SetPlatformCursor(&cursor); 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cursor.set_device_scale_factor(image_cursors_->GetScale()); 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delegate->CommitCursor(cursor); 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (delegate->IsCursorVisible()) 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ApplyCursor(cursor); 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void SetVisibility( 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool visible, 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci wm::NativeCursorManagerDelegate* delegate) OVERRIDE { 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delegate->CommitVisibility(visible); 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (visible) { 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetCursor(delegate->GetCursor(), delegate); 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::NativeCursor invisible_cursor(ui::kCursorNone); 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci image_cursors_->SetPlatformCursor(&invisible_cursor); 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ApplyCursor(invisible_cursor); 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void SetCursorSet( 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::CursorSetType cursor_set, 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci wm::NativeCursorManagerDelegate* delegate) OVERRIDE { 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci image_cursors_->SetCursorSet(cursor_set); 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delegate->CommitCursorSet(cursor_set); 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (delegate->IsCursorVisible()) 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetCursor(delegate->GetCursor(), delegate); 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void SetMouseEventsEnabled( 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool enabled, 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci wm::NativeCursorManagerDelegate* delegate) OVERRIDE { 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delegate->CommitMouseEventsEnabled(enabled); 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetVisibility(delegate->IsCursorVisible(), delegate); 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Sets |cursor| as the active cursor within Aura. 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void ApplyCursor(gfx::NativeCursor cursor) { host_->SetCursor(cursor); } 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci aura::WindowTreeHost* host_; // Not owned. 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<ui::ImageCursors> image_cursors_; 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(AthenaNativeCursorManager); 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass AthenaEnvImpl : public AthenaEnv, 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public aura::WindowTreeHostObserver, 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public ui::DisplayConfigurator::Observer { 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AthenaEnvImpl() : display_configurator_(new ui::DisplayConfigurator) { 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci display_configurator_->Init(false); 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci display_configurator_->ForceInitialConfigure(0); 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci display_configurator_->AddObserver(this); 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Size screen_size = GetPrimaryDisplaySize(); 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (screen_size.IsEmpty()) { 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(oshima): Remove this hack. 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (base::SysInfo::IsRunningOnChromeOS()) 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci screen_size.SetSize(2560, 1600); 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci screen_size.SetSize(1280, 720); 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci screen_.reset(aura::TestScreen::Create(screen_size)); 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, screen_.get()); 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_.reset(screen_->CreateHostForPrimaryDisplay()); 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_->InitHost(); 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci aura::Window* root_window = GetHost()->window(); 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci input_method_filter_.reset( 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new wm::InputMethodEventFilter(host_->GetAcceleratedWidget())); 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci input_method_filter_->SetInputMethodPropertyInRootWindow(root_window); 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci root_window_event_filter_.reset(new wm::CompoundEventFilter); 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_->window()->AddPreTargetHandler(root_window_event_filter_.get()); 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci input_method_filter_.reset( 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new wm::InputMethodEventFilter(host_->GetAcceleratedWidget())); 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci input_method_filter_->SetInputMethodPropertyInRootWindow(host_->window()); 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci root_window_event_filter_->AddHandler(input_method_filter_.get()); 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci capture_client_.reset( 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new aura::client::DefaultCaptureClient(host_->window())); 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Ensure new windows fill the display. 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci root_window->SetLayoutManager(new FillLayoutManager(root_window)); 2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cursor_manager_.reset( 2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new wm::CursorManager(scoped_ptr<wm::NativeCursorManager>( 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new AthenaNativeCursorManager(host_.get())))); 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cursor_manager_->SetDisplay( 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Screen::GetNativeScreen()->GetPrimaryDisplay()); 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cursor_manager_->SetCursor(ui::kCursorPointer); 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci aura::client::SetCursorClient(host_->window(), cursor_manager_.get()); 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_activity_detector_.reset(new wm::UserActivityDetector); 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_->event_processor()->GetRootTarget()->AddPreTargetHandler( 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_activity_detector_.get()); 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_activity_notifier_.reset(new ui::UserActivityPowerManagerNotifier( 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_activity_detector_.get())); 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_->AddObserver(this); 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_->Show(); 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!instance); 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci instance = this; 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~AthenaEnvImpl() { 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci instance = NULL; 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_->RemoveObserver(this); 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (input_method_filter_) 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci root_window_event_filter_->RemoveHandler(input_method_filter_.get()); 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (user_activity_detector_) { 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_->event_processor()->GetRootTarget()->RemovePreTargetHandler( 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_activity_detector_.get()); 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci root_window_event_filter_.reset(); 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci capture_client_.reset(); 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci input_method_filter_.reset(); 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cursor_manager_.reset(); 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_activity_notifier_.reset(); 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_activity_detector_.reset(); 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci input_method_filter_.reset(); 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_.reset(); 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ScreenForShutdown::Create(screen_.get()); 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci screen_.reset(); 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci aura::Env::DeleteInstance(); 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci display_configurator_->RemoveObserver(this); 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci display_configurator_.reset(); 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci struct Finder { 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci explicit Finder(const base::Closure& c) : closure(c) {} 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool operator()(const base::Closure& other) { 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return closure.Equals(other); 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Closure closure; 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // AthenaEnv: 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual aura::WindowTreeHost* GetHost() OVERRIDE { return host_.get(); } 2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void SetDisplayWorkAreaInsets(const gfx::Insets& insets) OVERRIDE { 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci screen_->SetWorkAreaInsets(insets); 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void AddTerminatingCallback(const base::Closure& closure) OVERRIDE { 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (closure.is_null()) 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(terminating_callbacks_.end() == 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::find_if(terminating_callbacks_.begin(), 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci terminating_callbacks_.end(), 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Finder(closure))); 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci terminating_callbacks_.push_back(closure); 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void RemoveTerminatingCallback( 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::Closure& closure) OVERRIDE { 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<base::Closure>::iterator iter = 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::find_if(terminating_callbacks_.begin(), 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci terminating_callbacks_.end(), 2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Finder(closure)); 2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (iter != terminating_callbacks_.end()) 2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci terminating_callbacks_.erase(iter); 2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnTerminating() OVERRIDE { 2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (std::vector<base::Closure>::iterator iter = 2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci terminating_callbacks_.begin(); 2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci iter != terminating_callbacks_.end(); 2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++iter) { 2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci iter->Run(); 2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // ui::DisplayConfigurator::Observer: 2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnDisplayModeChanged(const std::vector< 3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::DisplayConfigurator::DisplayState>& displays) OVERRIDE { 3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Size size = GetPrimaryDisplaySize(); 3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!size.IsEmpty()) 3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_->UpdateRootWindowSize(size); 3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // aura::WindowTreeHostObserver: 3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnHostCloseRequested(const aura::WindowTreeHost* host) OVERRIDE { 3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::MessageLoopForUI::current()->PostTask( 3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FROM_HERE, base::MessageLoop::QuitClosure()); 3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Size GetPrimaryDisplaySize() const { 3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<ui::DisplayConfigurator::DisplayState>& displays = 3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci display_configurator_->cached_displays(); 3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (displays.empty()) 3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return gfx::Size(); 3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ui::DisplayMode* mode = displays[0].display->current_mode(); 3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return mode ? mode->size() : gfx::Size(); 3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<aura::TestScreen> screen_; 3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<aura::WindowTreeHost> host_; 3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<wm::InputMethodEventFilter> input_method_filter_; 3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<wm::CompoundEventFilter> root_window_event_filter_; 3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<aura::client::DefaultCaptureClient> capture_client_; 3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<wm::CursorManager> cursor_manager_; 3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<wm::UserActivityDetector> user_activity_detector_; 3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<ui::DisplayConfigurator> display_configurator_; 3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<ui::UserActivityPowerManagerNotifier> user_activity_notifier_; 3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<base::Closure> terminating_callbacks_; 3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(AthenaEnvImpl); 3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace 3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid AthenaEnv::Create() { 3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!instance); 3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new AthenaEnvImpl(); 3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciAthenaEnv* AthenaEnv::Get() { 3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(instance); 3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return instance; 3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid AthenaEnv::Shutdown() { 3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(instance); 3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delete instance; 3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace athena 359