| // Copyright (c) 2012 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 "ash/touch/touch_observer_hud.h" |
| |
| #include "ash/root_window_controller.h" |
| #include "ash/root_window_settings.h" |
| #include "ash/shell.h" |
| #include "ash/shell_window_ids.h" |
| #include "ui/aura/window_event_dispatcher.h" |
| #include "ui/gfx/display.h" |
| #include "ui/gfx/rect.h" |
| #include "ui/gfx/screen.h" |
| #include "ui/gfx/size.h" |
| #include "ui/views/widget/widget.h" |
| |
| namespace ash { |
| |
| TouchObserverHUD::TouchObserverHUD(aura::Window* initial_root) |
| : display_id_(GetRootWindowSettings(initial_root)->display_id), |
| root_window_(initial_root), |
| widget_(NULL) { |
| const gfx::Display& display = |
| Shell::GetInstance()->display_manager()->GetDisplayForId(display_id_); |
| |
| views::View* content = new views::View; |
| |
| const gfx::Size& display_size = display.size(); |
| content->SetSize(display_size); |
| |
| widget_ = new views::Widget(); |
| views::Widget::InitParams |
| params(views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); |
| params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; |
| params.activatable = views::Widget::InitParams::ACTIVATABLE_NO; |
| params.accept_events = false; |
| params.bounds = display.bounds(); |
| params.parent = |
| Shell::GetContainer(root_window_, kShellWindowId_OverlayContainer); |
| widget_->Init(params); |
| widget_->SetContentsView(content); |
| widget_->StackAtTop(); |
| widget_->Show(); |
| |
| widget_->AddObserver(this); |
| |
| // Observe changes in display size and mode to update touch HUD. |
| Shell::GetScreen()->AddObserver(this); |
| #if defined(OS_CHROMEOS) |
| Shell::GetInstance()->display_configurator()->AddObserver(this); |
| #endif // defined(OS_CHROMEOS) |
| |
| Shell::GetInstance()->display_controller()->AddObserver(this); |
| root_window_->AddPreTargetHandler(this); |
| } |
| |
| TouchObserverHUD::~TouchObserverHUD() { |
| Shell::GetInstance()->display_controller()->RemoveObserver(this); |
| |
| #if defined(OS_CHROMEOS) |
| Shell::GetInstance()->display_configurator()->RemoveObserver(this); |
| #endif // defined(OS_CHROMEOS) |
| Shell::GetScreen()->RemoveObserver(this); |
| |
| widget_->RemoveObserver(this); |
| } |
| |
| void TouchObserverHUD::Clear() { |
| } |
| |
| void TouchObserverHUD::Remove() { |
| root_window_->RemovePreTargetHandler(this); |
| |
| RootWindowController* controller = GetRootWindowController(root_window_); |
| UnsetHudForRootWindowController(controller); |
| |
| widget_->CloseNow(); |
| } |
| |
| void TouchObserverHUD::OnTouchEvent(ui::TouchEvent* /*event*/) { |
| } |
| |
| void TouchObserverHUD::OnWidgetDestroying(views::Widget* widget) { |
| DCHECK_EQ(widget, widget_); |
| delete this; |
| } |
| |
| void TouchObserverHUD::OnDisplayAdded(const gfx::Display& new_display) {} |
| |
| void TouchObserverHUD::OnDisplayRemoved(const gfx::Display& old_display) { |
| if (old_display.id() != display_id_) |
| return; |
| widget_->CloseNow(); |
| } |
| |
| void TouchObserverHUD::OnDisplayMetricsChanged(const gfx::Display& display, |
| uint32_t metrics) { |
| if (display.id() != display_id_ || !(metrics & DISPLAY_METRIC_BOUNDS)) |
| return; |
| |
| widget_->SetSize(display.size()); |
| } |
| |
| #if defined(OS_CHROMEOS) |
| void TouchObserverHUD::OnDisplayModeChanged( |
| const ui::DisplayConfigurator::DisplayStateList& outputs) { |
| // Clear touch HUD for any change in display mode (single, dual extended, dual |
| // mirrored, ...). |
| Clear(); |
| } |
| #endif // defined(OS_CHROMEOS) |
| |
| void TouchObserverHUD::OnDisplaysInitialized() { |
| OnDisplayConfigurationChanged(); |
| } |
| |
| void TouchObserverHUD::OnDisplayConfigurationChanging() { |
| if (!root_window_) |
| return; |
| |
| root_window_->RemovePreTargetHandler(this); |
| |
| RootWindowController* controller = GetRootWindowController(root_window_); |
| UnsetHudForRootWindowController(controller); |
| |
| views::Widget::ReparentNativeView( |
| widget_->GetNativeView(), |
| Shell::GetContainer(root_window_, |
| kShellWindowId_UnparentedControlContainer)); |
| |
| root_window_ = NULL; |
| } |
| |
| void TouchObserverHUD::OnDisplayConfigurationChanged() { |
| if (root_window_) |
| return; |
| |
| root_window_ = Shell::GetInstance()->display_controller()-> |
| GetRootWindowForDisplayId(display_id_); |
| |
| views::Widget::ReparentNativeView( |
| widget_->GetNativeView(), |
| Shell::GetContainer(root_window_, kShellWindowId_OverlayContainer)); |
| |
| RootWindowController* controller = GetRootWindowController(root_window_); |
| SetHudForRootWindowController(controller); |
| |
| root_window_->AddPreTargetHandler(this); |
| } |
| |
| } // namespace ash |