X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7f93875dfe6dbc56d04997cb163e823bf14e2ba4..cfcc39321282c5877cbb45248bb8004ced24516b:/src/msw/app.cpp diff --git a/src/msw/app.cpp b/src/msw/app.cpp index cfaf7b34e9..bb05dd8873 100644 --- a/src/msw/app.cpp +++ b/src/msw/app.cpp @@ -701,8 +701,10 @@ int wxEntry(WXHINSTANCE hInstance, // we can't simply double-click on the error message and get to that // line in the source. So VC++ at least, let's have a sensible default. #ifdef __VISUALC__ +#if wxUSE_LOG wxLog::SetTimestamp(NULL); -#endif +#endif // wxUSE_LOG +#endif // __VISUALC__ // init the app int retValue = wxEntryInitGui() && wxTheApp->OnInit() ? 0 : -1; @@ -712,7 +714,7 @@ int wxEntry(WXHINSTANCE hInstance, if ( enterLoop ) { // run the main loop - retValue = wxTheApp->OnRun(); + wxTheApp->OnRun(); } else { @@ -739,7 +741,7 @@ int wxEntry(WXHINSTANCE hInstance, } } - wxTheApp->OnExit(); + retValue = wxTheApp->OnExit(); wxEntryCleanup(); @@ -1066,15 +1068,21 @@ bool wxApp::ProcessMessage(WXMSG *wxmsg) return FALSE; } +// this is a temporary hack and will be replaced by using wxEventLoop in the +// future +// +// it is needed to allow other event loops (currently only one: the modal +// dialog one) to reset the OnIdle() semaphore because otherwise OnIdle() +// wouldn't do anything while a modal dialog shown from OnIdle() call is shown. +bool wxIsInOnIdleFlag = FALSE; + void wxApp::OnIdle(wxIdleEvent& event) { - static bool s_inOnIdle = FALSE; - // Avoid recursion (via ProcessEvent default case) - if ( s_inOnIdle ) + if ( wxIsInOnIdleFlag ) return; - s_inOnIdle = TRUE; + wxIsInOnIdleFlag = TRUE; // If there are pending events, we must process them: pending events // are either events to the threads other than main or events posted @@ -1109,7 +1117,7 @@ void wxApp::OnIdle(wxIdleEvent& event) event.RequestMore(TRUE); } - s_inOnIdle = FALSE; + wxIsInOnIdleFlag = FALSE; } // Send idle event to all top-level windows @@ -1132,33 +1140,31 @@ bool wxApp::SendIdleEvents() // Send idle event to window and all subwindows bool wxApp::SendIdleEvents(wxWindow* win) { - bool needMore = FALSE; - wxIdleEvent event; event.SetEventObject(win); win->GetEventHandler()->ProcessEvent(event); - if (event.MoreRequested()) - needMore = TRUE; + bool needMore = event.MoreRequested(); - wxNode* node = win->GetChildren().First(); - while (node) + wxWindowList::Node *node = win->GetChildren().GetFirst(); + while ( node ) { - wxWindow* win = (wxWindow*) node->Data(); + wxWindow *win = node->GetData(); if (SendIdleEvents(win)) needMore = TRUE; - node = node->Next(); + node = node->GetNext(); } + return needMore; } void wxApp::DeletePendingObjects() { - wxNode *node = wxPendingDelete.First(); + wxNode *node = wxPendingDelete.GetFirst(); while (node) { - wxObject *obj = (wxObject *)node->Data(); + wxObject *obj = node->GetData(); delete obj; @@ -1167,7 +1173,7 @@ void wxApp::DeletePendingObjects() // Deleting one object may have deleted other pending // objects, so start from beginning of list again. - node = wxPendingDelete.First(); + node = wxPendingDelete.GetFirst(); } } @@ -1294,9 +1300,11 @@ bool wxApp::Yield(bool onlyIfNeeded) // MT-FIXME static bool s_inYield = FALSE; +#if wxUSE_LOG // disable log flushing from here because a call to wxYield() shouldn't // normally result in message boxes popping up &c wxLog::Suspend(); +#endif // wxUSE_LOG if ( s_inYield ) { @@ -1327,8 +1335,10 @@ bool wxApp::Yield(bool onlyIfNeeded) // if there are pending events, we must process them. ProcessPendingEvents(); +#if wxUSE_LOG // let the logs be flashed again wxLog::Resume(); +#endif // wxUSE_LOG s_inYield = FALSE; @@ -1375,6 +1385,6 @@ void wxWakeUpIdle() // For some reason, with MSVC++ 1.5, WinMain isn't linked in properly // if in a separate file. So include it here to ensure it's linked. -#if (defined(__VISUALC__) && !defined(__WIN32__)) || (defined(__GNUWIN32__) && !defined(__TWIN32__) && !defined(WXMAKINGDLL)) +#if (defined(__VISUALC__) && !defined(__WIN32__)) || (defined(__GNUWIN32__) && !defined(__WINE__) && !defined(__TWIN32__) && !defined(WXMAKINGDLL)) #include "main.cpp" #endif