]> git.saurik.com Git - wxWidgets.git/commitdiff
don't define wxEventLoop class differently in GUI and base, this breaks the
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 22 May 2007 02:30:01 +0000 (02:30 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 22 May 2007 02:30:01 +0000 (02:30 +0000)
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

24 files changed:
include/wx/app.h
include/wx/apptrait.h
include/wx/evtloop.h
include/wx/msdos/apptrait.h
include/wx/msw/apptrait.h
include/wx/unix/apptrait.h
src/cocoa/utils.mm
src/common/appbase.cpp
src/common/evtloopcmn.cpp
src/dfb/app.cpp
src/dfb/utils.cpp
src/gtk/utilsgtk.cpp
src/gtk1/utilsgtk.cpp
src/mac/carbon/utils.cpp
src/mgl/app.cpp
src/mgl/utils.cpp
src/motif/utils.cpp
src/msw/app.cpp
src/msw/basemsw.cpp
src/os2/utilsgui.cpp
src/palmos/app.cpp
src/unix/baseunix.cpp
src/x11/app.cpp
src/x11/utils.cpp

index f744a92ecb8450e3928ea7147f2a0d7771846b95..5dfe9a037d65736f06bf5a0639a5e17c7e7cec85 100644 (file)
 class WXDLLIMPEXP_BASE wxAppConsole;
 class WXDLLIMPEXP_BASE wxAppTraits;
 class WXDLLIMPEXP_BASE wxCmdLineParser;
-class WXDLLIMPEXP_BASE wxEventLoop;
+class WXDLLIMPEXP_BASE wxEventLoopBase;
 class WXDLLIMPEXP_BASE wxLog;
 class WXDLLIMPEXP_BASE wxMessageOutput;
 
 #if wxUSE_GUI
-    class WXDLLEXPORT wxEventLoop;
     struct WXDLLIMPEXP_CORE wxVideoMode;
 #endif
 
@@ -327,7 +326,7 @@ protected:
 
     // create main loop from AppTraits or return NULL if
     // there is no main loop implementation
-    wxEventLoop *CreateMainLoop();
+    wxEventLoopBase *CreateMainLoop();
 
     // application info (must be set from the user code)
     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
     // 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
     // copying it
index 6d6084e3a1199a95c677c19cd035091d6e2436d6..d9147fdd24423c113a191f180e816d1e6a2cffa5 100644 (file)
@@ -18,7 +18,7 @@
 class WXDLLIMPEXP_BASE wxArrayString;
 class WXDLLIMPEXP_BASE wxObject;
 class WXDLLEXPORT wxAppTraits;
-class WXDLLIMPEXP_BASE wxEventLoop;
+class WXDLLIMPEXP_BASE wxEventLoopBase;
 #if wxUSE_FONTMAP
     class WXDLLEXPORT wxFontMapper;
 #endif // wxUSE_FONTMAP
@@ -122,7 +122,7 @@ public:
 #endif
 
     // create a new, port specific, instance of the event loop used by wxApp
-    virtual wxEventLoop *CreateEventLoop() = 0;
+    virtual wxEventLoopBase *CreateEventLoop() = 0;
 
 #if wxUSE_TIMER
     // return platform and toolkit dependent wxTimer implementation
index ff0ee61d3fb8456b88c90f39c447d18ba7f4a240..254f8fe0783f1f3e322d11bf6fe10829aeac6cac 100644 (file)
@@ -14,8 +14,6 @@
 
 #include "wx/utils.h"
 
-class WXDLLEXPORT wxEventLoop;
-
 // ----------------------------------------------------------------------------
 // wxEventLoopBase: interface for wxEventLoop
 // ----------------------------------------------------------------------------
@@ -46,10 +44,10 @@ public:
     virtual bool Dispatch() = 0;
 
     // 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
-    static void SetActive(wxEventLoop* loop) { ms_activeLoop = loop; }
+    static void SetActive(wxEventLoopBase* loop) { ms_activeLoop = loop; }
 
     // is this event loop running now?
     //
@@ -69,7 +67,7 @@ protected:
 
 
     // the pointer to currently active loop
-    static wxEventLoop *ms_activeLoop;
+    static wxEventLoopBase *ms_activeLoop;
 
     DECLARE_NO_COPY_CLASS(wxEventLoopBase)
 };
