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:
@@ -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:
|
||||
|
Reference in New Issue
Block a user