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