@@ -151,13 +149,18 @@ protected:
     #include "wx/unix/evtloop.h"
 #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
-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 { };
+    class wxEventLoop : public wxGUIEventLoop { };
+#else // !GUI
+    // we can't define wxEventLoop differently in GUI and base libraries so use
+    // a #define to still allow writing wxEventLoop in the user code
+    #if defined(__WXMSW__) || defined(__UNIX__)
+        #define wxEventLoop wxConsoleEventLoop
+    #else // we still must define it somehow for the code below...
+        #define wxEventLoop wxEventLoopBase
+    #endif
 #endif
 
 inline bool wxEventLoopBase::IsRunning() const { return GetActive() == this; }
@@ -207,7 +210,7 @@ public:
     wxEventLoopActivator(wxEventLoopBase *evtLoop)
     {
         m_evtLoopOld = wxEventLoopBase::GetActive();
-        wxEventLoopBase::SetActive(wx_static_cast(wxEventLoop *, evtLoop));
+        wxEventLoopBase::SetActive(evtLoop);
     }
 
     ~wxEventLoopActivator()
@@ -217,7 +220,7 @@ public:
     }
 
 private:
-    wxEventLoop *m_evtLoopOld;
+    wxEventLoopBase *m_evtLoopOld;
 };
 
 #endif // _WX_EVTLOOP_H_
