X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4a7ebfc1f25e803eed43be420226569edd34c194..bc6ca1a9e68a84817092856059d8ee9f5d109d1d:/src/common/appcmn.cpp diff --git a/src/common/appcmn.cpp b/src/common/appcmn.cpp index e25528a638..ea3a17c7c9 100644 --- a/src/common/appcmn.cpp +++ b/src/common/appcmn.cpp @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Name: src/common/appcmn.cpp -// Purpose: wxAppConsole and wxAppBase methods common to all platforms +// Purpose: wxAppBase methods common to all platforms // Author: Vadim Zeitlin // Modified by: // Created: 18.10.99 @@ -40,16 +40,7 @@ #include "wx/msgout.h" #include "wx/thread.h" #include "wx/vidmode.h" - -#ifdef __WXDEBUG__ - #if wxUSE_STACKWALKER - #include "wx/stackwalk.h" - #endif // wxUSE_STACKWALKER -#endif // __WXDEBUG__ - -#if defined(__WXMSW__) - #include "wx/msw/private.h" // includes windows.h for LOGFONT -#endif +#include "wx/evtloop.h" #if wxUSE_FONTMAP #include "wx/fontmap.h" @@ -59,8 +50,6 @@ #include "wx/build.h" WX_CHECK_BUILD_OPTIONS("wxCore") -WXDLLIMPEXP_DATA_CORE(wxList) wxPendingDelete; - // ============================================================================ // wxAppBase implementation // ============================================================================ @@ -71,7 +60,7 @@ WXDLLIMPEXP_DATA_CORE(wxList) wxPendingDelete; wxAppBase::wxAppBase() { - m_topWindow = (wxWindow *)NULL; + m_topWindow = NULL; m_useBestVisual = false; m_forceTrueColour = false; @@ -102,6 +91,10 @@ bool wxAppBase::Initialize(int& argcOrig, wxChar **argvOrig) wxBitmap::InitStandardHandlers(); + // for compatibility call the old initialization function too + if ( !OnInitGui() ) + return false; + return true; } @@ -138,13 +131,6 @@ void wxAppBase::CleanUp() delete wxTheColourDatabase; wxTheColourDatabase = NULL; -#if wxUSE_THREADS - #if wxUSE_VALIDATORS - // If we don't do the following, we get an apparent memory leak. - ((wxEvtHandler&) wxDefaultValidator).ClearEventLocker(); - #endif // wxUSE_VALIDATORS -#endif // wxUSE_THREADS - wxAppConsole::CleanUp(); } @@ -189,8 +175,8 @@ wxLayoutDirection wxAppBase::GetLayoutDirection() const // GUI-specific command line options handling // ---------------------------------------------------------------------------- -#define OPTION_THEME _T("theme") -#define OPTION_MODE _T("mode") +#define OPTION_THEME "theme" +#define OPTION_MODE "mode" void wxAppBase::OnInitCmdLine(wxCmdLineParser& parser) { @@ -203,7 +189,7 @@ void wxAppBase::OnInitCmdLine(wxCmdLineParser& parser) #ifdef __WXUNIVERSAL__ { wxCMD_LINE_OPTION, - wxEmptyString, + NULL, OPTION_THEME, gettext_noop("specify the theme to use"), wxCMD_LINE_VAL_STRING, @@ -217,7 +203,7 @@ void wxAppBase::OnInitCmdLine(wxCmdLineParser& parser) // and not mgl/app.cpp { wxCMD_LINE_OPTION, - wxEmptyString, + NULL, OPTION_MODE, gettext_noop("specify display mode to use (e.g. 640x480-16)"), wxCMD_LINE_VAL_STRING, @@ -226,14 +212,7 @@ void wxAppBase::OnInitCmdLine(wxCmdLineParser& parser) #endif // __WXMGL__ // terminator - { - wxCMD_LINE_NONE, - wxEmptyString, - wxEmptyString, - wxEmptyString, - wxCMD_LINE_VAL_NONE, - 0x0 - } + wxCMD_LINE_DESC_END }; parser.SetDesc(cmdLineGUIDesc); @@ -263,7 +242,7 @@ bool wxAppBase::OnCmdLineParsed(wxCmdLineParser& parser) if ( parser.Found(OPTION_MODE, &modeDesc) ) { unsigned w, h, bpp; - if ( wxSscanf(modeDesc.c_str(), _T("%ux%u-%u"), &w, &h, &bpp) != 3 ) + if ( wxSscanf(modeDesc.c_str(), wxT("%ux%u-%u"), &w, &h, &bpp) != 3 ) { wxLogError(_("Invalid display mode specification '%s'."), modeDesc.c_str()); return false; @@ -337,39 +316,36 @@ void wxAppBase::SetActive(bool active, wxWindow * WXUNUSED(lastFocus)) (void)ProcessEvent(event); } -// ---------------------------------------------------------------------------- -// idle handling -// ---------------------------------------------------------------------------- - -void wxAppBase::DeletePendingObjects() +bool wxAppBase::SafeYield(wxWindow *win, bool onlyIfNeeded) { - wxList::compatibility_iterator node = wxPendingDelete.GetFirst(); - while (node) - { - wxObject *obj = node->GetData(); + wxWindowDisabler wd(win); - // remove it from the list first so that if we get back here somehow - // during the object deletion (e.g. wxYield called from its dtor) we - // wouldn't try to delete it the second time - if ( wxPendingDelete.Member(obj) ) - wxPendingDelete.Erase(node); + wxEventLoopBase * const loop = wxEventLoopBase::GetActive(); - delete obj; + return loop && loop->Yield(onlyIfNeeded); +} - // Deleting one object may have deleted other pending - // objects, so start from beginning of list again. - node = wxPendingDelete.GetFirst(); - } +bool wxAppBase::SafeYieldFor(wxWindow *win, long eventsToProcess) +{ + wxWindowDisabler wd(win); + + wxEventLoopBase * const loop = wxEventLoopBase::GetActive(); + + return loop && loop->YieldFor(eventsToProcess); } + +// ---------------------------------------------------------------------------- +// idle handling +// ---------------------------------------------------------------------------- + // Returns true if more time is needed. bool wxAppBase::ProcessIdle() { - // process pending wx events before sending idle events - ProcessPendingEvents(); - + // call the base class version first to send the idle event to wxTheApp + // itself + bool needMore = wxAppConsoleBase::ProcessIdle(); wxIdleEvent event; - bool needMore = false; wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetFirst(); while (node) { @@ -379,17 +355,6 @@ bool wxAppBase::ProcessIdle() node = node->GetNext(); } - if (wxAppConsole::ProcessIdle()) - needMore = true; - - // 'Garbage' collection of windows deleted with Close(). - DeletePendingObjects(); - -#if wxUSE_LOG - // flush the logged messages if any - wxLog::FlushActive(); -#endif - wxUpdateUIEvent::ResetUpdateTime(); return needMore; @@ -407,7 +372,7 @@ bool wxAppBase::SendIdleEvents(wxWindow* win, wxIdleEvent& event) win->HasExtraStyle(wxWS_EX_PROCESS_IDLE) ) { event.SetEventObject(win); - win->GetEventHandler()->ProcessEvent(event); + win->HandleWindowEvent(event); if (event.MoreRequested()) needMore = true; @@ -433,9 +398,7 @@ bool wxAppBase::SendIdleEvents(wxWindow* win, wxIdleEvent& event) wxLog *wxGUIAppTraitsBase::CreateLogTarget() { -// DE: One day I'll remove this but right now the generic dialog used for this -// just doesn't work right at all on wxCocoa. -#if wxUSE_LOGGUI && !defined(__WXCOCOA__) +#if wxUSE_LOGGUI return new wxLogGui; #else // we must have something! @@ -451,7 +414,8 @@ wxMessageOutput *wxGUIAppTraitsBase::CreateMessageOutput() // is (according to common practice): // - console apps: to stderr (on any platform) // - GUI apps: stderr on Unix platforms (!) - // message box under Windows and others + // stderr if available and message box otherwise on others + // (currently stderr only Windows if app running from console) #ifdef __UNIX__ return new wxMessageOutputStderr; #else // !__UNIX__ @@ -459,7 +423,7 @@ wxMessageOutput *wxGUIAppTraitsBase::CreateMessageOutput() #ifdef __WXMOTIF__ return new wxMessageOutputLog; #elif wxUSE_MSGDLG - return new wxMessageOutputMessageBox; + return new wxMessageOutputBest(wxMSGOUT_PREFER_STDERR); #else return new wxMessageOutputStderr; #endif @@ -481,16 +445,20 @@ wxRendererNative *wxGUIAppTraitsBase::CreateRenderer() return NULL; } -#ifdef __WXDEBUG__ - bool wxGUIAppTraitsBase::ShowAssertDialog(const wxString& msg) { -#if defined(__WXMSW__) || !wxUSE_MSGDLG // under MSW we prefer to use the base class version using ::MessageBox() // even if wxMessageBox() is available because it has less chances to // double fault our app than our wxMessageBox() + // + // under DFB the message dialog is not always functional right now + // + // and finally we can't use wxMessageBox() if it wasn't compiled in, of + // course +#if defined(__WXMSW__) || defined(__WXDFB__) || !wxUSE_MSGDLG return wxAppTraitsBase::ShowAssertDialog(msg); #else // wxUSE_MSGDLG +#if wxDEBUG_LEVEL wxString msgDlg = msg; #if wxUSE_STACKWALKER @@ -501,7 +469,7 @@ bool wxGUIAppTraitsBase::ShowAssertDialog(const wxString& msg) const wxString stackTrace = GetAssertStackTrace(); if ( !stackTrace.empty() ) - msgDlg << _T("\n\nCall stack:\n") << stackTrace; + msgDlg << wxT("\n\nCall stack:\n") << stackTrace; #endif // wxUSE_STACKWALKER // this message is intentionally not translated -- it is for @@ -523,13 +491,16 @@ bool wxGUIAppTraitsBase::ShowAssertDialog(const wxString& msg) //case wxNO: nothing to do } +#else // !wxDEBUG_LEVEL + // this function always exists (for ABI compatibility) but is never called + // if debug level is 0 and so can simply do nothing then + wxUnusedVar(msg); +#endif // wxDEBUG_LEVEL/!wxDEBUG_LEVEL return false; #endif // !wxUSE_MSGDLG/wxUSE_MSGDLG } -#endif // __WXDEBUG__ - bool wxGUIAppTraitsBase::HasStderr() { // we consider that under Unix stderr always goes somewhere, even if the @@ -541,45 +512,3 @@ bool wxGUIAppTraitsBase::HasStderr() #endif } -void wxGUIAppTraitsBase::ScheduleForDestroy(wxObject *object) -{ - if ( !wxPendingDelete.Member(object) ) - wxPendingDelete.Append(object); -} - -void wxGUIAppTraitsBase::RemoveFromPendingDelete(wxObject *object) -{ - wxPendingDelete.DeleteObject(object); -} - -#if wxUSE_SOCKETS - -#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 "wx/mac/gsockmac.h" -#else - #error "Must include correct GSocket header here" -#endif - -GSocketGUIFunctionsTable* wxGUIAppTraitsBase::GetSocketGUIFunctionsTable() -{ -#if defined(__WXMAC__) && !defined(__DARWIN__) - // NB: wxMac CFM does not have any GUI-specific functions in gsocket.c and - // so it doesn't need this table at all - return NULL; -#else // !__WXMAC__ || __DARWIN__ - static GSocketGUIFunctionsTableConcrete table; - return &table; -#endif // !__WXMAC__ || __DARWIN__ -} - -#endif