don't define wxEventLoop class differently in GUI and base, this breaks the

ODR and hence results in many problems in practice; instead use wxEventLoopBase
whenever possible and #define wxEventLoop differently in console applications


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46158 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2007-05-22 02:30:01 +00:00
parent 30c15c1d73
commit 2ddff00c92
24 changed files with 58 additions and 56 deletions

View File

@@ -25,12 +25,11 @@
class WXDLLIMPEXP_BASE wxAppConsole; class WXDLLIMPEXP_BASE wxAppConsole;
class WXDLLIMPEXP_BASE wxAppTraits; class WXDLLIMPEXP_BASE wxAppTraits;
class WXDLLIMPEXP_BASE wxCmdLineParser; class WXDLLIMPEXP_BASE wxCmdLineParser;
class WXDLLIMPEXP_BASE wxEventLoop; class WXDLLIMPEXP_BASE wxEventLoopBase;
class WXDLLIMPEXP_BASE wxLog; class WXDLLIMPEXP_BASE wxLog;
class WXDLLIMPEXP_BASE wxMessageOutput; class WXDLLIMPEXP_BASE wxMessageOutput;
#if wxUSE_GUI #if wxUSE_GUI
class WXDLLEXPORT wxEventLoop;
struct WXDLLIMPEXP_CORE wxVideoMode; struct WXDLLIMPEXP_CORE wxVideoMode;
#endif #endif
@@ -327,7 +326,7 @@ protected:
// create main loop from AppTraits or return NULL if // create main loop from AppTraits or return NULL if
// there is no main loop implementation // there is no main loop implementation
wxEventLoop *CreateMainLoop(); wxEventLoopBase *CreateMainLoop();
// application info (must be set from the user code) // application info (must be set from the user code)
wxString m_vendorName, // vendor name (ACME Inc) wxString m_vendorName, // vendor name (ACME Inc)
@@ -340,7 +339,7 @@ protected:
// the main event loop of the application (may be NULL if the loop hasn't // the main event loop of the application (may be NULL if the loop hasn't
// been started yet or has already terminated) // been started yet or has already terminated)
wxEventLoop *m_mainLoop; wxEventLoopBase *m_mainLoop;
// the application object is a singleton anyhow, there is no sense in // the application object is a singleton anyhow, there is no sense in
// copying it // copying it

View File

@@ -18,7 +18,7 @@
class WXDLLIMPEXP_BASE wxArrayString; class WXDLLIMPEXP_BASE wxArrayString;
class WXDLLIMPEXP_BASE wxObject; class WXDLLIMPEXP_BASE wxObject;
class WXDLLEXPORT wxAppTraits; class WXDLLEXPORT wxAppTraits;
class WXDLLIMPEXP_BASE wxEventLoop; class WXDLLIMPEXP_BASE wxEventLoopBase;
#if wxUSE_FONTMAP #if wxUSE_FONTMAP
class WXDLLEXPORT wxFontMapper; class WXDLLEXPORT wxFontMapper;
#endif // wxUSE_FONTMAP #endif // wxUSE_FONTMAP
@@ -122,7 +122,7 @@ public:
#endif #endif
// create a new, port specific, instance of the event loop used by wxApp // create a new, port specific, instance of the event loop used by wxApp
virtual wxEventLoop *CreateEventLoop() = 0; virtual wxEventLoopBase *CreateEventLoop() = 0;
#if wxUSE_TIMER #if wxUSE_TIMER
// return platform and toolkit dependent wxTimer implementation // return platform and toolkit dependent wxTimer implementation

View File