index 6790aaec3f5c29397431baa0e49e0eff9c3ab036..6b377ff7a1cea7902c4c0f2382d384ea845a7a49 100644 (file)
@@ -12,7 +12,7 @@
 class wxConsoleAppTraits : public wxConsoleAppTraitsBase
 {
 public:
-    virtual wxEventLoop *CreateEventLoop() { return NULL; }
+    virtual wxEventLoopBase *CreateEventLoop() { return NULL; }
 #if wxUSE_TIMER
     virtual wxTimerImpl *CreateTimerImpl(wxTimer *) { return NULL; }
 #endif // wxUSE_TIMER
@@ -23,7 +23,7 @@ public:
 class wxGUIAppTraits : public wxGUIAppTraitsBase
 {
 public:
-    virtual wxEventLoop *CreateEventLoop();
+    virtual wxEventLoopBase *CreateEventLoop();
     virtual wxPortId GetToolkitVersion(int *majVer, int *minVer) const;
 
 #if wxUSE_TIMER
index 276d4ec0b5a0306a0f67a5c04478df9af281ca6c..40cf996c8db9c23104fb573e6334f02e25405da3 100644 (file)
@@ -19,7 +19,7 @@
 class WXDLLIMPEXP_BASE wxConsoleAppTraits : public wxConsoleAppTraitsBase
 {
 public:
-    virtual wxEventLoop *CreateEventLoop();
+    virtual wxEventLoopBase *CreateEventLoop();
     virtual void *BeforeChildWaitLoop();
     virtual void AlwaysYield();
     virtual void AfterChildWaitLoop(void *data);
@@ -35,7 +35,7 @@ public:
 class WXDLLIMPEXP_CORE wxGUIAppTraits : public wxGUIAppTraitsBase
 {
 public:
-    virtual wxEventLoop *CreateEventLoop();
+    virtual wxEventLoopBase *CreateEventLoop();
     virtual void *BeforeChildWaitLoop();
     virtual void AlwaysYield();
     virtual void AfterChildWaitLoop(void *data);
index aa8a3b0f83d4753efece2d5acd60235ef69dcc8d..b8de87f3934be2e20e21706b92fc6c000c1b1534 100644 (file)
@@ -19,7 +19,7 @@
 class WXDLLEXPORT wxConsoleAppTraits : public wxConsoleAppTraitsBase
 {
 public:
-    virtual wxEventLoop *CreateEventLoop();
+    virtual wxEventLoopBase *CreateEventLoop();
     virtual bool CreateEndProcessPipe(wxExecuteData& execData);
     virtual bool IsWriteFDOfEndProcessPipe(wxExecuteData& execData, int fd);
     virtual void DetachWriteFDOfEndProcessPipe(wxExecuteData& execData);
@@ -34,7 +34,7 @@ public:
 class WXDLLEXPORT wxGUIAppTraits : public wxGUIAppTraitsBase
 {
 public:
-    virtual wxEventLoop *CreateEventLoop();
+    virtual wxEventLoopBase *CreateEventLoop();
     virtual bool CreateEndProcessPipe(wxExecuteData& execData);
     virtual bool IsWriteFDOfEndProcessPipe(wxExecuteData& execData, int fd);
     virtual void DetachWriteFDOfEndProcessPipe(wxExecuteData& execData);
index c6958cfa437cadb4a85d26cc08c39fa532b62668..462b68de614d78c2312242fcaf208fd765a84919 100644 (file)
@@ -73,12 +73,9 @@ wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer* timer)
     return new wxCocoaTimerImpl(timer);
 }
 
-wxEventLoop* wxGUIAppTraits::CreateEventLoop()
+wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
 {
-    // MAJOR HACK: wxEventLoop is implemented in both core and base libraries.
-    // 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);
+    return new wxGUIEventLoop;
 }
 
 wxWindow* wxFindWindowAtPoint(const wxPoint& pt)
index aeeb572a1bc87f41ee2a50007f279103ed691a02..9fdb525f7796dce16b7cad00b07b0f6dbbe28dd4 100644 (file)
@@ -119,7 +119,7 @@ wxAppInitializerFunction wxAppConsole::ms_appInitFn = NULL;
 // ----------------------------------------------------------------------------
 
 // this defines wxEventLoopPtr
-wxDEFINE_TIED_SCOPED_PTR_TYPE(wxEventLoop)
+wxDEFINE_TIED_SCOPED_PTR_TYPE(wxEventLoopBase)
 
 // ============================================================================
 // wxAppConsole implementation
@@ -185,7 +185,7 @@ bool wxAppConsole::Initialize(int& argcOrig, wxChar **argvOrig)
     return true;
 }
 
-wxEventLoop *wxAppConsole::CreateMainLoop()
+wxEventLoopBase *wxAppConsole::CreateMainLoop()
 {
     return GetTraits()->CreateEventLoop();
 }
@@ -290,7 +290,7 @@ wxAppTraits *wxAppConsole::GetTraits()
 
 int wxAppConsole::MainLoop()
 {
-    wxEventLoopTiedPtr mainLoop(&m_mainLoop, CreateMainLoop());
+    wxEventLoopBaseTiedPtr mainLoop(&m_mainLoop, CreateMainLoop());
 
     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
     // we're showing a modal dialog (with its own event loop) currently the
     // main event loop is not running anyhow
-    wxEventLoop * const loop = wxEventLoopBase::GetActive();
+    wxEventLoopBase * const loop = wxEventLoopBase::GetActive();
 
     return loop && loop->Pending();
 }
@@ -318,7 +318,7 @@ bool wxAppConsole::Pending()
 bool wxAppConsole::Dispatch()
 {
     // see comment in Pending()
-    wxEventLoop * const loop = wxEventLoopBase::GetActive();
+    wxEventLoopBase * const loop = wxEventLoopBase::GetActive();
 
     return loop && loop->Dispatch();
 }
index ccbbb71126095d4f65a139584497ed9f41e6e6ca..e90bf2f2eb3c8c1a23eff7b9dcc3e0b55bf863df 100644 (file)
@@ -34,7 +34,7 @@
 // globals
 // ----------------------------------------------------------------------------
 
-wxEventLoop *wxEventLoopBase::ms_activeLoop = NULL;
+wxEventLoopBase *wxEventLoopBase::ms_activeLoop = NULL;
 
 // wxEventLoopManual is unused in the other ports
 #if defined(__WXMSW__) || defined(__WXMAC__) || defined(__WXDFB__) || (defined(__UNIX__) && !wxUSE_GUI)
index c78010f0816db707249c552bde4f1029a81e6b37..bfde03508efa4fb9ba67e793a3de3b3cfb8c8fcf 100644 (file)
@@ -156,7 +156,7 @@ void wxApp::WakeUpIdle()
         wxMutexGuiEnter();
 #endif
 
-    wxEventLoop * const loop = wxEventLoop::GetActive();
+    wxEventLoopBase * const loop = wxEventLoop::GetActive();
     if ( loop )
         loop->WakeUp();
 
@@ -190,7 +190,8 @@ bool wxApp::Yield(bool onlyIfNeeded)
 
     wxLog::Suspend();
 
-    wxEventLoop * const loop = wxEventLoop::GetActive();
+    wxEventLoop * const
+        loop = wx_static_cast(wxEventLoop *, wxEventLoop::GetActive());
     if ( loop )
         loop->Yield();
 
index 78240916a9dda1657a3aaa36b47f0be2abe3f9d5..385616fb95cc2f6578b0ded5de4592c6f7668124 100644 (file)
@@ -40,10 +40,11 @@ wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const
 }
 
 
-wxEventLoop* wxGUIAppTraits::CreateEventLoop()
+wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
 {
     return new wxEventLoop;
-};
+}
+
 // ----------------------------------------------------------------------------
 // display characteristics
 // ----------------------------------------------------------------------------
index 7f0a931e38c12030450b82a2280977f4dae3d84a..445a5f3bb707c8fada1c01c63238b1e0fd0c8fd0 100644 (file)
@@ -364,7 +364,7 @@ static wxString GetSM()
 // wxGUIAppTraits
 //-----------------------------------------------------------------------------
 
-wxEventLoop *wxGUIAppTraits::CreateEventLoop()
+wxEventLoopBase *wxGUIAppTraits::CreateEventLoop()
 {
     return new wxEventLoop();
 }
index 8e8b604bdac9b34cf1b541570ee05df8e0212ece..7cd7c37ef9dd33dbe976155ac193c66f8eca9bff 100644 (file)
@@ -203,7 +203,7 @@ wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const
     return wxPORT_GTK;
 }
 
