// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "ash/events/event_rewriter_controller_impl.h" #include #include "ash/accessibility/sticky_keys/sticky_keys_controller.h" #include "ash/display/mirror_window_controller.h" #include "ash/display/privacy_screen_controller.h" #include "ash/display/window_tree_host_manager.h" #include "ash/events/accessibility_event_rewriter.h" #include "ash/events/keyboard_driven_event_rewriter.h" #include "ash/public/cpp/accessibility_event_rewriter_delegate.h" #include "ash/shell.h" #include "base/command_line.h" #include "ui/accessibility/accessibility_switches.h" #include "ui/aura/env.h" #include "ui/aura/window_tree_host.h" #include "ui/events/event_sink.h" #include "ui/events/event_source.h" namespace ash { // static EventRewriterController* EventRewriterController::Get() { return Shell::HasInstance() ? Shell::Get()->event_rewriter_controller() : nullptr; } EventRewriterControllerImpl::EventRewriterControllerImpl() { // Add the controller as an observer for new root windows. aura::Env::GetInstance()->AddObserver(this); } EventRewriterControllerImpl::~EventRewriterControllerImpl() { aura::Env::GetInstance()->RemoveObserver(this); // Remove the rewriters from every root window EventSource and destroy them. for (const auto& rewriter : rewriters_) { for (auto* window : Shell::GetAllRootWindows()) window->GetHost()->GetEventSource()->RemoveEventRewriter(rewriter.get()); } rewriters_.clear(); } void EventRewriterControllerImpl::Initialize( ui::EventRewriterChromeOS::Delegate* event_rewriter_delegate, AccessibilityEventRewriterDelegate* accessibility_event_rewriter_delegate) { std::unique_ptr keyboard_driven_event_rewriter = std::make_unique(); keyboard_driven_event_rewriter_ = keyboard_driven_event_rewriter.get(); bool privacy_screen_supported = false; if (Shell::Get()->privacy_screen_controller() && Shell::Get()->privacy_screen_controller()->IsSupported()) { privacy_screen_supported = true; } std::unique_ptr event_rewriter_chromeos = std::make_unique( event_rewriter_delegate, Shell::Get()->sticky_keys_controller(), privacy_screen_supported); event_rewriter_chromeos_ = event_rewriter_chromeos.get(); std::unique_ptr accessibility_event_rewriter = std::make_unique( event_rewriter_chromeos.get(), accessibility_event_rewriter_delegate); accessibility_event_rewriter_ = accessibility_event_rewriter.get(); // EventRewriters are notified in the order they are added. AddEventRewriter(std::move(accessibility_event_rewriter)); AddEventRewriter(std::move(keyboard_driven_event_rewriter)); AddEventRewriter(std::move(event_rewriter_chromeos)); } void EventRewriterControllerImpl::AddEventRewriter( std::unique_ptr rewriter) { // Add the rewriters to each existing root window EventSource. for (auto* window : Shell::GetAllRootWindows()) window->GetHost()->GetEventSource()->AddEventRewriter(rewriter.get()); // In case there are any mirroring displays, their hosts' EventSources won't // be included above. const auto* mirror_window_controller = Shell::Get()->window_tree_host_manager()->mirror_window_controller(); for (auto* window : mirror_window_controller->GetAllRootWindows()) window->GetHost()->GetEventSource()->AddEventRewriter(rewriter.get()); rewriters_.push_back(std::move(rewriter)); } void EventRewriterControllerImpl::SetKeyboardDrivenEventRewriterEnabled( bool enabled) { keyboard_driven_event_rewriter_->set_enabled(enabled); } void EventRewriterControllerImpl::SetArrowToTabRewritingEnabled(bool enabled) { keyboard_driven_event_rewriter_->set_arrow_to_tab_rewriting_enabled(enabled); } void EventRewriterControllerImpl::OnUnhandledSpokenFeedbackEvent( std::unique_ptr event) { accessibility_event_rewriter_->OnUnhandledSpokenFeedbackEvent( std::move(event)); } void EventRewriterControllerImpl::CaptureAllKeysForSpokenFeedback( bool capture) { accessibility_event_rewriter_->set_chromevox_capture_all_keys(capture); } void EventRewriterControllerImpl::SetSendMouseEvents(bool value) { accessibility_event_rewriter_->set_send_mouse_events(value); } void EventRewriterControllerImpl::SetAltDownRemappingEnabled(bool enabled) { if (event_rewriter_chromeos_) event_rewriter_chromeos_->set_alt_down_remapping_enabled(enabled); } void EventRewriterControllerImpl::OnHostInitialized( aura::WindowTreeHost* host) { for (const auto& rewriter : rewriters_) host->GetEventSource()->AddEventRewriter(rewriter.get()); } } // namespace ash