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