touch_observer_hud.cc 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. #include "ash/touch/touch_observer_hud.h"
  5. #include "ash/public/cpp/shell_window_ids.h"
  6. #include "ash/root_window_controller.h"
  7. #include "ash/root_window_settings.h"
  8. #include "ash/shell.h"
  9. #include "ui/aura/window_event_dispatcher.h"
  10. #include "ui/display/display.h"
  11. #include "ui/gfx/geometry/rect.h"
  12. #include "ui/gfx/geometry/size.h"
  13. #include "ui/views/widget/widget.h"
  14. namespace ash {
  15. TouchObserverHud::TouchObserverHud(aura::Window* initial_root,
  16. const std::string& widget_name)
  17. : display_id_(GetRootWindowSettings(initial_root)->display_id),
  18. root_window_(initial_root),
  19. widget_(new views::Widget()) {
  20. const display::Display& display =
  21. Shell::Get()->display_manager()->GetDisplayForId(display_id_);
  22. auto content = std::make_unique<views::View>();
  23. const gfx::Size& display_size = display.size();
  24. content->SetSize(display_size);
  25. views::Widget::InitParams params(
  26. views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
  27. params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
  28. params.activatable = views::Widget::InitParams::Activatable::kNo;
  29. params.accept_events = false;
  30. params.bounds = display.bounds();
  31. params.parent =
  32. Shell::GetContainer(root_window_, kShellWindowId_OverlayContainer);
  33. params.name = widget_name;
  34. widget_->Init(std::move(params));
  35. widget_->SetContentsView(std::move(content));
  36. widget_->StackAtTop();
  37. widget_->Show();
  38. widget_->AddObserver(this);
  39. // Observe changes in display size and mode to update touch HUD.
  40. Shell::Get()->display_configurator()->AddObserver(this);
  41. Shell::Get()->window_tree_host_manager()->AddObserver(this);
  42. root_window_->AddPreTargetHandler(this);
  43. }
  44. TouchObserverHud::~TouchObserverHud() {
  45. Shell::Get()->window_tree_host_manager()->RemoveObserver(this);
  46. Shell::Get()->display_configurator()->RemoveObserver(this);
  47. widget_->RemoveObserver(this);
  48. CHECK(!views::WidgetObserver::IsInObserverList());
  49. }
  50. void TouchObserverHud::Remove() {
  51. root_window_->RemovePreTargetHandler(this);
  52. RootWindowController* controller =
  53. RootWindowController::ForWindow(root_window_);
  54. UnsetHudForRootWindowController(controller);
  55. widget_->CloseNow();
  56. }
  57. void TouchObserverHud::OnWidgetDestroying(views::Widget* widget) {
  58. DCHECK_EQ(widget, widget_);
  59. delete this;
  60. }
  61. void TouchObserverHud::OnDisplayRemoved(const display::Display& old_display) {
  62. if (old_display.id() != display_id_)
  63. return;
  64. widget_->CloseNow();
  65. }
  66. void TouchObserverHud::OnDisplayMetricsChanged(const display::Display& display,
  67. uint32_t metrics) {
  68. if (display.id() != display_id_ || !(metrics & DISPLAY_METRIC_BOUNDS))
  69. return;
  70. widget_->SetSize(display.size());
  71. }
  72. void TouchObserverHud::OnDisplayModeChanged(
  73. const display::DisplayConfigurator::DisplayStateList& outputs) {
  74. // Clear touch HUD for any change in display mode (single, dual extended, dual
  75. // mirrored, ...).
  76. Clear();
  77. }
  78. void TouchObserverHud::OnDisplaysInitialized() {
  79. OnDisplayConfigurationChanged();
  80. }
  81. void TouchObserverHud::OnDisplayConfigurationChanging() {
  82. if (!root_window_)
  83. return;
  84. root_window_->RemovePreTargetHandler(this);
  85. RootWindowController* controller =
  86. RootWindowController::ForWindow(root_window_);
  87. UnsetHudForRootWindowController(controller);
  88. views::Widget::ReparentNativeView(
  89. widget_->GetNativeView(),
  90. Shell::GetContainer(root_window_, kShellWindowId_UnparentedContainer));
  91. root_window_ = NULL;
  92. }
  93. void TouchObserverHud::OnDisplayConfigurationChanged() {
  94. if (root_window_)
  95. return;
  96. root_window_ = Shell::GetRootWindowForDisplayId(display_id_);
  97. views::Widget::ReparentNativeView(
  98. widget_->GetNativeView(),
  99. Shell::GetContainer(root_window_, kShellWindowId_OverlayContainer));
  100. RootWindowController* controller =
  101. RootWindowController::ForWindow(root_window_);
  102. SetHudForRootWindowController(controller);
  103. root_window_->AddPreTargetHandler(this);
  104. }
  105. } // namespace ash