15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/touch/touch_observer_hud.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/root_window_controller.h" 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ash/root_window_settings.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/shell.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_window_ids.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/aura/root_window.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TouchObserverHUD::TouchObserverHUD(aura::Window* initial_root) 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : display_id_(GetRootWindowSettings(initial_root)->display_id), 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_window_(initial_root), 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch widget_(NULL) { 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Display& display = 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()->display_manager()->GetDisplayForId(display_id_); 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View* content = new views::View; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Size& display_size = display.size(); 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content->SetSize(display_size); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_ = new views::Widget(); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget::InitParams 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params(views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.can_activate = false; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.accept_events = false; 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.bounds = display.bounds(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.parent = Shell::GetContainer( 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_window_, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::kShellWindowId_OverlayContainer); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->Init(params); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->SetContentsView(content); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->StackAtTop(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->Show(); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->AddObserver(this); 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Observe changes in display size and mode to update touch HUD. 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetScreen()->AddObserver(this); 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()->output_configurator()->AddObserver(this); 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // defined(OS_CHROMEOS) 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()->display_controller()->AddObserver(this); 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_window_->AddPreTargetHandler(this); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchObserverHUD::~TouchObserverHUD() { 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()->display_controller()->RemoveObserver(this); 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()->output_configurator()->RemoveObserver(this); 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // defined(OS_CHROMEOS) 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetScreen()->RemoveObserver(this); 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget_->RemoveObserver(this); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TouchObserverHUD::Clear() { 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TouchObserverHUD::Remove() { 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch root_window_->RemovePreTargetHandler(this); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RootWindowController* controller = GetRootWindowController(root_window_); 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UnsetHudForRootWindowController(controller); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch widget_->CloseNow(); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TouchObserverHUD::OnTouchEvent(ui::TouchEvent* /*event*/) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TouchObserverHUD::OnWidgetDestroying(views::Widget* widget) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(widget, widget_); 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delete this; 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchObserverHUD::OnDisplayBoundsChanged(const gfx::Display& display) { 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (display.id() != display_id_) 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch widget_->SetSize(display.size()); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchObserverHUD::OnDisplayAdded(const gfx::Display& new_display) {} 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchObserverHUD::OnDisplayRemoved(const gfx::Display& old_display) { 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (old_display.id() != display_id_) 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget_->CloseNow(); 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) 1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void TouchObserverHUD::OnDisplayModeChanged( 1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<chromeos::OutputConfigurator::OutputSnapshot>& outputs) { 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Clear touch HUD for any change in display mode (single, dual extended, dual 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // mirrored, ...). 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Clear(); 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // defined(OS_CHROMEOS) 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchObserverHUD::OnDisplayConfigurationChanging() { 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!root_window_) 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_window_->RemovePreTargetHandler(this); 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RootWindowController* controller = GetRootWindowController(root_window_); 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UnsetHudForRootWindowController(controller); 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::Widget::ReparentNativeView( 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget_->GetNativeView(), 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetContainer(root_window_, 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal::kShellWindowId_UnparentedControlContainer)); 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_window_ = NULL; 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchObserverHUD::OnDisplayConfigurationChanged() { 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (root_window_) 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_window_ = Shell::GetInstance()->display_controller()-> 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetRootWindowForDisplayId(display_id_); 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::Widget::ReparentNativeView( 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget_->GetNativeView(), 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetContainer(root_window_, 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) internal::kShellWindowId_OverlayContainer)); 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RootWindowController* controller = GetRootWindowController(root_window_); 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetHudForRootWindowController(controller); 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_window_->AddPreTargetHandler(this); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 151