X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0f02d3d0ec5c415e222929d9fe587a603772fade..e83ecba968c94965523be449a56fffcf4c55010b:/src/common/appcmn.cpp diff --git a/src/common/appcmn.cpp b/src/common/appcmn.cpp index 49dfb98eed..3e0ecff929 100644 --- a/src/common/appcmn.cpp +++ b/src/common/appcmn.cpp @@ -40,6 +40,12 @@ #include "wx/cmdline.h" #include "wx/thread.h" #include "wx/confbase.h" +#include "wx/tokenzr.h" +#include "wx/utils.h" + +#if wxUSE_GUI + #include "wx/artprov.h" +#endif // wxUSE_GUI #if !defined(__WXMSW__) || defined(__WXMICROWIN__) #include // for SIGTRAP used by wxTrap() @@ -49,6 +55,15 @@ #include "wx/msw/private.h" // includes windows.h for MessageBox() #endif +#if defined(__WXMAC__) + #include "wx/mac/private.h" // includes mac headers +#endif + +// private functions prototypes +#ifdef __WXDEBUG__ + static void LINKAGEMODE SetTraceMasks(); +#endif // __WXDEBUG__ + // =========================================================================== // implementation // =========================================================================== @@ -61,8 +76,9 @@ wxAppBase::wxAppBase() { wxTheApp = (wxApp *)this; - // VZ: what's this? is it obsolete? +#if WXWIN_COMPATIBILITY_2_2 m_wantDebugOutput = FALSE; +#endif // WXWIN_COMPATIBILITY_2_2 #if wxUSE_GUI m_topWindow = (wxWindow *)NULL; @@ -70,6 +86,15 @@ wxAppBase::wxAppBase() m_exitOnFrameDelete = TRUE; m_isActive = TRUE; #endif // wxUSE_GUI + +#ifdef __WXDEBUG__ + SetTraceMasks(); +#endif +} + +wxAppBase::~wxAppBase() +{ + // this destructor is required for Darwin } #if wxUSE_GUI @@ -78,6 +103,9 @@ bool wxAppBase::OnInitGui() #ifdef __WXUNIVERSAL__ if ( !wxTheme::Get() && !wxTheme::CreateDefault() ) return FALSE; + wxArtProvider *art = wxTheme::Get()->GetArtProvider(); + if ( art ) + wxArtProvider::PushProvider(art); #endif // __WXUNIVERSAL__ return TRUE; @@ -141,11 +169,25 @@ void wxAppBase::ProcessPendingEvents() void wxAppBase::SetActive(bool active, wxWindow * WXUNUSED(lastFocus)) { + if ( active == m_isActive ) + return; + m_isActive = active; + + wxActivateEvent event(wxEVT_ACTIVATE_APP, active); + event.SetEventObject(this); + + (void)ProcessEvent(event); } #endif // wxUSE_GUI +int wxAppBase::FilterEvent(wxEvent& WXUNUSED(event)) +{ + // process the events normally by default + return -1; +} + // ---------------------------------------------------------------------------- // cmd line parsing // ---------------------------------------------------------------------------- @@ -158,7 +200,7 @@ bool wxAppBase::OnInit() OnInitCmdLine(parser); bool cont; - switch ( parser.Parse() ) + switch ( parser.Parse(FALSE /* don't show usage */) ) { case -1: cont = OnCmdLineHelp(parser); @@ -184,6 +226,7 @@ bool wxAppBase::OnInit() #define OPTION_VERBOSE _T("verbose") #define OPTION_THEME _T("theme") +#define OPTION_MODE _T("mode") void wxAppBase::OnInitCmdLine(wxCmdLineParser& parser) { @@ -204,7 +247,9 @@ void wxAppBase::OnInitCmdLine(wxCmdLineParser& parser) wxCMD_LINE_SWITCH, _T(""), OPTION_VERBOSE, - gettext_noop("generate verbose log messages") + gettext_noop("generate verbose log messages"), + wxCMD_LINE_VAL_NONE, + 0x0 }, #endif // wxUSE_LOG @@ -214,12 +259,34 @@ void wxAppBase::OnInitCmdLine(wxCmdLineParser& parser) _T(""), OPTION_THEME, gettext_noop("specify the theme to use"), - wxCMD_LINE_VAL_STRING + wxCMD_LINE_VAL_STRING, + 0x0 }, #endif // __WXUNIVERSAL__ +#if defined(__WXMGL__) + // VS: this is not specific to wxMGL, all fullscreen (framebuffer) ports + // should provide this option. That's why it is in common/appcmn.cpp + // and not mgl/app.cpp + { + wxCMD_LINE_OPTION, + _T(""), + OPTION_MODE, + gettext_noop("specify display mode to use (e.g. 640x480-16)"), + wxCMD_LINE_VAL_STRING, + 0x0 + }, +#endif // __WXMGL__ + // terminator - { wxCMD_LINE_NONE } + { + wxCMD_LINE_NONE, + _T(""), + _T(""), + _T(""), + wxCMD_LINE_VAL_NONE, + 0x0 + } }; parser.SetDesc(cmdLineDesc); @@ -250,6 +317,23 @@ bool wxAppBase::OnCmdLineParsed(wxCmdLineParser& parser) } #endif // __WXUNIVERSAL__ +#if defined(__WXMGL__) + wxString modeDesc; + if ( parser.Found(OPTION_MODE, &modeDesc) ) + { + unsigned w, h, bpp; + if ( wxSscanf(modeDesc.c_str(), _T("%ux%u-%u"), &w, &h, &bpp) != 3 ) + { + wxLogError(_("Invalid display mode specification '%s'."), modeDesc.c_str()); + + return FALSE; + } + + if ( !SetDisplayMode(wxDisplayModeInfo(w, h, bpp)) ) + return FALSE; + } +#endif // __WXMGL__ + return TRUE; } @@ -273,8 +357,47 @@ bool wxAppBase::OnCmdLineError(wxCmdLineParser& parser) // debugging support // ---------------------------------------------------------------------------- +/* static */ +bool wxAppBase::CheckBuildOptions(const wxBuildOptions& opts) +{ +#define wxCMP(what) (what == opts.m_ ## what) + + bool +#ifdef __WXDEBUG__ + isDebug = TRUE; +#else + isDebug = FALSE; +#endif + + int verMaj = wxMAJOR_VERSION, + verMin = wxMINOR_VERSION; + + if ( !(wxCMP(isDebug) && wxCMP(verMaj) && wxCMP(verMin)) ) + { + wxLogFatalError(_T("Mismatch between the program and library build ") + _T("versions detected.")); + + // normally wxLogFatalError doesn't return + return FALSE; + } +#undef wxCMP + + return TRUE; +} + #ifdef __WXDEBUG__ +static void LINKAGEMODE SetTraceMasks() +{ + wxString mask; + if ( wxGetEnv(wxT("WXTRACE"), &mask) ) + { + wxStringTokenizer tkn(mask, wxT(",")); + while ( tkn.HasMoreTokens() ) + wxLog::AddTraceMask(tkn.GetNextToken()); + } +} + // wxASSERT() helper bool wxAssertIsEqual(int x, int y) { @@ -286,7 +409,7 @@ void wxTrap() { #if defined(__WXMSW__) && !defined(__WXMICROWIN__) DebugBreak(); -#elif defined(__WXMAC__) +#elif defined(__WXMAC__) && !defined(__DARWIN__) #if __powerc Debugger(); #else @@ -305,19 +428,6 @@ void ShowAssertDialog(const wxChar *szFile, int nLine, const wxChar *szMsg) { // this variable can be set to true to suppress "assert failure" messages static bool s_bNoAsserts = FALSE; - static bool s_bInAssert = FALSE; // FIXME MT-unsafe - - if ( s_bInAssert ) - { - // He-e-e-e-elp!! we're trapped in endless loop - wxTrap(); - - s_bInAssert = FALSE; - - return; - } - - s_bInAssert = TRUE; wxChar szBuf[4096]; @@ -388,13 +498,26 @@ void ShowAssertDialog(const wxChar *szFile, int nLine, const wxChar *szMsg) wxTrap(); #endif // GUI/!GUI } - - s_bInAssert = FALSE; } // this function is called when an assert fails void wxOnAssert(const wxChar *szFile, int nLine, const wxChar *szMsg) { + // FIXME MT-unsafe + static bool s_bInAssert = FALSE; + + if ( s_bInAssert ) + { + // He-e-e-e-elp!! we're trapped in endless loop + wxTrap(); + + s_bInAssert = FALSE; + + return; + } + + s_bInAssert = TRUE; + if ( !wxTheApp ) { // by default, show the assert dialog box - we can't customize this @@ -406,6 +529,8 @@ void wxOnAssert(const wxChar *szFile, int nLine, const wxChar *szMsg) // let the app process it as it wants wxTheApp->OnAssert(szFile, nLine, szMsg); } + + s_bInAssert = FALSE; } void wxAppBase::OnAssert(const wxChar *file, int line, const wxChar *msg)