]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/app.cpp
fixed missing Idle events
[wxWidgets.git] / src / msw / app.cpp
index 8f9782d2d1c1d1e812704f1c9f73e51e8babb978..072874afb789216d9d3b850d0bde5832a1e0a5b6 100644 (file)
@@ -5,8 +5,8 @@
 // Modified by:
 // Created:     04/01/98
 // RCS-ID:      $Id$
-// Copyright:   (c) Julian Smart and Markus Holzem
-// Licence:     wxWindows license
+// Copyright:   (c) Julian Smart
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // ===========================================================================
 #endif
 
 #if _WIN32_IE >= 0x0300 && \
-    (!defined(__MINGW32__) || wxCHECK_W32API_VERSION( 2, 0 ))
+    (!defined(__MINGW32__) || wxCHECK_W32API_VERSION( 2, 0 )) && \
+    !defined(__CYGWIN__)
     #include <shlwapi.h>
 #endif
 
@@ -700,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;
@@ -711,7 +714,7 @@ int wxEntry(WXHINSTANCE hInstance,
             if ( enterLoop )
             {
                 // run the main loop
-                retValue = wxTheApp->OnRun();
+                wxTheApp->OnRun();
             }
             else
             {
@@ -738,7 +741,7 @@ int wxEntry(WXHINSTANCE hInstance,
             }
         }
 
-        wxTheApp->OnExit();
+        retValue = wxTheApp->OnExit();
 
         wxEntryCleanup();
 
@@ -1065,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
@@ -1108,7 +1117,7 @@ void wxApp::OnIdle(wxIdleEvent& event)
         event.RequestMore(TRUE);
     }
 
-    s_inOnIdle = FALSE;
+    wxIsInOnIdleFlag = FALSE;
 }
 
 // Send idle event to all top-level windows
@@ -1131,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;
 
@@ -1166,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();
     }
 }
 
@@ -1280,10 +1287,15 @@ int wxApp::GetComCtl32Version()
 
 void wxExit()
 {
-    wxLogError(_("Fatal error: exiting"));
-
-    wxApp::CleanUp();
-    exit(0);
+    if ( wxTheApp )
+    {
+        wxTheApp->ExitMainLoop();
+    }
+    else
+    {
+        // what else can we do?
+        exit(-1);
+    }
 }
 
 // Yield to incoming messages
@@ -1293,9 +1305,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 )
     {
@@ -1326,8 +1340,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;
 
@@ -1374,6 +1390,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