implement event loop for console applications (heavily modified patch 1715735)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46029 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2007-05-14 23:43:39 +00:00
parent 9e9f08b5ed
commit b46b1d59d6
72 changed files with 3181 additions and 1128 deletions

View File

@@ -17,10 +17,10 @@
class WXDLLEXPORT wxEventLoop;
// ----------------------------------------------------------------------------
// wxEventLoop: a GUI event loop
// wxEventLoopBase: interface for wxEventLoop
// ----------------------------------------------------------------------------
class WXDLLEXPORT wxEventLoopBase
class WXDLLIMPEXP_BASE wxEventLoopBase
{
public:
// trivial, but needed (because of wxEventLoopBase) ctor
@@ -29,6 +29,10 @@ public:
// dtor
virtual ~wxEventLoopBase() { }
// use this to check whether the event loop was successfully created before
// using it
virtual bool IsOk() const { return true; }
// start the event loop, return the exit code when it is finished
virtual int Run() = 0;
@@ -53,6 +57,10 @@ public:
// spawned a nested (e.g. modal) event loop, this would return false
bool IsRunning() const;
// implement this to wake up the loop: usually done by posting a dummy event
// to it (can be called from non main thread)
virtual void WakeUp() = 0;
protected:
// this function should be called before the event loop terminates, whether
// this happens normally (because of Exit() call) or abnormally (because of
@@ -66,13 +74,13 @@ protected:
DECLARE_NO_COPY_CLASS(wxEventLoopBase)
};
#if defined(__WXMSW__) || defined(__WXMAC__) || defined(__WXDFB__)
#if defined(__WXMSW__) || defined(__WXMAC__) || defined(__WXDFB__) || defined(__UNIX__)
// this class can be used to implement a standard event loop logic using
// Pending() and Dispatch()
//
// it also handles idle processing automatically
class WXDLLEXPORT wxEventLoopManual : public wxEventLoopBase
class WXDLLIMPEXP_BASE wxEventLoopManual : public wxEventLoopBase
{
public:
wxEventLoopManual();
@@ -86,10 +94,6 @@ public:
virtual void Exit(int rc = 0);
protected:
// implement this to wake up the loop: usually done by posting a dummy event
// to it (called from Exit())
virtual void WakeUp() = 0;
// may be overridden to perform some action at the start of each new event
// loop iteration
virtual void OnNextIteration() { }
@@ -121,28 +125,44 @@ protected:
class WXDLLEXPORT wxEventLoopImpl;
class WXDLLEXPORT wxEventLoop : public wxEventLoopBase
class WXDLLEXPORT wxGUIEventLoop : public wxEventLoopBase
{
public:
wxEventLoop() { m_impl = NULL; }
virtual ~wxEventLoop();
wxGUIEventLoop() { m_impl = NULL; }
virtual ~wxGUIEventLoop();
virtual int Run();
virtual void Exit(int rc = 0);
virtual bool Pending() const;
virtual bool Dispatch();
virtual void WakeUp() { }
protected:
// the pointer to the port specific implementation class
wxEventLoopImpl *m_impl;
DECLARE_NO_COPY_CLASS(wxEventLoop)
DECLARE_NO_COPY_CLASS(wxGUIEventLoop)
};
#endif // platforms
// also include the header defining wxConsoleEventLoop for Unix systems
#if defined(__UNIX__)
#include "wx/unix/evtloop.h"
#endif
// cannot use typedef because wxEventLoop is forward-declared in many places
#if wxUSE_GUI
class wxEventLoop : public wxGUIEventLoop { };
#elif defined(__WXMSW__) || defined(__UNIX__)
class wxEventLoop : public wxConsoleEventLoop { };
#else // we still must define it somehow for the code below...
class wxEventLoop : public wxEventLoopBase { };
#endif
inline bool wxEventLoopBase::IsRunning() const { return GetActive() == this; }
#if wxUSE_GUI
// ----------------------------------------------------------------------------
// wxModalEventLoop
// ----------------------------------------------------------------------------
@@ -151,7 +171,7 @@ inline bool wxEventLoopBase::IsRunning() const { return GetActive() == this; }
// implement modality, we will surely need platform-specific implementations
// too, this generic implementation is here only temporarily to see how it
// works
class WXDLLEXPORT wxModalEventLoop : public wxEventLoop
class WXDLLEXPORT wxModalEventLoop : public wxGUIEventLoop
{
public:
wxModalEventLoop(wxWindow *winModal)
@@ -165,13 +185,15 @@ protected:
delete m_windowDisabler;
m_windowDisabler = NULL;
wxEventLoop::OnExit();
wxGUIEventLoop::OnExit();
}
private:
wxWindowDisabler *m_windowDisabler;
};
#endif //wxUSE_GUI
// ----------------------------------------------------------------------------
// wxEventLoopActivator: helper class for wxEventLoop implementations
// ----------------------------------------------------------------------------
@@ -182,16 +204,16 @@ private:
class wxEventLoopActivator
{
public:
wxEventLoopActivator(wxEventLoop *evtLoop)
wxEventLoopActivator(wxEventLoopBase *evtLoop)
{
m_evtLoopOld = wxEventLoop::GetActive();
wxEventLoop::SetActive(evtLoop);
m_evtLoopOld = wxEventLoopBase::GetActive();
wxEventLoopBase::SetActive(wx_static_cast(wxEventLoop *, evtLoop));
}
~wxEventLoopActivator()
{
// restore the previously active event loop
wxEventLoop::SetActive(m_evtLoopOld);
wxEventLoopBase::SetActive(m_evtLoopOld);
}
private: