15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#ifndef UI_WM_PUBLIC_DISPATCHER_CLIENT_H_
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define UI_WM_PUBLIC_DISPATCHER_CLIENT_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/callback.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/macros.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_pump_dispatcher.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/aura_export.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace aura {
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class Window;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace client {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class DispatcherClient;
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// A base::RunLoop like object for running a nested message-loop with a
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// specified DispatcherClient and a MessagePumpDispatcher.
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class AURA_EXPORT DispatcherRunLoop {
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DispatcherRunLoop(DispatcherClient* client,
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    base::MessagePumpDispatcher* dispatcher);
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ~DispatcherRunLoop();
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void Run();
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::Closure QuitClosure();
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void Quit();
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::Closure run_closure_;
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::Closure quit_closure_;
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DispatcherRunLoop);
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An interface implemented by an object which handles nested dispatchers.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AURA_EXPORT DispatcherClient {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~DispatcherClient() {}
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected:
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  friend class DispatcherRunLoop;
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void PrepareNestedLoopClosures(
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::MessagePumpDispatcher* dispatcher,
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Closure* run_closure,
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Closure* quit_closure) = 0;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)AURA_EXPORT void SetDispatcherClient(Window* root_window,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     DispatcherClient* client);
541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)AURA_EXPORT DispatcherClient* GetDispatcherClient(Window* root_window);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace client
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace aura
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif  // UI_WM_PUBLIC_DISPATCHER_CLIENT_H_
60