X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d6f2a8911e509fd9e61f881cc881a97f5aa05ae8..ba86da30cf1a2a8429f3af465cbb6c9f52b307fb:/src/common/appbase.cpp diff --git a/src/common/appbase.cpp b/src/common/appbase.cpp index 339fe276c4..81dacee807 100644 --- a/src/common/appbase.cpp +++ b/src/common/appbase.cpp @@ -42,37 +42,27 @@ #include "wx/evtloop.h" #include "wx/filename.h" #include "wx/msgout.h" -#include "wx/ptr_scpd.h" +#include "wx/scopedptr.h" #include "wx/tokenzr.h" +#include "wx/thread.h" #if wxUSE_EXCEPTIONS && wxUSE_STL #include #include #endif +#ifndef __WXPALMOS5__ #if !defined(__WXMSW__) || defined(__WXMICROWIN__) #include // for SIGTRAP used by wxTrap() #endif //Win/Unix #include +#endif // ! __WXPALMOS5__ #if wxUSE_FONTMAP #include "wx/fontmap.h" #endif // wxUSE_FONTMAP -#if defined(__DARWIN__) && defined(_MSL_USING_MW_C_HEADERS) && _MSL_USING_MW_C_HEADERS - // For MacTypes.h for Debugger function - #include -#endif - -#if defined(__WXMAC__) - #ifdef __DARWIN__ - #include - #else - #include "wx/mac/private.h" // includes mac headers - #endif -#endif // __WXMAC__ - #ifdef __WXDEBUG__ #if wxUSE_STACKWALKER #include "wx/stackwalk.h" @@ -80,6 +70,8 @@ #include "wx/msw/debughlp.h" #endif #endif // wxUSE_STACKWALKER + + #include "wx/recguard.h" #endif // __WXDEBUG__ // wxABI_VERSION can be defined when compiling applications but it should be @@ -119,6 +111,8 @@ wxAppConsole *wxAppConsoleBase::ms_appInstance = NULL; wxAppInitializerFunction wxAppConsoleBase::ms_appInitFn = NULL; +wxSocketManager *wxAppTraitsBase::ms_manager = NULL; + // ---------------------------------------------------------------------------- // wxEventLoopPtr // ---------------------------------------------------------------------------- @@ -139,7 +133,7 @@ wxAppConsoleBase::wxAppConsoleBase() m_traits = NULL; m_mainLoop = NULL; - ms_appInstance = wx_static_cast(wxAppConsole *, this); + ms_appInstance = static_cast(this); #ifdef __WXDEBUG__ SetTraceMasks(); @@ -159,25 +153,17 @@ wxAppConsoleBase::~wxAppConsoleBase() } // ---------------------------------------------------------------------------- -// initilization/cleanup +// initialization/cleanup // ---------------------------------------------------------------------------- -bool wxAppConsoleBase::Initialize(int& argcOrig, wxChar **argvOrig) +bool wxAppConsoleBase::Initialize(int& WXUNUSED(argc), wxChar **argv) { #if wxUSE_INTL GetTraits()->SetLocale(); #endif // wxUSE_INTL - // remember the command line arguments - argc = argcOrig; - argv = argvOrig; - -#if wxUSE_THREADS - wxPendingEventsLocker = new wxCriticalSection; -#endif - #ifndef __WXPALMOS__ - if ( m_appName.empty() && argv ) + if ( m_appName.empty() && argv && argv[0] ) { // the application name is, by default, the name of its executable file wxFileName::SplitPath(argv[0], NULL, &m_appName, NULL); @@ -199,14 +185,6 @@ void wxAppConsoleBase::CleanUp() delete m_mainLoop; m_mainLoop = NULL; } - - delete wxPendingEvents; - wxPendingEvents = NULL; - -#if wxUSE_THREADS - delete wxPendingEventsLocker; - wxPendingEventsLocker = NULL; -#endif // wxUSE_THREADS } // ---------------------------------------------------------------------------- @@ -253,7 +231,7 @@ int wxAppConsoleBase::OnExit() #if wxUSE_CONFIG // delete the config object if any (don't use Get() here, but Set() // because Get() could create a new config object) - delete wxConfigBase::Set((wxConfigBase *) NULL); + delete wxConfigBase::Set(NULL); #endif // wxUSE_CONFIG return 0; @@ -289,8 +267,15 @@ wxAppTraits *wxAppConsoleBase::GetTraits() return m_traits; } +/* static */ +wxAppTraits *wxAppConsoleBase::GetTraitsIfExists() +{ + wxAppConsole * const app = GetInstance(); + return app ? app->GetTraits() : NULL; +} + // ---------------------------------------------------------------------------- -// event processing +// wxEventLoop redirection // ---------------------------------------------------------------------------- int wxAppConsoleBase::MainLoop() @@ -330,54 +315,37 @@ bool wxAppConsoleBase::Dispatch() bool wxAppConsoleBase::HasPendingEvents() const { - wxENTER_CRIT_SECT( *wxPendingEventsLocker ); + wxEventLoopBase * const loop = wxEventLoopBase::GetActive(); - bool has = wxPendingEvents && !wxPendingEvents->IsEmpty(); + return loop && loop->HasPendingEvents(); +} - wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); +void wxAppConsoleBase::SuspendProcessingOfPendingEvents() +{ + wxEventLoopBase * const loop = wxEventLoopBase::GetActive(); - return has; + if (loop) loop->SuspendProcessingOfPendingEvents(); } -/* static */ -bool wxAppConsoleBase::IsMainLoopRunning() +void wxAppConsoleBase::ResumeProcessingOfPendingEvents() { - const wxAppConsole * const app = GetInstance(); + wxEventLoopBase * const loop = wxEventLoopBase::GetActive(); - return app && app->m_mainLoop != NULL; + if (loop) loop->ResumeProcessingOfPendingEvents(); } void wxAppConsoleBase::ProcessPendingEvents() { -#if wxUSE_THREADS - if ( !wxPendingEventsLocker ) - return; -#endif - - wxENTER_CRIT_SECT( *wxPendingEventsLocker ); - - if (wxPendingEvents) - { - // iterate until the list becomes empty - wxList::compatibility_iterator node = wxPendingEvents->GetFirst(); - while (node) - { - wxEvtHandler *handler = (wxEvtHandler *)node->GetData(); - wxPendingEvents->Erase(node); - - // In ProcessPendingEvents(), new handlers might be add - // and we can safely leave the critical section here. - wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); - - handler->ProcessPendingEvents(); + wxEventLoopBase * const loop = wxEventLoopBase::GetActive(); - wxENTER_CRIT_SECT( *wxPendingEventsLocker ); + if (loop) loop->ProcessPendingEvents(); +} - node = wxPendingEvents->GetFirst(); - } - } +bool wxAppConsoleBase::Yield(bool onlyIfNeeded) +{ + wxEventLoopBase * const loop = wxEventLoopBase::GetActive(); - wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); + return loop && loop->Yield(onlyIfNeeded); } void wxAppConsoleBase::WakeUpIdle() @@ -388,11 +356,21 @@ void wxAppConsoleBase::WakeUpIdle() bool wxAppConsoleBase::ProcessIdle() { - wxIdleEvent event; + wxEventLoopBase * const loop = wxEventLoopBase::GetActive(); + + return loop && loop->ProcessIdle(); +} + +// ---------------------------------------------------------------------------- +// events +// ---------------------------------------------------------------------------- + +/* static */ +bool wxAppConsoleBase::IsMainLoopRunning() +{ + const wxAppConsole * const app = GetInstance(); - event.SetEventObject(this); - ProcessEvent(event); - return event.MoreRequested(); + return app && app->m_mainLoop != NULL; } int wxAppConsoleBase::FilterEvent(wxEvent& WXUNUSED(event)) @@ -416,6 +394,20 @@ wxAppConsoleBase::HandleEvent(wxEvtHandler *handler, (handler->*func)(event); } +void wxAppConsoleBase::CallEventHandler(wxEvtHandler *handler, + wxEventFunctor& functor, + wxEvent& event) const +{ + // If the functor holds a method then, for backward compatibility, call + // HandleEvent(): + wxEventFunction eventFunction = functor.GetMethod(); + + if ( eventFunction ) + HandleEvent(handler, eventFunction, event); + else + functor(handler, event); +} + void wxAppConsoleBase::OnUnhandledException() { #ifdef __WXDEBUG__ @@ -466,7 +458,7 @@ bool wxAppConsoleBase::OnExceptionInMainLoop() #if wxUSE_CMDLINE_PARSER -#define OPTION_VERBOSE _T("verbose") +#define OPTION_VERBOSE "verbose" void wxAppConsoleBase::OnInitCmdLine(wxCmdLineParser& parser) { @@ -475,8 +467,8 @@ void wxAppConsoleBase::OnInitCmdLine(wxCmdLineParser& parser) { { wxCMD_LINE_SWITCH, - _T("h"), - _T("help"), + "h", + "help", gettext_noop("show this help message"), wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP @@ -485,7 +477,7 @@ void wxAppConsoleBase::OnInitCmdLine(wxCmdLineParser& parser) #if wxUSE_LOG { wxCMD_LINE_SWITCH, - wxEmptyString, + NULL, OPTION_VERBOSE, gettext_noop("generate verbose log messages"), wxCMD_LINE_VAL_NONE, @@ -494,14 +486,7 @@ void wxAppConsoleBase::OnInitCmdLine(wxCmdLineParser& parser) #endif // wxUSE_LOG // terminator - { - wxCMD_LINE_NONE, - wxEmptyString, - wxEmptyString, - wxEmptyString, - wxCMD_LINE_VAL_NONE, - 0x0 - } + wxCMD_LINE_DESC_END }; parser.SetDesc(cmdLineDesc); @@ -565,7 +550,6 @@ bool wxAppConsoleBase::CheckBuildOptions(const char *optionsSignature, // normally wxLogFatalError doesn't return return false; } -#undef wxCMP return true; } @@ -651,13 +635,6 @@ void wxConsoleAppTraitsBase::RemoveFromPendingDelete(wxObject * WXUNUSED(object) // nothing to do } -#if wxUSE_SOCKETS -GSocketGUIFunctionsTable* wxConsoleAppTraitsBase::GetSocketGUIFunctionsTable() -{ - return NULL; -} -#endif - // ---------------------------------------------------------------------------- // wxAppTraits // ---------------------------------------------------------------------------- @@ -670,6 +647,35 @@ void wxAppTraitsBase::SetLocale() } #endif +#if wxUSE_THREADS +void wxMutexGuiEnterImpl(); +void wxMutexGuiLeaveImpl(); + +void wxAppTraitsBase::MutexGuiEnter() +{ + wxMutexGuiEnterImpl(); +} + +void wxAppTraitsBase::MutexGuiLeave() +{ + wxMutexGuiLeaveImpl(); +} + +void WXDLLIMPEXP_BASE wxMutexGuiEnter() +{ + wxAppTraits * const traits = wxAppConsoleBase::GetTraitsIfExists(); + if ( traits ) + traits->MutexGuiEnter(); +} + +void WXDLLIMPEXP_BASE wxMutexGuiLeave() +{ + wxAppTraits * const traits = wxAppConsoleBase::GetTraitsIfExists(); + if ( traits ) + traits->MutexGuiLeave(); +} +#endif // wxUSE_THREADS + #ifdef __WXDEBUG__ bool wxAppTraitsBase::ShowAssertDialog(const wxString& msgOriginal) @@ -797,12 +803,6 @@ void wxTrap() { #if defined(__WXMSW__) && !defined(__WXMICROWIN__) DebugBreak(); -#elif defined(__WXMAC__) && !defined(__DARWIN__) - #if __powerc - Debugger(); - #else - SysBreak(); - #endif #elif defined(_MSL_USING_MW_C_HEADERS) && _MSL_USING_MW_C_HEADERS Debugger(); #elif defined(__UNIX__) @@ -820,20 +820,17 @@ static void wxDoOnAssert(const wxString& szFile, const wxString& szMsg = wxEmptyString) { // FIXME MT-unsafe - static bool s_bInAssert = false; + static int s_bInAssert = 0; - if ( s_bInAssert ) + wxRecursionGuard guard(s_bInAssert); + if ( guard.IsInside() ) { - // He-e-e-e-elp!! we're trapped in endless loop + // can't use assert here to avoid infinite loops, so just trap wxTrap(); - s_bInAssert = false; - return; } - s_bInAssert = true; - if ( !wxTheApp ) { // by default, show the assert dialog box -- we can't customize this @@ -847,8 +844,6 @@ static void wxDoOnAssert(const wxString& szFile, wxTheApp->OnAssertFailure(szFile.c_str(), nLine, szFunc.c_str(), szCond.c_str(), szMsg.c_str()); } - - s_bInAssert = false; } void wxOnAssert(const wxString& szFile, @@ -944,6 +939,7 @@ static void LINKAGEMODE SetTraceMasks() #endif // wxUSE_LOG } +static bool DoShowAssertDialog(const wxString& msg) { // under MSW we can show the dialog even in the console mode