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