@@ -14,8 +14,6 @@
#include "wx/utils.h" #include "wx/utils.h"
class WXDLLEXPORT wxEventLoop;
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxEventLoopBase: interface for wxEventLoop // wxEventLoopBase: interface for wxEventLoop
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -46,10 +44,10 @@ public:
virtual bool Dispatch() = 0; virtual bool Dispatch() = 0;
// return currently active (running) event loop, may be NULL // return currently active (running) event loop, may be NULL
static wxEventLoop *GetActive() { return ms_activeLoop; } static wxEventLoopBase *GetActive() { return ms_activeLoop; }
// set currently active (running) event loop // set currently active (running) event loop
static void SetActive(wxEventLoop* loop) { ms_activeLoop = loop; } static void SetActive(wxEventLoopBase* loop) { ms_activeLoop = loop; }
// is this event loop running now? // is this event loop running now?
// //
@@ -69,7 +67,7 @@ protected:
// the pointer to currently active loop // the pointer to currently active loop
static wxEventLoop *ms_activeLoop; static wxEventLoopBase *ms_activeLoop;
DECLARE_NO_COPY_CLASS(wxEventLoopBase) DECLARE_NO_COPY_CLASS(wxEventLoopBase)
}; };
@@ -151,13 +149,18 @@ protected:
#include "wx/unix/evtloop.h" #include "wx/unix/evtloop.h"
#endif #endif
// cannot use typedef because wxEventLoop is forward-declared in many places // we use a class rather than a typedef because wxEventLoop is forward-declared
// in many places
#if wxUSE_GUI #if wxUSE_GUI
class wxEventLoop : public wxGUIEventLoop { }; class wxEventLoop : public wxGUIEventLoop { };
#elif defined(__WXMSW__) || defined(__UNIX__) #else // !GUI
class wxEventLoop : public wxConsoleEventLoop { }; // we can't define wxEventLoop differently in GUI and base libraries so use
#else // we still must define it somehow for the code below... // a #define to still allow writing wxEventLoop in the user code
class wxEventLoop : public wxEventLoopBase { }; #if defined(__WXMSW__) || defined(__UNIX__)
#define wxEventLoop wxConsoleEventLoop
#else // we still must define it somehow for the code below...
#define wxEventLoop wxEventLoopBase
#endif
#endif #endif
inline bool wxEventLoopBase::IsRunning() const { return GetActive() == this; } inline bool wxEventLoopBase::IsRunning() const { return GetActive() == this; }
@@ -207,7 +210,7 @@ public:
wxEventLoopActivator(wxEventLoopBase *evtLoop) wxEventLoopActivator(wxEventLoopBase *evtLoop)
{ {
m_evtLoopOld = wxEventLoopBase::GetActive(); m_evtLoopOld = wxEventLoopBase::GetActive();
wxEventLoopBase::SetActive(wx_static_cast(wxEventLoop *, evtLoop)); wxEventLoopBase::SetActive(evtLoop);
} }
~wxEventLoopActivator() ~wxEventLoopActivator()
@@ -217,7 +220,7 @@ public:
} }
private: private:
wxEventLoop *m_evtLoopOld; wxEventLoopBase *m_evtLoopOld;
}; };
#endif // _WX_EVTLOOP_H_ #endif // _WX_EVTLOOP_H_

View File

