Home | History | Annotate | Download | only in touch
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "ash/touch/touch_observer_hud.h"
      6 
      7 #include "ash/root_window_controller.h"
      8 #include "ash/root_window_settings.h"
      9 #include "ash/shell.h"
     10 #include "ash/shell_window_ids.h"
     11 #include "ui/aura/root_window.h"
     12 #include "ui/gfx/display.h"
     13 #include "ui/gfx/rect.h"
     14 #include "ui/gfx/screen.h"
     15 #include "ui/gfx/size.h"
     16 #include "ui/views/widget/widget.h"
     17 
     18 namespace ash {
     19 namespace internal {
     20 
     21 TouchObserverHUD::TouchObserverHUD(aura::Window* initial_root)
     22     : display_id_(GetRootWindowSettings(initial_root)->display_id),
     23       root_window_(initial_root),
     24       widget_(NULL) {
     25   const gfx::Display& display =
     26       Shell::GetInstance()->display_manager()->GetDisplayForId(display_id_);
     27 
     28   views::View* content = new views::View;
     29 
     30   const gfx::Size& display_size = display.size();
     31   content->SetSize(display_size);
     32 
     33   widget_ = new views::Widget();
     34   views::Widget::InitParams
     35       params(views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
     36   params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
     37   params.can_activate = false;
     38   params.accept_events = false;
     39   params.bounds = display.bounds();
     40   params.parent = Shell::GetContainer(
     41       root_window_,
     42       internal::kShellWindowId_OverlayContainer);
     43   widget_->Init(params);
     44   widget_->SetContentsView(content);
     45   widget_->StackAtTop();
     46   widget_->Show();
     47 
     48   widget_->AddObserver(this);
     49 
     50   // Observe changes in display size and mode to update touch HUD.
     51   Shell::GetScreen()->AddObserver(this);
     52 #if defined(OS_CHROMEOS)
     53   Shell::GetInstance()->output_configurator()->AddObserver(this);
     54 #endif  // defined(OS_CHROMEOS)
     55 
     56   Shell::GetInstance()->display_controller()->AddObserver(this);
     57   root_window_->AddPreTargetHandler(this);
     58 }
     59 
     60 TouchObserverHUD::~TouchObserverHUD() {
     61   Shell::GetInstance()->display_controller()->RemoveObserver(this);
     62 
     63 #if defined(OS_CHROMEOS)
     64   Shell::GetInstance()->output_configurator()->RemoveObserver(this);
     65 #endif  // defined(OS_CHROMEOS)
     66   Shell::GetScreen()->RemoveObserver(this);
     67 
     68   widget_->RemoveObserver(this);
     69 }
     70 
     71 void TouchObserverHUD::Clear() {
     72 }
     73 
     74 void TouchObserverHUD::Remove() {
     75   root_window_->RemovePreTargetHandler(this);
     76 
     77   RootWindowController* controller = GetRootWindowController(root_window_);
     78   UnsetHudForRootWindowController(controller);
     79 
     80   widget_->CloseNow();
     81 }
     82 
     83 void TouchObserverHUD::OnTouchEvent(ui::TouchEvent* /*event*/) {
     84 }
     85 
     86 void TouchObserverHUD::OnWidgetDestroying(views::Widget* widget) {
     87   DCHECK_EQ(widget, widget_);
     88   delete this;
     89 }
     90 
     91 void TouchObserverHUD::OnDisplayBoundsChanged(const gfx::Display& display) {
     92   if (display.id() != display_id_)
     93     return;
     94   widget_->SetSize(display.size());
     95 }
     96 
     97 void TouchObserverHUD::OnDisplayAdded(const gfx::Display& new_display) {}
     98 
     99 void TouchObserverHUD::OnDisplayRemoved(const gfx::Display& old_display) {
    100   if (old_display.id() != display_id_)
    101     return;
    102   widget_->CloseNow();
    103 }
    104 
    105 #if defined(OS_CHROMEOS)
    106 void TouchObserverHUD::OnDisplayModeChanged(
    107     const std::vector<chromeos::OutputConfigurator::OutputSnapshot>& outputs) {
    108   // Clear touch HUD for any change in display mode (single, dual extended, dual
    109   // mirrored, ...).
    110   Clear();
    111 }
    112 #endif  // defined(OS_CHROMEOS)
    113 
    114 void TouchObserverHUD::OnDisplayConfigurationChanging() {
    115   if (!root_window_)
    116     return;
    117 
    118   root_window_->RemovePreTargetHandler(this);
    119 
    120   RootWindowController* controller = GetRootWindowController(root_window_);
    121   UnsetHudForRootWindowController(controller);
    122 
    123   views::Widget::ReparentNativeView(
    124       widget_->GetNativeView(),
    125       Shell::GetContainer(root_window_,
    126                           internal::kShellWindowId_UnparentedControlContainer));
    127 
    128   root_window_ = NULL;
    129 }
    130 
    131 void TouchObserverHUD::OnDisplayConfigurationChanged() {
    132   if (root_window_)
    133     return;
    134 
    135   root_window_ = Shell::GetInstance()->display_controller()->
    136       GetRootWindowForDisplayId(display_id_);
    137 
    138   views::Widget::ReparentNativeView(
    139       widget_->GetNativeView(),
    140       Shell::GetContainer(root_window_,
    141                           internal::kShellWindowId_OverlayContainer));
    142 
    143   RootWindowController* controller = GetRootWindowController(root_window_);
    144   SetHudForRootWindowController(controller);
    145 
    146   root_window_->AddPreTargetHandler(this);
    147 }
    148 
    149 }  // namespace internal
    150 }  // namespace ash
    151