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 "ui/wm/core/nested_accelerator_controller.h" 6 7#include "base/auto_reset.h" 8#include "base/bind.h" 9#include "base/run_loop.h" 10#include "ui/wm/core/nested_accelerator_delegate.h" 11#include "ui/wm/core/nested_accelerator_dispatcher.h" 12 13namespace wm { 14 15NestedAcceleratorController::NestedAcceleratorController( 16 NestedAcceleratorDelegate* delegate) 17 : dispatcher_delegate_(delegate) { 18 DCHECK(delegate); 19} 20 21NestedAcceleratorController::~NestedAcceleratorController() { 22} 23 24void NestedAcceleratorController::PrepareNestedLoopClosures( 25 base::MessagePumpDispatcher* nested_dispatcher, 26 base::Closure* run_closure, 27 base::Closure* quit_closure) { 28 scoped_ptr<NestedAcceleratorDispatcher> old_accelerator_dispatcher = 29 accelerator_dispatcher_.Pass(); 30 accelerator_dispatcher_ = NestedAcceleratorDispatcher::Create( 31 dispatcher_delegate_.get(), nested_dispatcher); 32 33 scoped_ptr<base::RunLoop> run_loop = accelerator_dispatcher_->CreateRunLoop(); 34 *quit_closure = 35 base::Bind(&NestedAcceleratorController::QuitNestedMessageLoop, 36 base::Unretained(this), 37 run_loop->QuitClosure()); 38 *run_closure = base::Bind(&NestedAcceleratorController::RunNestedMessageLoop, 39 base::Unretained(this), 40 base::Passed(&run_loop), 41 base::Passed(&old_accelerator_dispatcher)); 42} 43 44void NestedAcceleratorController::RunNestedMessageLoop( 45 scoped_ptr<base::RunLoop> run_loop, 46 scoped_ptr<NestedAcceleratorDispatcher> old_accelerator_dispatcher) { 47 run_loop->Run(); 48 accelerator_dispatcher_ = old_accelerator_dispatcher.Pass(); 49} 50 51void NestedAcceleratorController::QuitNestedMessageLoop( 52 const base::Closure& quit_runloop) { 53 quit_runloop.Run(); 54 accelerator_dispatcher_.reset(); 55} 56 57} // namespace wm 58