event_rewriter_controller_impl.cc 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. // Copyright 2014 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/events/event_rewriter_controller_impl.h"
  5. #include <utility>
  6. #include "ash/accessibility/sticky_keys/sticky_keys_controller.h"
  7. #include "ash/display/mirror_window_controller.h"
  8. #include "ash/display/privacy_screen_controller.h"
  9. #include "ash/display/window_tree_host_manager.h"
  10. #include "ash/events/accessibility_event_rewriter.h"
  11. #include "ash/events/keyboard_driven_event_rewriter.h"
  12. #include "ash/public/cpp/accessibility_event_rewriter_delegate.h"
  13. #include "ash/shell.h"
  14. #include "base/command_line.h"
  15. #include "ui/accessibility/accessibility_switches.h"
  16. #include "ui/aura/env.h"
  17. #include "ui/aura/window_tree_host.h"
  18. #include "ui/events/event_sink.h"
  19. #include "ui/events/event_source.h"
  20. namespace ash {
  21. // static
  22. EventRewriterController* EventRewriterController::Get() {
  23. return Shell::HasInstance() ? Shell::Get()->event_rewriter_controller()
  24. : nullptr;
  25. }
  26. EventRewriterControllerImpl::EventRewriterControllerImpl() {
  27. // Add the controller as an observer for new root windows.
  28. aura::Env::GetInstance()->AddObserver(this);
  29. }
  30. EventRewriterControllerImpl::~EventRewriterControllerImpl() {
  31. aura::Env::GetInstance()->RemoveObserver(this);
  32. // Remove the rewriters from every root window EventSource and destroy them.
  33. for (const auto& rewriter : rewriters_) {
  34. for (auto* window : Shell::GetAllRootWindows())
  35. window->GetHost()->GetEventSource()->RemoveEventRewriter(rewriter.get());
  36. }
  37. rewriters_.clear();
  38. }
  39. void EventRewriterControllerImpl::Initialize(
  40. ui::EventRewriterChromeOS::Delegate* event_rewriter_delegate,
  41. AccessibilityEventRewriterDelegate* accessibility_event_rewriter_delegate) {
  42. std::unique_ptr<KeyboardDrivenEventRewriter> keyboard_driven_event_rewriter =
  43. std::make_unique<KeyboardDrivenEventRewriter>();
  44. keyboard_driven_event_rewriter_ = keyboard_driven_event_rewriter.get();
  45. bool privacy_screen_supported = false;
  46. if (Shell::Get()->privacy_screen_controller() &&
  47. Shell::Get()->privacy_screen_controller()->IsSupported()) {
  48. privacy_screen_supported = true;
  49. }
  50. std::unique_ptr<ui::EventRewriterChromeOS> event_rewriter_chromeos =
  51. std::make_unique<ui::EventRewriterChromeOS>(
  52. event_rewriter_delegate, Shell::Get()->sticky_keys_controller(),
  53. privacy_screen_supported);
  54. event_rewriter_chromeos_ = event_rewriter_chromeos.get();
  55. std::unique_ptr<AccessibilityEventRewriter> accessibility_event_rewriter =
  56. std::make_unique<AccessibilityEventRewriter>(
  57. event_rewriter_chromeos.get(), accessibility_event_rewriter_delegate);
  58. accessibility_event_rewriter_ = accessibility_event_rewriter.get();
  59. // EventRewriters are notified in the order they are added.
  60. AddEventRewriter(std::move(accessibility_event_rewriter));
  61. AddEventRewriter(std::move(keyboard_driven_event_rewriter));
  62. AddEventRewriter(std::move(event_rewriter_chromeos));
  63. }
  64. void EventRewriterControllerImpl::AddEventRewriter(
  65. std::unique_ptr<ui::EventRewriter> rewriter) {
  66. // Add the rewriters to each existing root window EventSource.
  67. for (auto* window : Shell::GetAllRootWindows())
  68. window->GetHost()->GetEventSource()->AddEventRewriter(rewriter.get());
  69. // In case there are any mirroring displays, their hosts' EventSources won't
  70. // be included above.
  71. const auto* mirror_window_controller =
  72. Shell::Get()->window_tree_host_manager()->mirror_window_controller();
  73. for (auto* window : mirror_window_controller->GetAllRootWindows())
  74. window->GetHost()->GetEventSource()->AddEventRewriter(rewriter.get());
  75. rewriters_.push_back(std::move(rewriter));
  76. }
  77. void EventRewriterControllerImpl::SetKeyboardDrivenEventRewriterEnabled(
  78. bool enabled) {
  79. keyboard_driven_event_rewriter_->set_enabled(enabled);
  80. }
  81. void EventRewriterControllerImpl::SetArrowToTabRewritingEnabled(bool enabled) {
  82. keyboard_driven_event_rewriter_->set_arrow_to_tab_rewriting_enabled(enabled);
  83. }
  84. void EventRewriterControllerImpl::OnUnhandledSpokenFeedbackEvent(
  85. std::unique_ptr<ui::Event> event) {
  86. accessibility_event_rewriter_->OnUnhandledSpokenFeedbackEvent(
  87. std::move(event));
  88. }
  89. void EventRewriterControllerImpl::CaptureAllKeysForSpokenFeedback(
  90. bool capture) {
  91. accessibility_event_rewriter_->set_chromevox_capture_all_keys(capture);
  92. }
  93. void EventRewriterControllerImpl::SetSendMouseEvents(bool value) {
  94. accessibility_event_rewriter_->set_send_mouse_events(value);
  95. }
  96. void EventRewriterControllerImpl::SetAltDownRemappingEnabled(bool enabled) {
  97. if (event_rewriter_chromeos_)
  98. event_rewriter_chromeos_->set_alt_down_remapping_enabled(enabled);
  99. }
  100. void EventRewriterControllerImpl::OnHostInitialized(
  101. aura::WindowTreeHost* host) {
  102. for (const auto& rewriter : rewriters_)
  103. host->GetEventSource()->AddEventRewriter(rewriter.get());
  104. }
  105. } // namespace ash