15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved. 25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be 35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file. 45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/chromeos/events/event_rewriter_controller.h" 65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ash/shell.h" 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/aura/env.h" 95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/aura/window_tree_host.h" 105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/events/event_source.h" 115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace chromeos { 135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuEventRewriterController::EventRewriterController() : initialized_(false) { 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Add the controller as an observer for new root windows. 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) aura::Env::GetInstance()->AddObserver(this); 175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuEventRewriterController::~EventRewriterController() { 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) aura::Env::GetInstance()->RemoveObserver(this); 215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Remove the rewriters from every root window EventSource and destroy them. 225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (EventRewriters::iterator rewriter_iter = rewriters_.begin(); 235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu rewriter_iter != rewriters_.end(); 245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ++rewriter_iter) { 255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu aura::Window::Windows windows = ash::Shell::GetAllRootWindows(); 265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (aura::Window::Windows::iterator window_iter = windows.begin(); 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu window_iter != windows.end(); 285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ++window_iter) { 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu (*window_iter)->GetHost()->GetEventSource()->RemoveEventRewriter( 305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu *rewriter_iter); 315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu rewriters_.clear(); 345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid EventRewriterController::AddEventRewriter( 375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<ui::EventRewriter> rewriter) { 385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(!initialized_); 395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu rewriters_.push_back(rewriter.release()); 405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid EventRewriterController::Init() { 435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(!initialized_); 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu initialized_ = true; 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Add the rewriters to each existing root window EventSource. 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu aura::Window::Windows windows = ash::Shell::GetAllRootWindows(); 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (aura::Window::Windows::iterator it = windows.begin(); 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu it != windows.end(); 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ++it) { 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AddToEventSource((*it)->GetHost()->GetEventSource()); 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid EventRewriterController::OnHostInitialized(aura::WindowTreeHost* host) { 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (initialized_) 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AddToEventSource(host->GetEventSource()); 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid EventRewriterController::AddToEventSource(ui::EventSource* source) { 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(source); 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (EventRewriters::iterator it = rewriters_.begin(); it != rewriters_.end(); 625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ++it) { 635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu source->AddEventRewriter(*it); 645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} // namespace chromeos 68