]> git.saurik.com Git - wxWidgets.git/commitdiff
don't terminate the event loop in EndModal() if it was already terminated because...
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 18 Aug 2008 11:51:53 +0000 (11:51 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 18 Aug 2008 11:51:53 +0000 (11:51 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@55115 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/gtk/dialog.h
src/gtk/dialog.cpp

index b14cd1100717035ae10cc876ec67386caf1be868..5023f7db67ccbceea85a2cf89b3884013e2fa3f8 100644 (file)
@@ -11,6 +11,8 @@
 #ifndef __GTKDIALOGH__
 #define __GTKDIALOGH__
 
+class WXDLLIMPEXP_FWD_CORE wxGUIEventLoop;
+
 //-----------------------------------------------------------------------------
 // wxDialog
 //-----------------------------------------------------------------------------
@@ -47,7 +49,7 @@ public:
 private:
     // common part of all ctors
     void Init();
-
+    wxGUIEventLoop *m_modalLoop;
     DECLARE_DYNAMIC_CLASS(wxDialog)
 };
 
index dcdaec3cbe58352b707c382b4bd238959852d4c3..d9d6dd1e9c010edf6ad782eb3d64d132f36ca5c4 100644 (file)
 
 #include "wx/evtloop.h"
 
+#include "wx/ptr_scpd.h"
+
 #include <gtk/gtk.h>
 
 // this is defined in src/gtk/toplevel.cpp
 extern int wxOpenModalDialogsCount;
 
+wxDEFINE_TIED_SCOPED_PTR_TYPE(wxGUIEventLoop);
+
+
 //-----------------------------------------------------------------------------
 // wxDialog
 //-----------------------------------------------------------------------------
@@ -31,6 +36,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxDialog,wxTopLevelWindow)
 
 void wxDialog::Init()
 {
+    m_modalLoop = NULL;
     m_returnCode = 0;
     m_modalShowing = false;
     m_themeEnabled = true;
@@ -130,7 +136,11 @@ int wxDialog::ShowModal()
     // NOTE: gtk_window_set_modal internally calls gtk_grab_add() !
     gtk_window_set_modal(GTK_WINDOW(m_widget), TRUE);
 
-    wxGUIEventLoop().Run();
+    // Run modal dialog event loop.
+    {
+        wxGUIEventLoopTiedPtr modal(&m_modalLoop, new wxGUIEventLoop());
+        m_modalLoop->Run();
+    }
 
     gtk_window_set_modal(GTK_WINDOW(m_widget), FALSE);
 
@@ -151,7 +161,10 @@ void wxDialog::EndModal( int retCode )
 
     m_modalShowing = false;
 
-    gtk_main_quit();
+    // Ensure Exit() is only called once. The dialog's event loop may be terminated
+    // externally due to an uncaught exception.
+    if (m_modalLoop && m_modalLoop->IsRunning())
+        m_modalLoop->Exit();
 
     Show( false );
 }