Chromium Code Reviews| Index: apps/shell/browser/shell_desktop_controller.cc |
| diff --git a/apps/shell/browser/shell_desktop_controller.cc b/apps/shell/browser/shell_desktop_controller.cc |
| index 124d89fe75625920ff986090fd2945f4687f6661..c842b7231e84ca8a0d8d189cb4531cbbeca2df7b 100644 |
| --- a/apps/shell/browser/shell_desktop_controller.cc |
| +++ b/apps/shell/browser/shell_desktop_controller.cc |
| @@ -7,6 +7,7 @@ |
| #include "apps/shell/browser/shell_app_window.h" |
| #include "content/public/browser/context_factory.h" |
| #include "ui/aura/client/cursor_client.h" |
| +#include "ui/aura/client/default_capture_client.h" |
| #include "ui/aura/env.h" |
| #include "ui/aura/layout_manager.h" |
| #include "ui/aura/test/test_screen.h" |
| @@ -18,11 +19,15 @@ |
| #include "ui/base/ime/input_method_initializer.h" |
| #include "ui/gfx/native_widget_types.h" |
| #include "ui/gfx/screen.h" |
| +#include "ui/wm/core/base_focus_rules.h" |
| +#include "ui/wm/core/compound_event_filter.h" |
| #include "ui/wm/core/cursor_manager.h" |
| +#include "ui/wm/core/default_activation_client.h" |
| +#include "ui/wm/core/focus_controller.h" |
| +#include "ui/wm/core/input_method_event_filter.h" |
| #include "ui/wm/core/native_cursor_manager.h" |
| #include "ui/wm/core/native_cursor_manager_delegate.h" |
| #include "ui/wm/core/user_activity_detector.h" |
| -#include "ui/wm/test/wm_test_helper.h" |
| #if defined(OS_CHROMEOS) |
| #include "ui/chromeos/user_activity_power_manager_notifier.h" |
| @@ -138,6 +143,18 @@ class ShellNativeCursorManager : public wm::NativeCursorManager { |
| DISALLOW_COPY_AND_ASSIGN(ShellNativeCursorManager); |
| }; |
| +class AppsFocusRules : public wm::BaseFocusRules { |
| + public: |
| + AppsFocusRules() {} |
| + |
|
oshima
2014/05/30 16:22:51
virtual dtor
Jun Mukai
2014/05/30 19:57:47
Done.
|
| + virtual bool SupportsChildActivation(aura::Window* window) const OVERRIDE { |
| + return true; |
| + } |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(AppsFocusRules); |
| +}; |
| + |
| ShellDesktopController* g_instance = NULL; |
| } // namespace |
| @@ -149,24 +166,8 @@ ShellDesktopController::ShellDesktopController() { |
| display_configurator_->ForceInitialConfigure(0); |
| display_configurator_->AddObserver(this); |
| #endif |
| - CreateRootWindow(); |
| - |
| - cursor_manager_.reset( |
| - new wm::CursorManager(scoped_ptr<wm::NativeCursorManager>( |
| - new ShellNativeCursorManager(GetWindowTreeHost())))); |
| - cursor_manager_->SetDisplay( |
| - gfx::Screen::GetNativeScreen()->GetPrimaryDisplay()); |
| - cursor_manager_->SetCursor(ui::kCursorPointer); |
| - aura::client::SetCursorClient( |
| - GetWindowTreeHost()->window(), cursor_manager_.get()); |
| - |
| - user_activity_detector_.reset(new wm::UserActivityDetector); |
| - GetWindowTreeHost()->event_processor()->GetRootTarget()->AddPreTargetHandler( |
| - user_activity_detector_.get()); |
| -#if defined(OS_CHROMEOS) |
| - user_activity_notifier_.reset( |
| - new ui::UserActivityPowerManagerNotifier(user_activity_detector_.get())); |
| -#endif |
| + aura::Env::CreateInstance(true); |
| + aura::Env::GetInstance()->set_context_factory(content::GetContextFactory()); |
| g_instance = this; |
| } |
|
James Cook
2014/05/30 17:30:18
I like how the constructor does less work now.
|
| @@ -175,8 +176,6 @@ ShellDesktopController::~ShellDesktopController() { |
| // The app window must be explicitly closed before desktop teardown. |
| DCHECK(!app_window_); |
| g_instance = NULL; |
| - GetWindowTreeHost()->event_processor()->GetRootTarget() |
| - ->RemovePreTargetHandler(user_activity_detector_.get()); |
| DestroyRootWindow(); |
| aura::Env::DeleteInstance(); |
| } |
| @@ -188,7 +187,7 @@ ShellDesktopController* ShellDesktopController::instance() { |
| ShellAppWindow* ShellDesktopController::CreateAppWindow( |
| content::BrowserContext* context) { |
| - aura::Window* root_window = GetWindowTreeHost()->window(); |
| + aura::Window* root_window = host_->window(); |
| app_window_.reset(new ShellAppWindow); |
| app_window_->Init(context, root_window->bounds().size()); |
| @@ -203,8 +202,11 @@ ShellAppWindow* ShellDesktopController::CreateAppWindow( |
| void ShellDesktopController::CloseAppWindow() { app_window_.reset(); } |
| -aura::WindowTreeHost* ShellDesktopController::GetWindowTreeHost() { |
| - return wm_test_helper_->host(); |
| +aura::Window* ShellDesktopController::GetDefaultParent( |
| + aura::Window* context, |
| + aura::Window* window, |
| + const gfx::Rect& bounds) { |
| + return host_->window(); |
| } |
| #if defined(OS_CHROMEOS) |
| @@ -212,10 +214,18 @@ void ShellDesktopController::OnDisplayModeChanged( |
| const std::vector<ui::DisplayConfigurator::DisplayState>& displays) { |
| gfx::Size size = GetPrimaryDisplaySize(); |
| if (!size.IsEmpty()) |
| - wm_test_helper_->host()->UpdateRootWindowSize(size); |
| + host_->UpdateRootWindowSize(size); |
| } |
| #endif |
| +void ShellDesktopController::OnHostCloseRequested( |
| + const aura::WindowTreeHost* host) { |
| + DCHECK_EQ(host_.get(), host); |
| + CloseAppWindow(); |
| + base::MessageLoop::current()->PostTask(FROM_HERE, |
| + base::MessageLoop::QuitClosure()); |
| +} |
| + |
| void ShellDesktopController::CreateRootWindow() { |
| test_screen_.reset(aura::TestScreen::Create()); |
| // TODO(jamescook): Replace this with a real Screen implementation. |
| @@ -227,19 +237,75 @@ void ShellDesktopController::CreateRootWindow() { |
| gfx::Size size = GetPrimaryDisplaySize(); |
| if (size.IsEmpty()) |
| size = gfx::Size(800, 600); |
| - wm_test_helper_.reset( |
| - new wm::WMTestHelper(size, content::GetContextFactory())); |
| - // Ensure new windows fill the display. |
| - aura::WindowTreeHost* host = wm_test_helper_->host(); |
| - host->window()->SetLayoutManager(new FillLayout); |
| + host_.reset(aura::WindowTreeHost::Create(gfx::Rect(size))); |
| + host_->InitHost(); |
| + aura::client::SetWindowTreeClient(host_->window(), this); |
| + root_window_event_filter_.reset(new wm::CompoundEventFilter); |
| + host_->window()->AddPreTargetHandler(root_window_event_filter_.get()); |
| + InitWindowManager(); |
| + |
| + host_->AddObserver(this); |
| // Ensure the X window gets mapped. |
| - host->Show(); |
| + host_->Show(); |
| +} |
| + |
| +void ShellDesktopController::InitWindowManager() { |
| + focus_client_.reset(new wm::FocusController(new AppsFocusRules())); |
| + aura::client::SetFocusClient(host_->window(), focus_client_.get()); |
| + |
| + input_method_filter_.reset( |
| + new wm::InputMethodEventFilter(host_->GetAcceleratedWidget())); |
| + input_method_filter_->SetInputMethodPropertyInRootWindow(host_->window()); |
| + root_window_event_filter_->AddHandler(input_method_filter_.get()); |
| + |
| + new wm::DefaultActivationClient(host_->window()); |
| + |
| + capture_client_.reset( |
| + new aura::client::DefaultCaptureClient(host_->window())); |
| + |
| + // Ensure new windows fill the display. |
| + host_->window()->SetLayoutManager(new FillLayout); |
| + |
| + cursor_manager_.reset( |
| + new wm::CursorManager(scoped_ptr<wm::NativeCursorManager>( |
| + new ShellNativeCursorManager(host_.get())))); |
| + cursor_manager_->SetDisplay( |
| + gfx::Screen::GetNativeScreen()->GetPrimaryDisplay()); |
| + cursor_manager_->SetCursor(ui::kCursorPointer); |
| + aura::client::SetCursorClient(host_->window(), cursor_manager_.get()); |
| + |
| + user_activity_detector_.reset(new wm::UserActivityDetector); |
| + host_->event_processor()->GetRootTarget()->AddPreTargetHandler( |
| + user_activity_detector_.get()); |
| +#if defined(OS_CHROMEOS) |
| + user_activity_notifier_.reset( |
| + new ui::UserActivityPowerManagerNotifier(user_activity_detector_.get())); |
| +#endif |
| } |
| void ShellDesktopController::DestroyRootWindow() { |
| - wm_test_helper_.reset(); |
| + if (!host_) |
| + return; |
|
oshima
2014/05/30 16:22:51
when are these null checks necessary?
Jun Mukai
2014/05/30 19:57:47
removed.
|host_| is NULL in ctor and this method i
|
| + |
| + host_->RemoveObserver(this); |
| + if (input_method_filter_) |
| + root_window_event_filter_->RemoveHandler(input_method_filter_.get()); |
| + if (user_activity_detector_) { |
| + host_->event_processor()->GetRootTarget()->RemovePreTargetHandler( |
| + user_activity_detector_.get()); |
| + } |
| + root_window_event_filter_.reset(); |
| + capture_client_.reset(); |
| + input_method_filter_.reset(); |
| + focus_client_.reset(); |
| + cursor_manager_.reset(); |
| +#if defined(OS_CHROMEOS) |
| + user_activity_notifier_.reset(); |
| +#endif |
| + user_activity_detector_.reset(); |
| + host_.reset(); |
| ui::ShutdownInputMethodForTesting(); |
| } |