X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4629016dfb6b082542523aa70b3beff197a2d139..f5bed7a885024108682c32c74567cdf7bf2ed13b:/src/common/appcmn.cpp diff --git a/src/common/appcmn.cpp b/src/common/appcmn.cpp index 335d9ec82b..516a0acf10 100644 --- a/src/common/appcmn.cpp +++ b/src/common/appcmn.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: common/appcmn.cpp +// Name: src/common/appcmn.cpp // Purpose: wxAppConsole and wxAppBase methods common to all platforms // Author: Vadim Zeitlin // Modified by: @@ -17,10 +17,6 @@ // headers // --------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "appbase.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -29,14 +25,14 @@ #endif #ifndef WX_PRECOMP + #include "wx/list.h" #include "wx/app.h" #include "wx/bitmap.h" #include "wx/intl.h" - #include "wx/list.h" #include "wx/log.h" #include "wx/msgdlg.h" - #include "wx/bitmap.h" #include "wx/confbase.h" + #include "wx/utils.h" #endif #include "wx/apptrait.h" @@ -44,11 +40,10 @@ #include "wx/evtloop.h" #include "wx/msgout.h" #include "wx/thread.h" -#include "wx/utils.h" #include "wx/ptr_scpd.h" #if defined(__WXMSW__) - #include "wx/msw/private.h" // includes windows.h for LOGFONT + #include "wx/msw/private.h" // includes windows.h for LOGFONT #endif #if wxUSE_FONTMAP @@ -59,13 +54,14 @@ #include "wx/build.h" WX_CHECK_BUILD_OPTIONS("wxCore") +WXDLLIMPEXP_DATA_CORE(wxList) wxPendingDelete; // ---------------------------------------------------------------------------- // wxEventLoopPtr // ---------------------------------------------------------------------------- // this defines wxEventLoopPtr -wxDEFINE_TIED_SCOPED_PTR_TYPE(wxEventLoop); +wxDEFINE_TIED_SCOPED_PTR_TYPE(wxEventLoop) // ============================================================================ // wxAppBase implementation @@ -81,9 +77,7 @@ wxAppBase::wxAppBase() m_useBestVisual = false; m_isActive = true; -#if wxUSE_EVTLOOP_IN_APP m_mainLoop = NULL; -#endif // wxUSE_EVTLOOP_IN_APP // We don't want to exit the app if the user code shows a dialog from its // OnInit() -- but this is what would happen if we set m_exitOnFrameDelete @@ -100,9 +94,9 @@ wxAppBase::wxAppBase() m_exitOnFrameDelete = Later; } -bool wxAppBase::Initialize(int& argc, wxChar **argv) +bool wxAppBase::Initialize(int& argcOrig, wxChar **argvOrig) { - if ( !wxAppConsole::Initialize(argc, argv) ) + if ( !wxAppConsole::Initialize(argcOrig, argvOrig) ) return false; #if wxUSE_THREADS @@ -110,7 +104,6 @@ bool wxAppBase::Initialize(int& argc, wxChar **argv) #endif wxInitializeStockLists(); - wxInitializeStockObjects(); wxBitmap::InitStandardHandlers(); @@ -128,12 +121,22 @@ wxAppBase::~wxAppBase() void wxAppBase::CleanUp() { - // one last chance for pending objects to be cleaned up + // clean up all the pending objects DeletePendingObjects(); + // and any remaining TLWs (they remove themselves from wxTopLevelWindows + // when destroyed, so iterate until none are left) + while ( !wxTopLevelWindows.empty() ) + { + // do not use Destroy() here as it only puts the TLW in pending list + // but we want to delete them now + delete wxTopLevelWindows.GetFirst()->GetData(); + } + + // undo everything we did in Initialize() above wxBitmap::CleanUpHandlers(); - wxDeleteStockObjects(); + wxStockGDI::DeleteAll(); wxDeleteStockLists(); @@ -174,7 +177,7 @@ void wxAppBase::OnInitCmdLine(wxCmdLineParser& parser) #ifdef __WXUNIVERSAL__ { wxCMD_LINE_OPTION, - _T(""), + wxEmptyString, OPTION_THEME, gettext_noop("specify the theme to use"), wxCMD_LINE_VAL_STRING, @@ -188,7 +191,7 @@ void wxAppBase::OnInitCmdLine(wxCmdLineParser& parser) // and not mgl/app.cpp { wxCMD_LINE_OPTION, - _T(""), + wxEmptyString, OPTION_MODE, gettext_noop("specify display mode to use (e.g. 640x480-16)"), wxCMD_LINE_VAL_STRING, @@ -199,9 +202,9 @@ void wxAppBase::OnInitCmdLine(wxCmdLineParser& parser) // terminator { wxCMD_LINE_NONE, - _T(""), - _T(""), - _T(""), + wxEmptyString, + wxEmptyString, + wxEmptyString, wxCMD_LINE_VAL_NONE, 0x0 } @@ -256,51 +259,37 @@ bool wxAppBase::OnCmdLineParsed(wxCmdLineParser& parser) int wxAppBase::MainLoop() { -#if wxUSE_EVTLOOP_IN_APP wxEventLoopTiedPtr mainLoop(&m_mainLoop, new wxEventLoop); return m_mainLoop->Run(); -#else // !wxUSE_EVTLOOP_IN_APP - return 0; -#endif // wxUSE_EVTLOOP_IN_APP/!wxUSE_EVTLOOP_IN_APP } void wxAppBase::ExitMainLoop() { -#if wxUSE_EVTLOOP_IN_APP // we should exit from the main event loop, not just any currently active // (e.g. modal dialog) event loop if ( m_mainLoop && m_mainLoop->IsRunning() ) { m_mainLoop->Exit(0); } -#endif // wxUSE_EVTLOOP_IN_APP } bool wxAppBase::Pending() { -#if wxUSE_EVTLOOP_IN_APP // 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 = wxEventLoop::GetActive(); return loop && loop->Pending(); -#else // wxUSE_EVTLOOP_IN_APP - return false; -#endif // wxUSE_EVTLOOP_IN_APP/!wxUSE_EVTLOOP_IN_APP } bool wxAppBase::Dispatch() { -#if wxUSE_EVTLOOP_IN_APP // see comment in Pending() wxEventLoop * const loop = wxEventLoop::GetActive(); return loop && loop->Dispatch(); -#else // wxUSE_EVTLOOP_IN_APP - return true; -#endif // wxUSE_EVTLOOP_IN_APP/!wxUSE_EVTLOOP_IN_APP } // ---------------------------------------------------------------------------- @@ -366,6 +355,10 @@ void wxAppBase::SetActive(bool active, wxWindow * WXUNUSED(lastFocus)) (void)ProcessEvent(event); } +// ---------------------------------------------------------------------------- +// idle handling +// ---------------------------------------------------------------------------- + void wxAppBase::DeletePendingObjects() { wxList::compatibility_iterator node = wxPendingDelete.GetFirst(); @@ -457,6 +450,24 @@ void wxAppBase::OnIdle(wxIdleEvent& WXUNUSED(event)) } +// ---------------------------------------------------------------------------- +// exceptions support +// ---------------------------------------------------------------------------- + +#if wxUSE_EXCEPTIONS + +bool wxAppBase::OnExceptionInMainLoop() +{ + throw; + + // some compilers are too stupid to know that we never return after throw +#if defined(__DMC__) || (defined(_MSC_VER) && _MSC_VER < 1200) + return false; +#endif +} + +#endif // wxUSE_EXCEPTIONS + // ---------------------------------------------------------------------------- // wxGUIAppTraitsBase // ---------------------------------------------------------------------------- @@ -468,7 +479,7 @@ wxLog *wxGUIAppTraitsBase::CreateLogTarget() #if wxUSE_LOGGUI return new wxLogGui; #else - // wem ust have something! + // we must have something! return new wxLogStderr; #endif } @@ -570,18 +581,18 @@ void wxGUIAppTraitsBase::RemoveFromPendingDelete(wxObject *object) #if wxUSE_SOCKETS -#if defined(__UNIX__) || defined(__DARWIN__) || defined(__OS2__) - #include "wx/unix/gsockunx.h" -#elif defined(__WINDOWS__) +#if defined(__WINDOWS__) #include "wx/msw/gsockmsw.h" +#elif defined(__UNIX__) || defined(__DARWIN__) || defined(__OS2__) + #include "wx/unix/gsockunx.h" #elif defined(__WXMAC__) - #include - #define OTUNIXERRORS 1 - #include - #include - #include + #include + #define OTUNIXERRORS 1 + #include + #include + #include - #include "wx/mac/gsockmac.h" + #include "wx/mac/gsockmac.h" #else #error "Must include correct GSocket header here" #endif @@ -599,4 +610,3 @@ GSocketGUIFunctionsTable* wxGUIAppTraitsBase::GetSocketGUIFunctionsTable() } #endif -