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 5#include "chrome/browser/chromeos/events/event_rewriter_controller.h" 6 7#include "ash/shell.h" 8#include "ui/aura/env.h" 9#include "ui/aura/window_tree_host.h" 10#include "ui/events/event_source.h" 11 12namespace chromeos { 13 14EventRewriterController::EventRewriterController() : initialized_(false) { 15 // Add the controller as an observer for new root windows. 16 aura::Env::GetInstance()->AddObserver(this); 17} 18 19EventRewriterController::~EventRewriterController() { 20 aura::Env::GetInstance()->RemoveObserver(this); 21 // Remove the rewriters from every root window EventSource and destroy them. 22 for (EventRewriters::iterator rewriter_iter = rewriters_.begin(); 23 rewriter_iter != rewriters_.end(); 24 ++rewriter_iter) { 25 aura::Window::Windows windows = ash::Shell::GetAllRootWindows(); 26 for (aura::Window::Windows::iterator window_iter = windows.begin(); 27 window_iter != windows.end(); 28 ++window_iter) { 29 (*window_iter)->GetHost()->GetEventSource()->RemoveEventRewriter( 30 *rewriter_iter); 31 } 32 } 33 rewriters_.clear(); 34} 35 36void EventRewriterController::AddEventRewriter( 37 scoped_ptr<ui::EventRewriter> rewriter) { 38 DCHECK(!initialized_); 39 rewriters_.push_back(rewriter.release()); 40} 41 42void EventRewriterController::Init() { 43 DCHECK(!initialized_); 44 initialized_ = true; 45 // Add the rewriters to each existing root window EventSource. 46 aura::Window::Windows windows = ash::Shell::GetAllRootWindows(); 47 for (aura::Window::Windows::iterator it = windows.begin(); 48 it != windows.end(); 49 ++it) { 50 AddToEventSource((*it)->GetHost()->GetEventSource()); 51 } 52} 53 54void EventRewriterController::OnHostInitialized(aura::WindowTreeHost* host) { 55 if (initialized_) 56 AddToEventSource(host->GetEventSource()); 57} 58 59void EventRewriterController::AddToEventSource(ui::EventSource* source) { 60 DCHECK(source); 61 for (EventRewriters::iterator it = rewriters_.begin(); it != rewriters_.end(); 62 ++it) { 63 source->AddEventRewriter(*it); 64 } 65} 66 67} // namespace chromeos 68