| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ui/wm/public/dispatcher_client.h" |
| |
| #include "base/callback.h" |
| #include "ui/aura/window.h" |
| #include "ui/aura/window_property.h" |
| |
| DECLARE_WINDOW_PROPERTY_TYPE(aura::client::DispatcherClient*); |
| |
| namespace aura { |
| namespace client { |
| |
| DispatcherRunLoop::DispatcherRunLoop(DispatcherClient* client, |
| base::MessagePumpDispatcher* dispatcher) { |
| client->PrepareNestedLoopClosures(dispatcher, &run_closure_, &quit_closure_); |
| } |
| |
| DispatcherRunLoop::~DispatcherRunLoop() { |
| } |
| |
| void DispatcherRunLoop::Run() { |
| base::MessageLoopForUI* loop = base::MessageLoopForUI::current(); |
| base::MessageLoopForUI::ScopedNestableTaskAllower allow_nested(loop); |
| run_closure_.Run(); |
| } |
| |
| base::Closure DispatcherRunLoop::QuitClosure() { |
| return quit_closure_; |
| } |
| |
| void DispatcherRunLoop::Quit() { |
| quit_closure_.Run(); |
| } |
| |
| DEFINE_LOCAL_WINDOW_PROPERTY_KEY(DispatcherClient*, kDispatcherClientKey, NULL); |
| |
| void SetDispatcherClient(Window* root_window, DispatcherClient* client) { |
| DCHECK_EQ(root_window->GetRootWindow(), root_window); |
| root_window->SetProperty(kDispatcherClientKey, client); |
| } |
| |
| DispatcherClient* GetDispatcherClient(Window* root_window) { |
| if (root_window) |
| DCHECK_EQ(root_window->GetRootWindow(), root_window); |
| return root_window ? root_window->GetProperty(kDispatcherClientKey) : NULL; |
| } |
| |
| } // namespace client |
| } // namespace aura |