// 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