]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/evtloop.cpp
supporting events also for root control (needed for event handling of mouse and paint...
[wxWidgets.git] / src / msw / evtloop.cpp
index 1012498409fffba56ba0d74dab2ddf838d3c8f00..80be76737198dd2bc4e493380afc1164ff3aeecc 100644 (file)
@@ -73,13 +73,6 @@ public:
     int GetExitCode() const { return m_exitcode; }
     bool ShouldExit() const { return m_shouldExit; }
 
-    enum wxCatchAllResponse {
-        catch_continue,
-        catch_exit,
-        catch_rethrow
-    };
-    wxCatchAllResponse OnCatchAll();
-
 private:
     // preprocess a message, return TRUE if processed (i.e. no further
     // dispatching required)
@@ -217,26 +210,7 @@ bool wxEventLoopImpl::PreProcessMessage(MSG *msg)
 
 bool wxEventLoopImpl::SendIdleMessage()
 {
-    return wxTheApp->ProcessIdle();
-}
-
-// ----------------------------------------------------------------------------
-// wxEventLoopImpl exception handling
-// ----------------------------------------------------------------------------
-
-wxEventLoopImpl::wxCatchAllResponse wxEventLoopImpl::OnCatchAll()
-{
-    switch (::MessageBox(NULL, 
-            _T("An unhandled exception occurred. 'Abort' will terminate the program,\r\n"
-            "'Retry' will close the current dialog, 'Ignore' will try to continue."), 
-            _T("Unhandled exception"), 
-            MB_ABORTRETRYIGNORE|MB_ICONERROR|MB_TASKMODAL))
-    {
-        case IDABORT: return catch_rethrow;
-        case IDRETRY: return catch_exit;
-        case IDIGNORE: return catch_continue;
-    }
-    return catch_rethrow;
+    return wxTheApp && wxTheApp->ProcessIdle();
 }
 
 // ============================================================================
@@ -276,64 +250,70 @@ int wxEventLoop::Run()
     // wxModalEventLoop depends on this (so we can't just use ON_BLOCK_EXIT or
     // something similar here)
 #if wxUSE_EXCEPTIONS
-    bool retryAfterException;
-    do {
-        retryAfterException=false;
-#endif
-    wxTRY
+    for ( ;; )
     {
-        for ( ;; )
+        try
         {
-    #if wxUSE_THREADS
-            wxMutexGuiLeaveOrEnter();
-    #endif // wxUSE_THREADS
-
-            // generate and process idle events for as long as we don't have
-            // anything else to do
-            while ( !Pending() && m_impl->SendIdleMessage() )
-                ;
-
-            // if the "should exit" flag is set, the loop should terminate but
-            // not before processing any remaining messages so while Pending()
-            // returns true, do process them
-            if ( m_impl->ShouldExit() )
+#endif // wxUSE_EXCEPTIONS
+
+            // this is the event loop itself
+            for ( ;; )
             {
-                while ( Pending() )
-                    Dispatch();
+                #if wxUSE_THREADS
+                    wxMutexGuiLeaveOrEnter();
+                #endif // wxUSE_THREADS
+
+                // generate and process idle events for as long as we don't
+                // have anything else to do
+                while ( !Pending() && m_impl->SendIdleMessage() )
+                    ;
+
+                // if the "should exit" flag is set, the loop should terminate
+                // but not before processing any remaining messages so while
+                // Pending() returns true, do process them
+                if ( m_impl->ShouldExit() )
+                {
+                    while ( Pending() )
+                        Dispatch();
 
-                break;
-            }
+                    break;
+                }
 
-            // a message came or no more idle processing to do, sit in
-            // Dispatch() waiting for the next message
-            if ( !Dispatch() )
-            {
-                // we got WM_QUIT
-                break;
+                // a message came or no more idle processing to do, sit in
+                // Dispatch() waiting for the next message
+                if ( !Dispatch() )
+                {
+                    // we got WM_QUIT
+                    break;
+                }
             }
+
+#if wxUSE_EXCEPTIONS
+            // exit the outer loop as well
+            break;
         }
-        }
-        wxCATCH_ALL( 
-            switch (m_impl->OnCatchAll()) {
-                case wxEventLoopImpl::catch_continue:
-                    retryAfterException=true;
-                    break;
-                case wxEventLoopImpl::catch_exit:
-                    OnExit();
-                    break;
-                case wxEventLoopImpl::catch_rethrow:
+        catch ( ... )
+        {
+            try
+            {
+                if ( !wxTheApp || !wxTheApp->OnExceptionInMainLoop() )
+                {
                     OnExit();
-                    // should be replaced with wx macro, but
-                    // there is none yet. OTOH, wxCATCH_ALL isn't
-                    // expanded unless wxUSE_EXCEPTIONS, so its
-                    // safe to use throw here.
-                    throw;  
                     break;
+                }
+                //else: continue running the event loop
+            }
+            catch ( ... )
+            {
+                // OnException() throwed, possibly rethrowing the same
+                // exception again: very good, but we still need OnExit() to
+                // be called
+                OnExit();
+                throw;
+            }
+        }
     }
-        )
-#if wxUSE_EXCEPTIONS
-    } while (retryAfterException);
-#endif
+#endif // wxUSE_EXCEPTIONS
 
     return m_impl->GetExitCode();
 }