@@ -12,7 +12,7 @@
class wxConsoleAppTraits : public wxConsoleAppTraitsBase class wxConsoleAppTraits : public wxConsoleAppTraitsBase
{ {
public: public:
virtual wxEventLoop *CreateEventLoop() { return NULL; } virtual wxEventLoopBase *CreateEventLoop() { return NULL; }
#if wxUSE_TIMER #if wxUSE_TIMER
virtual wxTimerImpl *CreateTimerImpl(wxTimer *) { return NULL; } virtual wxTimerImpl *CreateTimerImpl(wxTimer *) { return NULL; }
#endif // wxUSE_TIMER #endif // wxUSE_TIMER
@@ -23,7 +23,7 @@ public:
class wxGUIAppTraits : public wxGUIAppTraitsBase class wxGUIAppTraits : public wxGUIAppTraitsBase
{ {
public: public:
virtual wxEventLoop *CreateEventLoop(); virtual wxEventLoopBase *CreateEventLoop();
virtual wxPortId GetToolkitVersion(int *majVer, int *minVer) const; virtual wxPortId GetToolkitVersion(int *majVer, int *minVer) const;
#if wxUSE_TIMER #if wxUSE_TIMER

View File

@@ -19,7 +19,7 @@
class WXDLLIMPEXP_BASE wxConsoleAppTraits : public wxConsoleAppTraitsBase class WXDLLIMPEXP_BASE wxConsoleAppTraits : public wxConsoleAppTraitsBase
{ {
public: public:
virtual wxEventLoop *CreateEventLoop(); virtual wxEventLoopBase *CreateEventLoop();
virtual void *BeforeChildWaitLoop(); virtual void *BeforeChildWaitLoop();
virtual void AlwaysYield(); virtual void AlwaysYield();
virtual void AfterChildWaitLoop(void *data); virtual void AfterChildWaitLoop(void *data);
@@ -35,7 +35,7 @@ public:
class WXDLLIMPEXP_CORE wxGUIAppTraits : public wxGUIAppTraitsBase class WXDLLIMPEXP_CORE wxGUIAppTraits : public wxGUIAppTraitsBase
{ {
public: public:
virtual wxEventLoop *CreateEventLoop(); virtual wxEventLoopBase *CreateEventLoop();
virtual void *BeforeChildWaitLoop(); virtual void *BeforeChildWaitLoop();
virtual void AlwaysYield(); virtual void AlwaysYield();
virtual void AfterChildWaitLoop(void *data); virtual void AfterChildWaitLoop(void *data);

View File

@@ -19,7 +19,7 @@
class WXDLLEXPORT wxConsoleAppTraits : public wxConsoleAppTraitsBase class WXDLLEXPORT wxConsoleAppTraits : public wxConsoleAppTraitsBase
{ {
public: public:
virtual wxEventLoop *CreateEventLoop(); virtual wxEventLoopBase *CreateEventLoop();
virtual bool CreateEndProcessPipe(wxExecuteData& execData); virtual bool CreateEndProcessPipe(wxExecuteData& execData);
virtual bool IsWriteFDOfEndProcessPipe(wxExecuteData& execData, int fd); virtual bool IsWriteFDOfEndProcessPipe(wxExecuteData& execData, int fd);
virtual void DetachWriteFDOfEndProcessPipe(wxExecuteData& execData); virtual void DetachWriteFDOfEndProcessPipe(wxExecuteData& execData);
@@ -34,7 +34,7 @@ public:
class WXDLLEXPORT wxGUIAppTraits : public wxGUIAppTraitsBase class WXDLLEXPORT wxGUIAppTraits : public wxGUIAppTraitsBase
{ {
public: public:
virtual wxEventLoop *CreateEventLoop(); virtual wxEventLoopBase *CreateEventLoop();
virtual bool CreateEndProcessPipe(wxExecuteData& execData); virtual bool CreateEndProcessPipe(wxExecuteData& execData);
virtual bool IsWriteFDOfEndProcessPipe(wxExecuteData& execData, int fd); virtual bool IsWriteFDOfEndProcessPipe(wxExecuteData& execData, int fd);
virtual void DetachWriteFDOfEndProcessPipe(wxExecuteData& execData); virtual void DetachWriteFDOfEndProcessPipe(wxExecuteData& execData);

View File

@@ -73,12 +73,9 @@ wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer* timer)
return new wxCocoaTimerImpl(timer); return new wxCocoaTimerImpl(timer);
} }
wxEventLoop* wxGUIAppTraits::CreateEventLoop() wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
{ {
// MAJOR HACK: wxEventLoop is implemented in both core and base libraries. return new wxGUIEventLoop;
// Fortunately, it has an empty implementation so an instance of the
// wxGUIEventLoop parent class will be fine until this issue is fixed.
return static_cast<wxEventLoop*>(new wxGUIEventLoop);
} }
wxWindow* wxFindWindowAtPoint(const wxPoint& pt) wxWindow* wxFindWindowAtPoint(const wxPoint& pt)

View File

@@ -119,7 +119,7 @@ wxAppInitializerFunction wxAppConsole::ms_appInitFn = NULL;
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// this defines wxEventLoopPtr // this defines wxEventLoopPtr
wxDEFINE_TIED_SCOPED_PTR_TYPE(wxEventLoop) wxDEFINE_TIED_SCOPED_PTR_TYPE(wxEventLoopBase)
// ============================================================================ // ============================================================================
// wxAppConsole implementation // wxAppConsole implementation
@@ -185,7 +185,7 @@ bool wxAppConsole::Initialize(int& argcOrig, wxChar **argvOrig)
return true; return true;
} }
wxEventLoop *wxAppConsole::CreateMainLoop() wxEventLoopBase *wxAppConsole::CreateMainLoop()
{ {
return GetTraits()->CreateEventLoop(); return GetTraits()->CreateEventLoop();
} }
@@ -290,7 +290,7 @@ wxAppTraits *wxAppConsole::GetTraits()
int wxAppConsole::MainLoop() int wxAppConsole::MainLoop()
{ {
wxEventLoopTiedPtr mainLoop(&m_mainLoop, CreateMainLoop()); wxEventLoopBaseTiedPtr mainLoop(&m_mainLoop, CreateMainLoop());
return m_mainLoop ? m_mainLoop->Run() : -1; return m_mainLoop ? m_mainLoop->Run() : -1;
} }
@@ -310,7 +310,7 @@ bool wxAppConsole::Pending()
// use the currently active message loop here, not m_mainLoop, because if // use the currently active message loop here, not m_mainLoop, because if
// we're showing a modal dialog (with its own event loop) currently the // we're showing a modal dialog (with its own event loop) currently the
// main event loop is not running anyhow // main event loop is not running anyhow
wxEventLoop * const loop = wxEventLoopBase::GetActive(); wxEventLoopBase * const loop = wxEventLoopBase::GetActive();
return loop && loop->Pending(); return loop && loop->Pending();
} }
@@ -318,7 +318,7 @@ bool wxAppConsole::Pending()
bool wxAppConsole::Dispatch() bool wxAppConsole::Dispatch()
{ {
// see comment in Pending() // see comment in Pending()
wxEventLoop * const loop = wxEventLoopBase::GetActive(); wxEventLoopBase * const loop = wxEventLoopBase::GetActive();
return loop && loop->Dispatch(); return loop && loop->Dispatch();
} }

View File

@@ -34,7 +34,7 @@
// globals // globals
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
wxEventLoop *wxEventLoopBase::ms_activeLoop = NULL; wxEventLoopBase *wxEventLoopBase::ms_activeLoop = NULL;
// wxEventLoopManual is unused in the other ports // wxEventLoopManual is unused in the other ports
#if defined(__WXMSW__) || defined(__WXMAC__) || defined(__WXDFB__) || (defined(__UNIX__) && !wxUSE_GUI) #if defined(__WXMSW__) || defined(__WXMAC__) || defined(__WXDFB__) || (defined(__UNIX__) && !wxUSE_GUI)

View File

@@ -156,7 +156,7 @@ void wxApp::WakeUpIdle()
wxMutexGuiEnter(); wxMutexGuiEnter();
#endif #endif
wxEventLoop * const loop = wxEventLoop::GetActive(); wxEventLoopBase * const loop = wxEventLoop::GetActive();
if ( loop ) if ( loop )
loop->WakeUp(); loop->WakeUp();
@@ -190,7 +190,8 @@ bool wxApp::Yield(bool onlyIfNeeded)
wxLog::Suspend(); wxLog::Suspend();
wxEventLoop * const loop = wxEventLoop::GetActive(); wxEventLoop * const
loop = wx_static_cast(wxEventLoop *, wxEventLoop::GetActive());
if ( loop ) if ( loop )
loop->Yield(); loop->Yield();

View File

@@ -40,10 +40,11 @@ wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const
} }
wxEventLoop* wxGUIAppTraits::CreateEventLoop() wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
{ {
return new wxEventLoop; return new wxEventLoop;
}; }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// display characteristics // display characteristics
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@@ -364,7 +364,7 @@ static wxString GetSM()
// wxGUIAppTraits // wxGUIAppTraits
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
wxEventLoop *wxGUIAppTraits::CreateEventLoop() wxEventLoopBase *wxGUIAppTraits::CreateEventLoop()
{ {
return new wxEventLoop(); return new wxEventLoop();
} }

View File

@@ -203,7 +203,7 @@ wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const
return wxPORT_GTK; return wxPORT_GTK;
} }
wxEventLoop* wxGUIAppTraits::CreateEventLoop() wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
{ {
return new wxEventLoop; return new wxEventLoop;
} }

View File

@@ -381,7 +381,7 @@ wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const
return wxPORT_MAC; return wxPORT_MAC;
} }
wxEventLoop* wxGUIAppTraits::CreateEventLoop() wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
{ {
return new wxEventLoop; return new wxEventLoop;
} }

