1// Copyright (c) 2012 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#ifndef BASE_MESSAGE_LOOP_MESSAGE_PUMP_GTK_H_
6#define BASE_MESSAGE_LOOP_MESSAGE_PUMP_GTK_H_
7
8#include "base/message_loop/message_pump_glib.h"
9
10typedef union _GdkEvent GdkEvent;
11typedef struct _XDisplay Display;
12
13namespace base {
14
15// The documentation for this class is in message_pump_glib.h
16class MessagePumpGdkObserver {
17 public:
18  // This method is called before processing a message.
19  virtual void WillProcessEvent(GdkEvent* event) = 0;
20
21  // This method is called after processing a message.
22  virtual void DidProcessEvent(GdkEvent* event) = 0;
23
24 protected:
25  virtual ~MessagePumpGdkObserver() {}
26};
27
28// This class implements a message-pump for dispatching GTK events.
29class BASE_EXPORT MessagePumpGtk : public MessagePumpGlib {
30 public:
31  MessagePumpGtk();
32  virtual ~MessagePumpGtk();
33
34  // Dispatch an available GdkEvent. Essentially this allows a subclass to do
35  // some task before/after calling the default handler (EventDispatcher).
36  void DispatchEvents(GdkEvent* event);
37
38  // Returns default X Display.
39  static Display* GetDefaultXDisplay();
40
41  // Adds an Observer, which will start receiving notifications immediately.
42  void AddObserver(MessagePumpGdkObserver* observer);
43
44  // Removes an Observer.  It is safe to call this method while an Observer is
45  // receiving a notification callback.
46  void RemoveObserver(MessagePumpGdkObserver* observer);
47
48 private:
49  // Invoked from EventDispatcher. Notifies all observers we're about to
50  // process an event.
51  void WillProcessEvent(GdkEvent* event);
52
53  // Invoked from EventDispatcher. Notifies all observers we processed an
54  // event.
55  void DidProcessEvent(GdkEvent* event);
56
57  // Callback prior to gdk dispatching an event.
58  static void EventDispatcher(GdkEvent* event, void* data);
59
60  // List of observers.
61  ObserverList<MessagePumpGdkObserver> observers_;
62
63  DISALLOW_COPY_AND_ASSIGN(MessagePumpGtk);
64};
65
66typedef MessagePumpGtk MessagePumpForUI;
67
68}  // namespace base
69
70#endif  // BASE_MESSAGE_LOOP_MESSAGE_PUMP_GTK_H_
71