diff options
Diffstat (limited to 'base')
-rw-r--r-- | base/message_loop.h | 2 | ||||
-rw-r--r-- | base/message_pump_observer.h | 54 | ||||
-rw-r--r-- | base/message_pump_win.cc | 8 | ||||
-rw-r--r-- | base/message_pump_win.h | 24 | ||||
-rw-r--r-- | base/message_pump_x.cc | 18 | ||||
-rw-r--r-- | base/message_pump_x.h | 21 |
6 files changed, 76 insertions, 51 deletions
diff --git a/base/message_loop.h b/base/message_loop.h index fffcd2f..bc98c4c 100644 --- a/base/message_loop.h +++ b/base/message_loop.h @@ -84,7 +84,7 @@ class BASE_EXPORT MessageLoop : public base::MessagePump::Delegate { public: #if defined(OS_WIN) typedef base::MessagePumpWin::Dispatcher Dispatcher; - typedef base::MessagePumpForUI::Observer Observer; + typedef base::MessagePumpObserver Observer; #elif !defined(OS_MACOSX) && !defined(OS_ANDROID) typedef base::MessagePumpDispatcher Dispatcher; typedef base::MessagePumpObserver Observer; diff --git a/base/message_pump_observer.h b/base/message_pump_observer.h new file mode 100644 index 0000000..d12f221 --- /dev/null +++ b/base/message_pump_observer.h @@ -0,0 +1,54 @@ +// Copyright (c) 2011 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. + +#ifndef BASE_MESSAGE_PUMP_OBSERVER_H +#define BASE_MESSAGE_PUMP_OBSERVER_H + +#if defined(USE_X11) +typedef union _XEvent XEvent; +#endif + +namespace base { + +#if defined(OS_WIN) +typedef MSG NativeEvent; +#elif defined(USE_X11) +typedef XEvent* NativeEvent; +#endif + +enum EventStatus { + EVENT_CONTINUE, // The event should be dispatched as normal. +#if defined(USE_X11) + EVENT_HANDLED // The event should not be processed any farther. +#endif +}; + +// A MessagePumpObserver is an object that receives global +// notifications from the UI MessageLoop with MessagePumpWin or +// MessagePumpX. +// +// NOTE: An Observer implementation should be extremely fast! +// +// For use with MessagePumpX, please see message_pump_glib.h for more +// info about how this is invoked in this environment. +class BASE_EXPORT MessagePumpObserver { + public: + // This method is called before processing a NativeEvent. If the + // method returns EVENT_HANDLED, it indicates the event has already + // been handled, so the event is not processed any farther. If the + // method returns EVENT_CONTINUE, the event dispatching proceeds as + // normal. + virtual EventStatus WillProcessEvent(const NativeEvent& event) = 0; + + // This method is called after processing a message. This method + // will not be called if WillProcessEvent returns EVENT_HANDLED. + virtual void DidProcessEvent(const NativeEvent& event) = 0; + + protected: + virtual ~MessagePumpObserver() {} +}; + +} // namespace base + +#endif // BASE_MESSAGE_PUMP_OBSERVER_VIEWS_H diff --git a/base/message_pump_win.cc b/base/message_pump_win.cc index 9d0ec53..740ddd9 100644 --- a/base/message_pump_win.cc +++ b/base/message_pump_win.cc @@ -21,20 +21,20 @@ static const int kMsgHaveWork = WM_USER + 1; //----------------------------------------------------------------------------- // MessagePumpWin public: -void MessagePumpWin::AddObserver(Observer* observer) { +void MessagePumpWin::AddObserver(MessagePumpObserver* observer) { observers_.AddObserver(observer); } -void MessagePumpWin::RemoveObserver(Observer* observer) { +void MessagePumpWin::RemoveObserver(MessagePumpObserver* observer) { observers_.RemoveObserver(observer); } void MessagePumpWin::WillProcessMessage(const MSG& msg) { - FOR_EACH_OBSERVER(Observer, observers_, WillProcessMessage(msg)); + FOR_EACH_OBSERVER(MessagePumpObserver, observers_, WillProcessEvent(msg)); } void MessagePumpWin::DidProcessMessage(const MSG& msg) { - FOR_EACH_OBSERVER(Observer, observers_, DidProcessMessage(msg)); + FOR_EACH_OBSERVER(MessagePumpObserver, observers_, DidProcessEvent(msg)); } void MessagePumpWin::RunWithDispatcher( diff --git a/base/message_pump_win.h b/base/message_pump_win.h index 5f17610..d0d32f6 100644 --- a/base/message_pump_win.h +++ b/base/message_pump_win.h @@ -13,6 +13,7 @@ #include "base/base_export.h" #include "base/basictypes.h" #include "base/message_pump.h" +#include "base/message_pump_observer.h" #include "base/observer_list.h" #include "base/time.h" #include "base/win/scoped_handle.h" @@ -24,23 +25,6 @@ namespace base { // controlling the lifetime of the message pump. class BASE_EXPORT MessagePumpWin : public MessagePump { public: - // An Observer is an object that receives global notifications from the - // UI MessageLoop. - // - // NOTE: An Observer implementation should be extremely fast! - // - class BASE_EXPORT Observer { - public: - virtual ~Observer() {} - - // This method is called before processing a message. - // The message may be undefined in which case msg.message is 0 - virtual void WillProcessMessage(const MSG& msg) = 0; - - // This method is called when control returns from processing a UI message. - // The message may be undefined in which case msg.message is 0 - virtual void DidProcessMessage(const MSG& msg) = 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 @@ -62,11 +46,11 @@ class BASE_EXPORT MessagePumpWin : public MessagePump { virtual ~MessagePumpWin() {} // Add an Observer, which will start receiving notifications immediately. - void AddObserver(Observer* observer); + void AddObserver(MessagePumpObserver* observer); // Remove an Observer. It is safe to call this method while an Observer is // receiving a notification callback. - void RemoveObserver(Observer* observer); + void RemoveObserver(MessagePumpObserver* observer); // Give a chance to code processing additional messages to notify the // message loop observers that another message has been processed. @@ -95,7 +79,7 @@ class BASE_EXPORT MessagePumpWin : public MessagePump { virtual void DoRunLoop() = 0; int GetCurrentDelay() const; - ObserverList<Observer> observers_; + ObserverList<MessagePumpObserver> observers_; // The time at which delayed work should run. TimeTicks delayed_work_time_; diff --git a/base/message_pump_x.cc b/base/message_pump_x.cc index 33ca2d5..45f24a6 100644 --- a/base/message_pump_x.cc +++ b/base/message_pump_x.cc @@ -193,7 +193,7 @@ bool MessagePumpX::ProcessXEvent(XEvent* xev) { have_cookie = true; } - if (WillProcessXEvent(xev) == MessagePumpObserver::EVENT_CONTINUE) { + if (WillProcessXEvent(xev) == EVENT_CONTINUE) { MessagePumpDispatcher::DispatchStatus status = GetDispatcher()->Dispatch(xev); @@ -203,6 +203,7 @@ bool MessagePumpX::ProcessXEvent(XEvent* xev) { } else if (status == MessagePumpDispatcher::EVENT_IGNORED) { VLOG(1) << "Event (" << xev->type << ") not handled."; } + DidProcessXEvent(xev); } if (have_cookie) { @@ -264,12 +265,20 @@ bool MessagePumpX::WillProcessXEvent(XEvent* xevent) { ObserverListBase<MessagePumpObserver>::Iterator it(observers()); MessagePumpObserver* obs; while ((obs = it.GetNext()) != NULL) { - if (obs->WillProcessXEvent(xevent)) + if (obs->WillProcessEvent(xevent)) return true; } return false; } +void MessagePumpX::DidProcessXEvent(XEvent* xevent) { + ObserverListBase<MessagePumpObserver>::Iterator it(observers()); + MessagePumpObserver* obs; + while ((obs = it.GetNext()) != NULL) { + obs->DidProcessEvent(xevent); + } +} + #if defined(TOOLKIT_USES_GTK) GdkFilterReturn MessagePumpX::GdkEventFilter(GdkXEvent* gxevent, GdkEvent* gevent, @@ -328,9 +337,4 @@ COMPILE_ASSERT(XLASTEvent >= LASTEvent, XLASTEvent_too_small); #endif // defined(TOOLKIT_USES_GTK) -MessagePumpObserver::EventStatus - MessagePumpObserver::WillProcessXEvent(XEvent* xev) { - return EVENT_CONTINUE; -} - } // namespace base diff --git a/base/message_pump_x.h b/base/message_pump_x.h index eab6f6b..39d7d9c 100644 --- a/base/message_pump_x.h +++ b/base/message_pump_x.h @@ -7,6 +7,7 @@ #include "base/message_pump.h" #include "base/message_pump_glib.h" +#include "base/message_pump_observer.h" #include <bitset> @@ -16,30 +17,11 @@ #include <gtk/gtk.h> #endif -typedef union _XEvent XEvent; typedef struct _XDisplay Display; namespace base { // The documentation for this class is in message_pump_glib.h -class BASE_EXPORT MessagePumpObserver { - public: - enum EventStatus { - EVENT_CONTINUE, // The event should be dispatched as normal. - EVENT_HANDLED // The event should not be processed any farther. - }; - - // This method is called before processing an XEvent. If the method returns - // EVENT_HANDLED, it indicates the event has already been handled, so the - // event is not processed any farther. If the method returns EVENT_CONTINUE, - // the event dispatching proceeds as normal. - virtual EventStatus WillProcessXEvent(XEvent* xevent); - - protected: - virtual ~MessagePumpObserver() {} -}; - -// The documentation for this class is in message_pump_glib.h // // The nested loop is exited by either posting a quit, or returning EVENT_QUIT // from Dispatch. @@ -97,6 +79,7 @@ class BASE_EXPORT MessagePumpX : public MessagePumpGlib { // not send the event to any other observers and returns true. Returns false // if no observer returns true. bool WillProcessXEvent(XEvent* xevent); + void DidProcessXEvent(XEvent* xevent); #if defined(TOOLKIT_USES_GTK) // Some XEvent's can't be directly read from X event queue and will go // through GDK's dispatching process and may get discarded. This function |