View File

@@ -74,10 +74,11 @@ bool wxApp::Yield(bool onlyIfNeeded)
wxLog::Suspend(); wxLog::Suspend();
if ( wxEventLoop::GetActive() ) wxEventLoopBase * const eventLoop = wxEventLoop::GetActive();
if ( eventLoop )
{ {
while (wxEventLoop::GetActive()->Pending()) while (eventLoop->Pending())
wxEventLoop::GetActive()->Dispatch(); eventLoop->Dispatch();
} }
/* it's necessary to call ProcessIdle() to update the frames sizes which /* it's necessary to call ProcessIdle() to update the frames sizes which

View File

@@ -123,7 +123,7 @@ wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const
return wxPORT_MGL; return wxPORT_MGL;
} }
wxEventLoop* wxGUIAppTraits::CreateEventLoop() wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
{ {
return new wxEventLoop; return new wxEventLoop;
} }

View File

@@ -136,7 +136,7 @@ wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const
return wxPORT_MOTIF; return wxPORT_MOTIF;
} }
wxEventLoop* wxGUIAppTraits::CreateEventLoop() wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
{ {
return new wxEventLoop; return new wxEventLoop;
} }

View File

@@ -213,7 +213,7 @@ bool wxGUIAppTraits::DoMessageFromThreadWait()
{ {
// we should return false only if the app should exit, i.e. only if // we should return false only if the app should exit, i.e. only if
// Dispatch() determines that the main event loop should terminate // Dispatch() determines that the main event loop should terminate
wxEventLoop *evtLoop = wxEventLoop::GetActive(); wxEventLoopBase * const evtLoop = wxEventLoop::GetActive();
if ( !evtLoop || !evtLoop->Pending() ) if ( !evtLoop || !evtLoop->Pending() )
{ {
// no events means no quit event // no events means no quit event
@@ -271,7 +271,7 @@ wxTimerImpl *wxGUIAppTraits::CreateTimerImpl(wxTimer *timer)
return new wxMSWTimerImpl(timer); return new wxMSWTimerImpl(timer);
} }
wxEventLoop* wxGUIAppTraits::CreateEventLoop() wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
{ {
return new wxEventLoop; return new wxEventLoop;
} }

View File

@@ -87,7 +87,7 @@ wxTimerImpl *wxConsoleAppTraits::CreateTimerImpl(wxTimer *timer)
return new wxMSWTimerImpl(timer); return new wxMSWTimerImpl(timer);
} }
wxEventLoop *wxConsoleAppTraits::CreateEventLoop() wxEventLoopBase *wxConsoleAppTraits::CreateEventLoop()
{ {
return new wxEventLoop(); return new wxEventLoop();
} }

View File

@@ -268,7 +268,7 @@ wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer)
return new wxOS2TimerImpl(timer); return new wxOS2TimerImpl(timer);
} }
wxEventLoop* wxGUIAppTraits::CreateEventLoop() wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
{ {
return new wxEventLoop; return new wxEventLoop;
} }

View File

@@ -125,7 +125,7 @@ wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer)
return new wxPalmOSTimerImpl(timer); return new wxPalmOSTimerImpl(timer);
}; };
wxEventLoop* wxGUIAppTraits::CreateEventLoop() wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
{ {
return new wxEventLoop; return new wxEventLoop;
} }

View File

@@ -90,7 +90,7 @@ wxTimerImpl *wxConsoleAppTraits::CreateTimerImpl(wxTimer *timer)
return new wxUnixTimerImpl(timer); return new wxUnixTimerImpl(timer);
} }
wxEventLoop *wxConsoleAppTraits::CreateEventLoop() wxEventLoopBase *wxConsoleAppTraits::CreateEventLoop()
{ {
return new wxEventLoop(); return new wxEventLoop();
} }

View File

@@ -796,7 +796,7 @@ bool wxApp::Yield(bool onlyIfNeeded)
// Make sure we have an event loop object, // Make sure we have an event loop object,
// or Pending/Dispatch will fail // or Pending/Dispatch will fail
wxEventLoop* eventLoop = wxEventLoop::GetActive(); wxEventLoopBase * const eventLoop = wxEventLoop::GetActive();
wxEventLoop* newEventLoop = NULL; wxEventLoop* newEventLoop = NULL;
if (!eventLoop) if (!eventLoop)
{ {

View File

@@ -171,7 +171,7 @@ wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const
return wxPORT_X11; return wxPORT_X11;
} }
wxEventLoop* wxGUIAppTraits::CreateEventLoop() wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
{ {
return new wxEventLoop; return new wxEventLoop;
} }