+ static wxEventLoopBase *ms_activeLoop;
+
+ // should we exit the loop?
+ bool m_shouldExit;
+
+ // YieldFor() helpers:
+ bool m_isInsideYield;
+ long m_eventsToProcessInsideYield;
+
+private:
+ // this flag is set on entry into Run() and reset before leaving it
+ bool m_isInsideRun;
+
+ wxDECLARE_NO_COPY_CLASS(wxEventLoopBase);
+};
+
+#if defined(__WINDOWS__) || defined(__WXMAC__) || defined(__WXDFB__) || (defined(__UNIX__) && !defined(__WXOSX__))
+
+// this class can be used to implement a standard event loop logic using
+// Pending() and Dispatch()
+//
+// it also handles idle processing automatically
+class WXDLLIMPEXP_BASE wxEventLoopManual : public wxEventLoopBase
+{
+public:
+ wxEventLoopManual();
+
+ // sets the "should exit" flag and wakes up the loop so that it terminates
+ // soon
+ virtual void ScheduleExit(int rc = 0);
+
+protected:
+ // enters a loop calling OnNextIteration(), Pending() and Dispatch() and
+ // terminating when Exit() is called
+ virtual int DoRun();
+
+ // may be overridden to perform some action at the start of each new event
+ // loop iteration
+ virtual void OnNextIteration() { }
+
+
+ // the loop exit code
+ int m_exitcode;
+
+private:
+ // process all already pending events and dispatch a new one (blocking
+ // until it appears in the event queue if necessary)
+ //
+ // returns the return value of Dispatch()
+ bool ProcessEvents();
+
+ wxDECLARE_NO_COPY_CLASS(wxEventLoopManual);
+};
+
+#endif // platforms using "manual" loop
+
+// we're moving away from old m_impl wxEventLoop model as otherwise the user
+// code doesn't have access to platform-specific wxEventLoop methods and this
+// can sometimes be very useful (e.g. under MSW this is necessary for
+// integration with MFC) but currently this is not done for all ports yet (e.g.
+// wxX11) so fall back to the old wxGUIEventLoop definition below for them
+
+#if defined(__DARWIN__)
+ // CoreFoundation-based event loop is currently in wxBase so include it in
+ // any case too (although maybe it actually shouldn't be there at all)
+ #include "wx/osx/core/evtloop.h"
+#endif
+
+// include the header defining wxConsoleEventLoop
+#if defined(__UNIX__) && !defined(__WXMSW__)
+ #include "wx/unix/evtloop.h"
+#elif defined(__WINDOWS__)
+ #include "wx/msw/evtloopconsole.h"
+#endif
+
+#if wxUSE_GUI
+
+// include the appropriate header defining wxGUIEventLoop
+
+#if defined(__WXMSW__)
+ #include "wx/msw/evtloop.h"
+#elif defined(__WXCOCOA__)
+ #include "wx/cocoa/evtloop.h"
+#elif defined(__WXOSX__)
+ #include "wx/osx/evtloop.h"
+#elif defined(__WXDFB__)
+ #include "wx/dfb/evtloop.h"
+#elif defined(__WXGTK20__)
+ #include "wx/gtk/evtloop.h"
+#else // other platform
+
+#include "wx/stopwatch.h" // for wxMilliClock_t
+
+class WXDLLIMPEXP_FWD_CORE wxEventLoopImpl;
+
+class WXDLLIMPEXP_CORE wxGUIEventLoop : public wxEventLoopBase
+{
+public:
+ wxGUIEventLoop() { m_impl = NULL; }
+ virtual ~wxGUIEventLoop();
+
+ virtual void ScheduleExit(int rc = 0);
+ virtual bool Pending() const;
+ virtual bool Dispatch();
+ virtual int DispatchTimeout(unsigned long timeout)
+ {
+ // TODO: this is, of course, horribly inefficient and a proper wait with
+ // timeout should be implemented for all ports natively...
+ const wxMilliClock_t timeEnd = wxGetLocalTimeMillis() + timeout;
+ for ( ;; )
+ {
+ if ( Pending() )
+ return Dispatch();
+
+ if ( wxGetLocalTimeMillis() >= timeEnd )
+ return -1;
+ }
+ }
+ virtual void WakeUp() { }
+ virtual bool YieldFor(long eventsToProcess);
+
+protected:
+ virtual int DoRun();
+
+ // the pointer to the port specific implementation class
+ wxEventLoopImpl *m_impl;
+
+ wxDECLARE_NO_COPY_CLASS(wxGUIEventLoop);