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/window_event_dispatcher.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 
     20 TouchObserverHUD::TouchObserverHUD(aura::Window* initial_root)
     21     : display_id_(GetRootWindowSettings(initial_root)->display_id),
     22       root_window_(initial_root),
     23       widget_(NULL) {
     24   const gfx::Display& display =
     25       Shell::GetInstance()->display_manager()->GetDisplayForId(display_id_);
     26 
     27   views::View* content = new views::View;
     28 
     29   const gfx::Size& display_size = display.size();
     30   content->SetSize(display_size);
     31 
     32   widget_ = new views::Widget();
     33   views::Widget::InitParams
     34       params(views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
     35   params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
     36   params.activatable = views::Widget::InitParams::ACTIVATABLE_NO;
     37   params.accept_events = false;
     38   params.bounds = display.bounds();
     39   params.parent =
     40       Shell::GetContainer(root_window_, kShellWindowId_OverlayContainer);
     41   widget_->Init(params);
     42   widget_->SetContentsView(content);
     43   widget_->StackAtTop();
     44   widget_->Show();
     45 
     46   widget_->AddObserver(this);
     47 
     48   // Observe changes in display size and mode to update touch HUD.
     49   Shell::GetScreen()->AddObserver(this);
     50 #if defined(OS_CHROMEOS)
     51   Shell::GetInstance()->display_configurator()->AddObserver(this);
     52 #endif  // defined(OS_CHROMEOS)
     53 
     54   Shell::GetInstance()->display_controller()->AddObserver(this);
     55   root_window_->AddPreTargetHandler(this);
     56 }
     57 
     58 TouchObserverHUD::~TouchObserverHUD() {
     59   Shell::GetInstance()->display_controller()->RemoveObserver(this);
     60 
     61 #if defined(OS_CHROMEOS)
     62   Shell::GetInstance()->display_configurator()->RemoveObserver(this);
     63 #endif  // defined(OS_CHROMEOS)
     64   Shell::GetScreen()->RemoveObserver(this);
     65 
     66   widget_->RemoveObserver(this);
     67 }
     68 
     69 void TouchObserverHUD::Clear() {
     70 }
     71 
     72 void TouchObserverHUD::Remove() {
     73   root_window_->RemovePreTargetHandler(this);
     74 
     75   RootWindowController* controller = GetRootWindowController(root_window_);
     76   UnsetHudForRootWindowController(controller);
     77 
     78   widget_->CloseNow();
     79 }
     80 
     81 void TouchObserverHUD::OnTouchEvent(ui::TouchEvent* /*event*/) {
     82 }
     83 
     84 void TouchObserverHUD::OnWidgetDestroying(views::Widget* widget) {
     85   DCHECK_EQ(widget, widget_);
     86   delete this;
     87 }
     88 
     89 void TouchObserverHUD::OnDisplayAdded(const gfx::Display& new_display) {}
     90 
     91 void TouchObserverHUD::OnDisplayRemoved(const gfx::Display& old_display) {
     92   if (old_display.id() != display_id_)
     93     return;
     94   widget_->CloseNow();
     95 }
     96 
     97 void TouchObserverHUD::OnDisplayMetricsChanged(const gfx::Display& display,
     98                                                uint32_t metrics) {
     99   if (display.id() != display_id_ || !(metrics & DISPLAY_METRIC_BOUNDS))
    100     return;
    101 
    102   widget_->SetSize(display.size());
    103 }
    104 
    105 #if defined(OS_CHROMEOS)
    106 void TouchObserverHUD::OnDisplayModeChanged(
    107     const ui::DisplayConfigurator::DisplayStateList& 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::OnDisplaysInitialized() {
    115   OnDisplayConfigurationChanged();
    116 }
    117 
    118 void TouchObserverHUD::OnDisplayConfigurationChanging() {
    119   if (!root_window_)
    120     return;
    121 
    122   root_window_->RemovePreTargetHandler(this);
    123 
    124   RootWindowController* controller = GetRootWindowController(root_window_);
    125   UnsetHudForRootWindowController(controller);
    126 
    127   views::Widget::ReparentNativeView(
    128       widget_->GetNativeView(),
    129       Shell::GetContainer(root_window_,
    130                           kShellWindowId_UnparentedControlContainer));
    131 
    132   root_window_ = NULL;
    133 }
    134 
    135 void TouchObserverHUD::OnDisplayConfigurationChanged() {
    136   if (root_window_)
    137     return;
    138 
    139   root_window_ = Shell::GetInstance()->display_controller()->
    140       GetRootWindowForDisplayId(display_id_);
    141 
    142   views::Widget::ReparentNativeView(
    143       widget_->GetNativeView(),
    144       Shell::GetContainer(root_window_, kShellWindowId_OverlayContainer));
    145 
    146   RootWindowController* controller = GetRootWindowController(root_window_);
    147   SetHudForRootWindowController(controller);
    148 
    149   root_window_->AddPreTargetHandler(this);
    150 }
    151 
    152 }  // namespace ash
    153