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" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.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) 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TouchObserverHUD::TouchObserverHUD(aura::Window* initial_root) 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : display_id_(GetRootWindowSettings(initial_root)->display_id), 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_window_(initial_root), 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch widget_(NULL) { 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Display& display = 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()->display_manager()->GetDisplayForId(display_id_); 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View* content = new views::View; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Size& display_size = display.size(); 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content->SetSize(display_size); 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_ = new views::Widget(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget::InitParams 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params(views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) params.activatable = views::Widget::InitParams::ACTIVATABLE_NO; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.accept_events = false; 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.bounds = display.bounds(); 39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch params.parent = 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Shell::GetContainer(root_window_, kShellWindowId_OverlayContainer); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->Init(params); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->SetContentsView(content); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->StackAtTop(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->Show(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->AddObserver(this); 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Observe changes in display size and mode to update touch HUD. 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetScreen()->AddObserver(this); 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Shell::GetInstance()->display_configurator()->AddObserver(this); 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // defined(OS_CHROMEOS) 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()->display_controller()->AddObserver(this); 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_window_->AddPreTargetHandler(this); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchObserverHUD::~TouchObserverHUD() { 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()->display_controller()->RemoveObserver(this); 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) 62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Shell::GetInstance()->display_configurator()->RemoveObserver(this); 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // defined(OS_CHROMEOS) 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetScreen()->RemoveObserver(this); 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget_->RemoveObserver(this); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TouchObserverHUD::Clear() { 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TouchObserverHUD::Remove() { 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch root_window_->RemovePreTargetHandler(this); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RootWindowController* controller = GetRootWindowController(root_window_); 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UnsetHudForRootWindowController(controller); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch widget_->CloseNow(); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid TouchObserverHUD::OnTouchEvent(ui::TouchEvent* /*event*/) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TouchObserverHUD::OnWidgetDestroying(views::Widget* widget) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(widget, widget_); 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delete this; 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchObserverHUD::OnDisplayAdded(const gfx::Display& new_display) {} 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchObserverHUD::OnDisplayRemoved(const gfx::Display& old_display) { 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (old_display.id() != display_id_) 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget_->CloseNow(); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void TouchObserverHUD::OnDisplayMetricsChanged(const gfx::Display& display, 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) uint32_t metrics) { 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (display.id() != display_id_ || !(metrics & DISPLAY_METRIC_BOUNDS)) 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) widget_->SetSize(display.size()); 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) 1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void TouchObserverHUD::OnDisplayModeChanged( 107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const ui::DisplayConfigurator::DisplayStateList& 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) 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void TouchObserverHUD::OnDisplaysInitialized() { 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OnDisplayConfigurationChanged(); 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchObserverHUD::OnDisplayConfigurationChanging() { 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!root_window_) 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_window_->RemovePreTargetHandler(this); 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RootWindowController* controller = GetRootWindowController(root_window_); 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UnsetHudForRootWindowController(controller); 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::Widget::ReparentNativeView( 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget_->GetNativeView(), 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetContainer(root_window_, 130c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch kShellWindowId_UnparentedControlContainer)); 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_window_ = NULL; 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchObserverHUD::OnDisplayConfigurationChanged() { 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (root_window_) 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_window_ = Shell::GetInstance()->display_controller()-> 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetRootWindowForDisplayId(display_id_); 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::Widget::ReparentNativeView( 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget_->GetNativeView(), 144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Shell::GetContainer(root_window_, kShellWindowId_OverlayContainer)); 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RootWindowController* controller = GetRootWindowController(root_window_); 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetHudForRootWindowController(controller); 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_window_->AddPreTargetHandler(this); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 153