X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8ebec7dcd8b0b7294dbc86340d52a10b45bc80db..4e916e61ea24c165fb55e78172f1093bf7481b48:/src/common/appcmn.cpp diff --git a/src/common/appcmn.cpp b/src/common/appcmn.cpp index 15f409dbd6..82fdabf78e 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,6 +40,7 @@ #include "wx/msgout.h" #include "wx/thread.h" #include "wx/vidmode.h" +#include "wx/evtloop.h" #ifdef __WXDEBUG__ #if wxUSE_STACKWALKER @@ -71,7 +72,7 @@ WXDLLIMPEXP_DATA_CORE(wxList) wxPendingDelete; wxAppBase::wxAppBase() { - m_topWindow = (wxWindow *)NULL; + m_topWindow = NULL; m_useBestVisual = false; m_forceTrueColour = false; @@ -102,6 +103,10 @@ bool wxAppBase::Initialize(int& argcOrig, wxChar **argvOrig) wxBitmap::InitStandardHandlers(); + // for compatibility call the old initialization function too + if ( !OnInitGui() ) + return false; + return true; } @@ -323,6 +328,25 @@ void wxAppBase::SetActive(bool active, wxWindow * WXUNUSED(lastFocus)) (void)ProcessEvent(event); } +bool wxAppBase::SafeYield(wxWindow *win, bool onlyIfNeeded) +{ + wxWindowDisabler wd(win); + + wxEventLoopBase * const loop = wxEventLoopBase::GetActive(); + + return loop && loop->Yield(onlyIfNeeded); +} + +bool wxAppBase::SafeYieldFor(wxWindow *win, long eventsToProcess) +{ + wxWindowDisabler wd(win); + + wxEventLoopBase * const loop = wxEventLoopBase::GetActive(); + + return loop && loop->YieldFor(eventsToProcess); +} + + // ---------------------------------------------------------------------------- // idle handling // ---------------------------------------------------------------------------- @@ -351,11 +375,11 @@ void wxAppBase::DeletePendingObjects() // 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, it will process the pending events + // (which should be done before the idle events generation) and send the + // idle event to wxTheApp itself + bool needMore = wxAppConsoleBase::ProcessIdle(); wxIdleEvent event; - bool needMore = false; wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetFirst(); while (node) { @@ -365,9 +389,6 @@ bool wxAppBase::ProcessIdle() node = node->GetNext(); } - if (wxAppConsole::ProcessIdle()) - needMore = true; - // 'Garbage' collection of windows deleted with Close(). DeletePendingObjects(); @@ -393,7 +414,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; @@ -419,9 +440,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! @@ -437,7 +456,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__ @@ -445,7 +465,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 @@ -471,10 +491,15 @@ wxRendererNative *wxGUIAppTraitsBase::CreateRenderer() 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 wxString msgDlg = msg;