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