1 ///////////////////////////////////////////////////////////////////////////////
3 // Purpose: declares wxEventLoop class
4 // Author: Vadim Zeitlin
8 // Copyright: (c) 2001 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
12 #ifndef _WX_EVTLOOP_H_
13 #define _WX_EVTLOOP_H_
17 // ----------------------------------------------------------------------------
18 // wxEventLoopBase: interface for wxEventLoop
19 // ----------------------------------------------------------------------------
21 class WXDLLIMPEXP_BASE wxEventLoopBase
24 // trivial, but needed (because of wxEventLoopBase) ctor
28 virtual ~wxEventLoopBase() { }
30 // use this to check whether the event loop was successfully created before
32 virtual bool IsOk() const { return true; }
35 // start the event loop, return the exit code when it is finished
36 virtual int Run() = 0;
38 // exit from the loop with the given exit code
39 virtual void Exit(int rc
= 0) = 0;
41 // return true if any events are available
42 virtual bool Pending() const = 0;
44 // dispatch a single event, return false if we should exit from the loop
45 virtual bool Dispatch() = 0;
47 // same as Dispatch() but doesn't wait for longer than the specified (in
48 // ms) timeout, return true if an event was processed, false if we should
49 // exit the loop or -1 if timeout expired
50 virtual int DispatchTimeout(unsigned long timeout
) = 0;
53 // return currently active (running) event loop, may be NULL
54 static wxEventLoopBase
*GetActive() { return ms_activeLoop
; }
56 // set currently active (running) event loop
57 static void SetActive(wxEventLoopBase
* loop
) { ms_activeLoop
= loop
; }
59 // is this event loop running now?
61 // notice that even if this event loop hasn't terminated yet but has just
62 // spawned a nested (e.g. modal) event loop, this would return false
63 bool IsRunning() const;
65 // implement this to wake up the loop: usually done by posting a dummy event
66 // to it (can be called from non main thread)
67 virtual void WakeUp() = 0;
70 // this function should be called before the event loop terminates, whether
71 // this happens normally (because of Exit() call) or abnormally (because of
72 // an exception thrown from inside the loop)
73 virtual void OnExit() { }
76 // the pointer to currently active loop
77 static wxEventLoopBase
*ms_activeLoop
;
79 wxDECLARE_NO_COPY_CLASS(wxEventLoopBase
);
82 #if defined(__WXMSW__) || defined(__WXMAC__) || defined(__WXDFB__) || defined(__UNIX__)
84 // this class can be used to implement a standard event loop logic using
85 // Pending() and Dispatch()
87 // it also handles idle processing automatically
88 class WXDLLIMPEXP_BASE wxEventLoopManual
: public wxEventLoopBase
93 // enters a loop calling OnNextIteration(), Pending() and Dispatch() and
94 // terminating when Exit() is called
97 // sets the "should exit" flag and wakes up the loop so that it terminates
99 virtual void Exit(int rc
= 0);
102 // may be overridden to perform some action at the start of each new event
104 virtual void OnNextIteration() { }
107 // the loop exit code
110 // should we exit the loop?
114 #endif // platforms using "manual" loop
116 // we're moving away from old m_impl wxEventLoop model as otherwise the user
117 // code doesn't have access to platform-specific wxEventLoop methods and this
118 // can sometimes be very useful (e.g. under MSW this is necessary for
119 // integration with MFC) but currently this is done for MSW only, other ports
120 // should follow a.s.a.p.
121 #if defined(__WXPALMOS__)
122 #include "wx/palmos/evtloop.h"
123 #elif defined(__WXMSW__)
124 #include "wx/msw/evtloop.h"
125 #elif defined(__WXMAC__)
126 #include "wx/osx/evtloop.h"
127 #elif defined(__WXCOCOA__)
128 #include "wx/cocoa/evtloop.h"
129 #elif defined(__WXDFB__)
130 #include "wx/dfb/evtloop.h"
131 #elif defined(__WXGTK20__)
132 #include "wx/gtk/evtloop.h"
133 #else // other platform
135 #include "wx/stopwatch.h" // for wxMilliClock_t
137 class WXDLLIMPEXP_FWD_CORE wxEventLoopImpl
;
139 class WXDLLIMPEXP_CORE wxGUIEventLoop
: public wxEventLoopBase
142 wxGUIEventLoop() { m_impl
= NULL
; }
143 virtual ~wxGUIEventLoop();
146 virtual void Exit(int rc
= 0);
147 virtual bool Pending() const;
148 virtual bool Dispatch();
149 virtual int DispatchTimeout(unsigned long timeout
)
151 // TODO: this is, of course, horribly inefficient and a proper wait with
152 // timeout should be implemented for all ports natively...
153 const wxMilliClock_t timeEnd
= wxGetLocalTimeMillis() + timeout
;
159 if ( wxGetLocalTimeMillis() >= timeEnd
)
163 virtual void WakeUp() { }
166 // the pointer to the port specific implementation class
167 wxEventLoopImpl
*m_impl
;
169 wxDECLARE_NO_COPY_CLASS(wxGUIEventLoop
);
174 // also include the header defining wxConsoleEventLoop for Unix systems
175 #if defined(__UNIX__)
176 #include "wx/unix/evtloop.h"
179 // we use a class rather than a typedef because wxEventLoop is forward-declared
182 class wxEventLoop
: public wxGUIEventLoop
{ };
184 // we can't define wxEventLoop differently in GUI and base libraries so use
185 // a #define to still allow writing wxEventLoop in the user code
186 #if wxUSE_CONSOLE_EVENTLOOP && (defined(__WXMSW__) || defined(__UNIX__))
187 #define wxEventLoop wxConsoleEventLoop
188 #else // we still must define it somehow for the code below...
189 #define wxEventLoop wxEventLoopBase
193 inline bool wxEventLoopBase::IsRunning() const { return GetActive() == this; }
196 // ----------------------------------------------------------------------------
198 // ----------------------------------------------------------------------------
200 // this is a naive generic implementation which uses wxWindowDisabler to
201 // implement modality, we will surely need platform-specific implementations
202 // too, this generic implementation is here only temporarily to see how it
204 class WXDLLIMPEXP_CORE wxModalEventLoop
: public wxGUIEventLoop
207 wxModalEventLoop(wxWindow
*winModal
)
209 m_windowDisabler
= new wxWindowDisabler(winModal
);
213 virtual void OnExit()
215 delete m_windowDisabler
;
216 m_windowDisabler
= NULL
;
218 wxGUIEventLoop::OnExit();
222 wxWindowDisabler
*m_windowDisabler
;
227 // ----------------------------------------------------------------------------
228 // wxEventLoopActivator: helper class for wxEventLoop implementations
229 // ----------------------------------------------------------------------------
231 // this object sets the wxEventLoop given to the ctor as the currently active
232 // one and unsets it in its dtor, this is especially useful in presence of
233 // exceptions but is more tidy even when we don't use them
234 class wxEventLoopActivator
237 wxEventLoopActivator(wxEventLoopBase
*evtLoop
)
239 m_evtLoopOld
= wxEventLoopBase::GetActive();
240 wxEventLoopBase::SetActive(evtLoop
);
243 ~wxEventLoopActivator()
245 // restore the previously active event loop
246 wxEventLoopBase::SetActive(m_evtLoopOld
);
250 wxEventLoopBase
*m_evtLoopOld
;
253 #if wxUSE_CONSOLE_EVENTLOOP
255 class wxEventLoopGuarantor
258 wxEventLoopGuarantor()
261 if (!wxEventLoop::GetActive())
263 m_evtLoopNew
= new wxEventLoop
;
264 wxEventLoop::SetActive(m_evtLoopNew
);
268 ~wxEventLoopGuarantor()
272 wxEventLoop::SetActive(NULL
);
278 wxEventLoop
*m_evtLoopNew
;
281 #endif // wxUSE_CONSOLE_EVENTLOOP
283 #endif // _WX_EVTLOOP_H_