X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/978af864269a739e77d9431c8465435e3f8f7407..1e510b1e2d0270caf227c3fc0cf34ae2e7dd6794:/src/common/appbase.cpp diff --git a/src/common/appbase.cpp b/src/common/appbase.cpp index fed2b7aab3..53d05a50fd 100644 --- a/src/common/appbase.cpp +++ b/src/common/appbase.cpp @@ -25,6 +25,9 @@ #endif #ifndef WX_PRECOMP + #ifdef __WXMSW__ + #include "wx/msw/wrapwin.h" // includes windows.h for MessageBox() + #endif #include "wx/list.h" #include "wx/app.h" #include "wx/intl.h" @@ -43,9 +46,7 @@ #include // for SIGTRAP used by wxTrap() #endif //Win/Unix -#if defined(__WXMSW__) - #include "wx/msw/wrapwin.h" // includes windows.h for MessageBox() -#endif +#include #if wxUSE_FONTMAP #include "wx/fontmap.h" @@ -147,6 +148,10 @@ wxAppConsole::~wxAppConsole() bool wxAppConsole::Initialize(int& argcOrig, wxChar **argvOrig) { +#if wxUSE_INTL + GetTraits()->SetLocale(); +#endif // wxUSE_INTL + // remember the command line arguments argc = argcOrig; argv = argvOrig; @@ -157,7 +162,7 @@ bool wxAppConsole::Initialize(int& argcOrig, wxChar **argvOrig) // the application name is, by default, the name of its executable file wxFileName::SplitPath(argv[0], NULL, &m_appName, NULL); } -#endif +#endif // !__WXPALMOS__ return true; } @@ -216,24 +221,6 @@ void wxAppConsole::Exit() exit(-1); } -wxLayoutDirection wxAppConsole::GetLayoutDirection() const -{ -#if wxUSE_INTL - const wxLocale *const locale = wxGetLocale(); - if ( locale ) - { - const wxLanguageInfo *const - info = wxLocale::GetLanguageInfo(locale->GetLanguage()); - - if ( info ) - return info->LayoutDirection; - } -#endif // wxUSE_INTL - - // we don't know - return wxLayout_Default; -} - // ---------------------------------------------------------------------------- // traits stuff // ---------------------------------------------------------------------------- @@ -256,27 +243,6 @@ wxAppTraits *wxAppConsole::GetTraits() return m_traits; } -// we must implement CreateXXX() in wxApp itself for backwards compatibility -#if WXWIN_COMPATIBILITY_2_4 - -#if wxUSE_LOG - -wxLog *wxAppConsole::CreateLogTarget() -{ - wxAppTraits *traits = GetTraits(); - return traits ? traits->CreateLogTarget() : NULL; -} - -#endif // wxUSE_LOG - -wxMessageOutput *wxAppConsole::CreateMessageOutput() -{ - wxAppTraits *traits = GetTraits(); - return traits ? traits->CreateMessageOutput() : NULL; -} - -#endif // WXWIN_COMPATIBILITY_2_4 - // ---------------------------------------------------------------------------- // event processing // ---------------------------------------------------------------------------- @@ -472,15 +438,6 @@ void wxAppConsole::OnAssert(const wxChar *file, #endif // __WXDEBUG__ -#if WXWIN_COMPATIBILITY_2_4 - -bool wxAppConsole::CheckBuildOptions(const wxBuildOptions& buildOptions) -{ - return CheckBuildOptions(buildOptions.m_signature, "your program"); -} - -#endif - // ============================================================================ // other classes implementations // ============================================================================ @@ -552,13 +509,99 @@ GSocketGUIFunctionsTable* wxConsoleAppTraitsBase::GetSocketGUIFunctionsTable() // wxAppTraits // ---------------------------------------------------------------------------- +#if wxUSE_INTL +void wxAppTraitsBase::SetLocale() +{ + setlocale(LC_ALL, ""); +} +#endif + #ifdef __WXDEBUG__ -bool wxAppTraitsBase::ShowAssertDialog(const wxString& msg) +bool wxAppTraitsBase::ShowAssertDialog(const wxString& msgOriginal) { + wxString msg = msgOriginal; + +#if wxUSE_STACKWALKER +#if !defined(__WXMSW__) + // on Unix stack frame generation may take some time, depending on the + // size of the executable mainly... warn the user that we are working + wxFprintf(stderr, wxT("[Debug] Generating a stack trace... please wait")); + fflush(stderr); +#endif + + const wxString stackTrace = GetAssertStackTrace(); + if ( !stackTrace.empty() ) + msg << _T("\n\nCall stack:\n") << stackTrace; +#endif // wxUSE_STACKWALKER + return DoShowAssertDialog(msg); } +#if wxUSE_STACKWALKER +wxString wxAppTraitsBase::GetAssertStackTrace() +{ + wxString stackTrace; + + class StackDump : public wxStackWalker + { + public: + StackDump() { } + + const wxString& GetStackTrace() const { return m_stackTrace; } + + protected: + virtual void OnStackFrame(const wxStackFrame& frame) + { + m_stackTrace << wxString::Format + ( + _T("[%02d] "), + wx_truncate_cast(int, frame.GetLevel()) + ); + + wxString name = frame.GetName(); + if ( !name.empty() ) + { + m_stackTrace << wxString::Format(_T("%-40s"), name.c_str()); + } + else + { + m_stackTrace << wxString::Format(_T("%p"), frame.GetAddress()); + } + + if ( frame.HasSourceLocation() ) + { + m_stackTrace << _T('\t') + << frame.GetFileName() + << _T(':') + << frame.GetLine(); + } + + m_stackTrace << _T('\n'); + } + + private: + wxString m_stackTrace; + }; + + // don't show more than maxLines or we could get a dialog too tall to be + // shown on screen: 20 should be ok everywhere as even with 15 pixel high + // characters it is still only 300 pixels... + static const int maxLines = 20; + + StackDump dump; + dump.Walk(2, maxLines); // don't show OnAssert() call itself + stackTrace = dump.GetStackTrace(); + + const int count = stackTrace.Freq(wxT('\n')); + for ( int i = 0; i < count - maxLines; i++ ) + stackTrace = stackTrace.BeforeLast(wxT('\n')); + + return stackTrace; +} +#endif // wxUSE_STACKWALKER + + #endif // __WXDEBUG__ // ============================================================================ @@ -713,68 +756,6 @@ bool DoShowAssertDialog(const wxString& msg) return false; } -#if wxUSE_STACKWALKER -static wxString GetAssertStackTrace() -{ - wxString stackTrace; - - class StackDump : public wxStackWalker - { - public: - StackDump() { } - - const wxString& GetStackTrace() const { return m_stackTrace; } - - protected: - virtual void OnStackFrame(const wxStackFrame& frame) - { - m_stackTrace << wxString::Format - ( - _T("[%02d] "), - wx_truncate_cast(int, frame.GetLevel()) - ); - - wxString name = frame.GetName(); - if ( !name.empty() ) - { - m_stackTrace << wxString::Format(_T("%-40s"), name.c_str()); - } - else - { - m_stackTrace << wxString::Format(_T("%p"), frame.GetAddress()); - } - - if ( frame.HasSourceLocation() ) - { - m_stackTrace << _T('\t') - << frame.GetFileName() - << _T(':') - << frame.GetLine(); - } - - m_stackTrace << _T('\n'); - } - - private: - wxString m_stackTrace; - }; - - StackDump dump; - dump.Walk(2); // don't show OnAssert() call itself - stackTrace = dump.GetStackTrace(); - - // don't show more than maxLines or we could get a dialog too tall to be - // shown on screen: 20 should be ok everywhere as even with 15 pixel high - // characters it is still only 300 pixels... - static const int maxLines = 20; - const int count = stackTrace.Freq(wxT('\n')); - for ( int i = 0; i < count - maxLines; i++ ) - stackTrace = stackTrace.BeforeLast(wxT('\n')); - - return stackTrace; -} -#endif // wxUSE_STACKWALKER - // show the assert modal dialog static void ShowAssertDialog(const wxChar *szFile, @@ -809,14 +790,6 @@ void ShowAssertDialog(const wxChar *szFile, msg << _T('.'); } -#if wxUSE_STACKWALKER - const wxString stackTrace = GetAssertStackTrace(); - if ( !stackTrace.empty() ) - { - msg << _T("\n\nCall stack:\n") << stackTrace; - } -#endif // wxUSE_STACKWALKER - #if wxUSE_THREADS // if we are not in the main thread, output the assert directly and trap // since dialogs cannot be displayed