]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/app.cpp
Oh well, I'll just stuff in the rest of the Unicode changes I have made
[wxWidgets.git] / src / gtk / app.cpp
index 67a48aab5c001966d47b0c9ad67827d3204298c9..584837f9c7015402912d5393faaf41dd5b0c5f5b 100644 (file)
@@ -47,8 +47,8 @@ wxAppInitializerFunction wxApp::m_appInitFn = (wxAppInitializerFunction) NULL;
 
 extern wxList wxPendingDelete;
 #if wxUSE_THREADS
-extern wxList wxPendingEvents;
-extern wxCriticalSection wxPendingEventsLocker;
+extern wxList *wxPendingEvents;
+extern wxCriticalSection *wxPendingEventsLocker;
 #endif
 extern wxResourceCache *wxTheResourceCache;
 
@@ -135,6 +135,9 @@ void wxExit()
     gtk_main_quit();
 }
 
+// forward decl
+gint wxapp_idle_callback( gpointer WXUNUSED(data) );
+
 bool wxYield()
 {
     // it's necessary to call ProcessIdle() to update the frames sizes which
@@ -148,9 +151,14 @@ bool wxYield()
         win->OnInternalIdle();
     }
 
-    while (gtk_events_pending() > 0)
+    // We need to temporarily remove idle callbacks or the loop will
+    // never finish.
+    gtk_idle_remove( wxTheApp->m_idleTag );
+    
+    while (gtk_events_pending())
         gtk_main_iteration();
 
+    wxTheApp->m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
     return TRUE;
 }
 
@@ -380,8 +388,8 @@ void wxApp::Dispatch()
 #if wxUSE_THREADS
 void wxApp::ProcessPendingEvents()
 {
-    wxNode *node = wxPendingEvents.First();
-    wxCriticalSectionLocker locker(wxPendingEventsLocker);
+    wxNode *node = wxPendingEvents->First();
+    wxCriticalSectionLocker locker(*wxPendingEventsLocker);
 
     while (node)
     {
@@ -391,7 +399,7 @@ void wxApp::ProcessPendingEvents()
 
         delete node;
 
-        node = wxPendingEvents.First();
+        node = wxPendingEvents->First();
     }
 }
 #endif
@@ -435,6 +443,13 @@ bool wxApp::Initialize()
 
     wxSystemSettings::Init();
 
+    // GL: I'm annoyed ... I don't know where to put this and I don't want to
+    // create a module for that as it's part of the core.
+#if wxUSE_THREADS
+    wxPendingEvents = new wxList();
+    wxPendingEventsLocker = new wxCriticalSection();
+#endif
+
 /*
     wxTheFontNameDirectory =  new wxFontNameDirectory;
     wxTheFontNameDirectory->Initialize();
@@ -495,6 +510,13 @@ void wxApp::CleanUp()
     delete wxTheApp;
     wxTheApp = (wxApp*) NULL;
 
+    // GL: I'm annoyed ... I don't know where to put this and I don't want to
+    // create a module for that as it's part of the core.
+#if wxUSE_THREADS
+    delete wxPendingEvents;
+    delete wxPendingEventsLocker;
+#endif
+
     wxSystemSettings::Done();
 
     delete[] wxBuffer;