diff options
author | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-24 20:10:25 +0000 |
---|---|---|
committer | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-24 20:10:25 +0000 |
commit | 2047ef4d68229d47cba8bf7f2e0465ab31f8b3ce (patch) | |
tree | 86af296c2de9e5ac31c9ed79e21d9d0e4ccda8c4 /base/message_pump_glib.h | |
parent | 86e1db9d9de1ce72ba045bd3755e7a077a1f7fd8 (diff) | |
download | chromium_src-2047ef4d68229d47cba8bf7f2e0465ab31f8b3ce.zip chromium_src-2047ef4d68229d47cba8bf7f2e0465ab31f8b3ce.tar.gz chromium_src-2047ef4d68229d47cba8bf7f2e0465ab31f8b3ce.tar.bz2 |
Refactor the glib message-pump, and use it as the base for a gtk message pump and an X message pump.
The changes:
* Rename MessagePumpGlibX to MessagePumpX.
* Rename MessagePumpForUI to MessagePumpGlib.
* Move some stuff out of MessagePumpGlib, and into MessagePumpGtk and MessagePumpX.
* Rename MessagePumpForUI::Observer to MessageObserver, moved the platform-specific implementations into MessagePumpGtk and MessagePumpX. Ditto for MessagePumpForUI::Dispatcher.
MessagePumpX is independent of MessagePumpGtk. At the moment, MessagePumpX does process some GDK event, but once we have a complete native_widget_x, we can take out the GDK processing and things should continue to work.
BUG=none
TEST=existing message-pump tests.
Review URL: http://codereview.chromium.org/7250001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@90418 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/message_pump_glib.h')
-rw-r--r-- | base/message_pump_glib.h | 89 |
1 files changed, 29 insertions, 60 deletions
diff --git a/base/message_pump_glib.h b/base/message_pump_glib.h index 32d0d8f..36d75cd 100644 --- a/base/message_pump_glib.h +++ b/base/message_pump_glib.h @@ -11,56 +11,40 @@ #include "base/observer_list.h" #include "base/time.h" -typedef union _GdkEvent GdkEvent; typedef struct _GMainContext GMainContext; typedef struct _GPollFD GPollFD; typedef struct _GSource GSource; namespace base { -// This class implements a MessagePump needed for TYPE_UI MessageLoops on -// OS_LINUX platforms using GLib. -class MessagePumpForUI : public MessagePump { +// MessagePumpObserver is notified prior to an event being dispatched. As +// Observers are notified of every change, they have to be FAST! The platform +// specific implementation of the class is in message_pump_gtk/message_pump_x. +class MessagePumpObserver; + +// MessagePumpDispatcher is used during a nested invocation of Run to dispatch +// events. If Run is invoked with a non-NULL MessagePumpDispatcher, MessageLoop +// does not dispatch events (or invoke gtk_main_do_event), rather every event is +// passed to Dispatcher's Dispatch method for dispatch. It is up to the +// Dispatcher to dispatch, or not, the event. The platform specific +// implementation of the class is in message_pump_gtk/message_pump_x. +class MessagePumpDispatcher; + +// This class implements a base MessagePump needed for TYPE_UI MessageLoops on +// platforms using GLib. +class MessagePumpGlib : public MessagePump { public: - // Observer is notified prior to a GdkEvent event being dispatched. As - // Observers are notified of every change, they have to be FAST! - class Observer { - public: - virtual ~Observer() {} - - // This method is called before processing a message. - virtual void WillProcessEvent(GdkEvent* event) = 0; - - // This method is called after processing a message. - virtual void DidProcessEvent(GdkEvent* event) = 0; - }; - - // Dispatcher is used during a nested invocation of Run to dispatch events. - // If Run is invoked with a non-NULL Dispatcher, MessageLoop does not - // dispatch events (or invoke gtk_main_do_event), rather every event is - // passed to Dispatcher's Dispatch method for dispatch. It is up to the - // Dispatcher to dispatch, or not, the event. - // - // The nested loop is exited by either posting a quit, or returning false - // from Dispatch. - class Dispatcher { - public: - virtual ~Dispatcher() {} - // Dispatches the event. If true is returned processing continues as - // normal. If false is returned, the nested loop exits immediately. - virtual bool Dispatch(GdkEvent* event) = 0; - }; - - MessagePumpForUI(); - virtual ~MessagePumpForUI(); - - // Like MessagePump::Run, but GdkEvent objects are routed through dispatcher. - virtual void RunWithDispatcher(Delegate* delegate, Dispatcher* dispatcher); + MessagePumpGlib(); + virtual ~MessagePumpGlib(); + + // Like MessagePump::Run, but events are routed through dispatcher. + virtual void RunWithDispatcher(Delegate* delegate, + MessagePumpDispatcher* dispatcher); // Run a single iteration of the mainloop. A return value of true indicates // that an event was handled. |block| indicates if it should wait if no event // is ready for processing. - virtual bool RunOnce(GMainContext* context, bool block); + virtual bool RunOnce(GMainContext* context, bool block) = 0; // Internal methods used for processing the pump callbacks. They are // public for simplicity but should not be used directly. HandlePrepare @@ -73,15 +57,11 @@ class MessagePumpForUI : public MessagePump { void HandleDispatch(); // Adds an Observer, which will start receiving notifications immediately. - void AddObserver(Observer* observer); + void AddObserver(MessagePumpObserver* observer); // Removes an Observer. It is safe to call this method while an Observer is // receiving a notification callback. - void RemoveObserver(Observer* observer); - - // Dispatch an available GdkEvent. Essentially this allows a subclass to do - // some task before/after calling the default handler (EventDispatcher). - virtual void DispatchEvents(GdkEvent* event); + void RemoveObserver(MessagePumpObserver* observer); // Overridden from MessagePump: virtual void Run(Delegate* delegate); @@ -91,26 +71,15 @@ class MessagePumpForUI : public MessagePump { protected: // Returns the dispatcher for the current run state (|state_->dispatcher|). - Dispatcher* GetDispatcher(); + MessagePumpDispatcher* GetDispatcher(); - ObserverList<Observer>& observers() { return observers_; } + ObserverList<MessagePumpObserver>& observers() { return observers_; } private: // We may make recursive calls to Run, so we save state that needs to be // separate between them in this structure type. struct RunState; - // Invoked from EventDispatcher. Notifies all observers we're about to - // process an event. - void WillProcessEvent(GdkEvent* event); - - // Invoked from EventDispatcher. Notifies all observers we processed an - // event. - void DidProcessEvent(GdkEvent* event); - - // Callback prior to gdk dispatching an event. - static void EventDispatcher(GdkEvent* event, void* data); - RunState* state_; // This is a GLib structure that we can add event sources to. We use the @@ -135,9 +104,9 @@ class MessagePumpForUI : public MessagePump { scoped_ptr<GPollFD> wakeup_gpollfd_; // List of observers. - ObserverList<Observer> observers_; + ObserverList<MessagePumpObserver> observers_; - DISALLOW_COPY_AND_ASSIGN(MessagePumpForUI); + DISALLOW_COPY_AND_ASSIGN(MessagePumpGlib); }; } // namespace base |