]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/app.cpp
If zero time is specified, don't try to sleep when using a timer.
[wxWidgets.git] / src / msw / app.cpp
index cfaf7b34e96d9afc9558d078c9456cde7ff2c99e..bb05dd8873fc25ffa081a26688f57ed3e4fd5910 100644 (file)
@@ -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