-wxEventLoop* wxGUIAppTraits::CreateEventLoop()
+wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
 {
     return new wxEventLoop;
 }
index 696fe6e94ec6f5157c6208c5c248f3215ec24ef7..edf0c4a45cbf4aa6f8637b9501a6242a10c86fbe 100644 (file)
@@ -381,7 +381,7 @@ wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const
     return wxPORT_MAC;
 }
 
-wxEventLoop* wxGUIAppTraits::CreateEventLoop()
+wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
 {
     return new wxEventLoop;
 }
index 1a614e3f81d87b2988f9bec4fcda0f7f5cd45f92..f94600c41e0a15346d8efa0efde8b3b7b2bd6526 100644 (file)
@@ -74,10 +74,11 @@ bool wxApp::Yield(bool onlyIfNeeded)
 
     wxLog::Suspend();
 
-    if ( wxEventLoop::GetActive() )
+    wxEventLoopBase * const eventLoop = wxEventLoop::GetActive();
+    if ( eventLoop )
     {
-        while (wxEventLoop::GetActive()->Pending())
-            wxEventLoop::GetActive()->Dispatch();
+        while (eventLoop->Pending())
+            eventLoop->Dispatch();
     }
 
     /* it's necessary to call ProcessIdle() to update the frames sizes which
index 4a3045cef110d3337f2044ad4125c9c9b4415444..114277e970139d06f4fd1aa776415f2f24e201dd 100644 (file)
@@ -123,7 +123,7 @@ wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const
     return wxPORT_MGL;
 }
 
-wxEventLoop* wxGUIAppTraits::CreateEventLoop()
+wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
 {
     return new wxEventLoop;
 }
index e6309b2e51992f64fbda84131a8b43d691cbfc09..b56aa96fe70358491d24768d92b4511a98bedf3e 100644 (file)
@@ -136,7 +136,7 @@ wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const
     return wxPORT_MOTIF;
 }
 
-wxEventLoop* wxGUIAppTraits::CreateEventLoop()
+wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
 {
     return new wxEventLoop;
 }
index 549a8d77daf34554abcc1ead56fdfbae257d4a44..28e359be38958f13b472c22a80ed5bcbd8326a2c 100644 (file)
@@ -213,7 +213,7 @@ bool wxGUIAppTraits::DoMessageFromThreadWait()
 {
     // we should return false only if the app should exit, i.e. only if
     // Dispatch() determines that the main event loop should terminate
-    wxEventLoop *evtLoop = wxEventLoop::GetActive();
+    wxEventLoopBase * const evtLoop = wxEventLoop::GetActive();
     if ( !evtLoop || !evtLoop->Pending() )
     {
         // no events means no quit event
@@ -271,7 +271,7 @@ wxTimerImpl *wxGUIAppTraits::CreateTimerImpl(wxTimer *timer)
     return new wxMSWTimerImpl(timer);
 }
 
-wxEventLoop* wxGUIAppTraits::CreateEventLoop()
+wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
 {
     return new wxEventLoop;
 }
index 1989549dc18bc594d4b77649e04d37fdbab4f4ed..754dbc7ea35e9204fd9246db4d9b78b56be35406 100644 (file)
@@ -87,7 +87,7 @@ wxTimerImpl *wxConsoleAppTraits::CreateTimerImpl(wxTimer *timer)
     return new wxMSWTimerImpl(timer);
 }
 
-wxEventLoop *wxConsoleAppTraits::CreateEventLoop()
+wxEventLoopBase *wxConsoleAppTraits::CreateEventLoop()
 {
     return new wxEventLoop();
 }
index 75ab669b22728eb0f741b0882dd6841e7c1f55cd..79b584d217c3ec4ca63810751e61c21f1c419553 100644 (file)
@@ -268,7 +268,7 @@ wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer)
     return new wxOS2TimerImpl(timer);
 }
 
-wxEventLoop* wxGUIAppTraits::CreateEventLoop()
+wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
 {
     return new wxEventLoop;
 }
index 1344607c9fda60f23c3d721c1aed09e736ac8f78..7efb190ac698656600db3e8dd11947fd62fadca2 100644 (file)
@@ -125,7 +125,7 @@ wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer)
     return new wxPalmOSTimerImpl(timer);
 };
 
-wxEventLoop* wxGUIAppTraits::CreateEventLoop()
+wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
 {
     return new wxEventLoop;
 }
index 9dd19ba0200248ec7aa0790dd03a9ab27bdca829..16aa2c8c5850da1b9a78475e6a61bc332f4ddb5d 100644 (file)
@@ -90,7 +90,7 @@ wxTimerImpl *wxConsoleAppTraits::CreateTimerImpl(wxTimer *timer)
     return new wxUnixTimerImpl(timer);
 }
 
-wxEventLoop *wxConsoleAppTraits::CreateEventLoop()
+wxEventLoopBase *wxConsoleAppTraits::CreateEventLoop()
 {
     return new wxEventLoop();
 }
index ab6b3fc909699910578bcb7869bc1bb0e175ae79..9677cf46fcac7587f34000aa19aebc2c9e7e80ee 100644 (file)
@@ -796,7 +796,7 @@ bool wxApp::Yield(bool onlyIfNeeded)
 
         // Make sure we have an event loop object,
         // or Pending/Dispatch will fail
-        wxEventLoop* eventLoop = wxEventLoop::GetActive();
+        wxEventLoopBase * const eventLoop = wxEventLoop::GetActive();
         wxEventLoop* newEventLoop = NULL;
         if (!eventLoop)
         {
index 7448c3ab2407bc78390a850cdf212c3649a009cd..2f06547b2d5e431ba2a609926a576cac4e397676 100644 (file)
@@ -171,7 +171,7 @@ wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const
     return wxPORT_X11;
 }
 
-wxEventLoop* wxGUIAppTraits::CreateEventLoop()
+wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
 {
     return new wxEventLoop;
 }