]> git.saurik.com Git - wxWidgets.git/blobdiff - src/dfb/evtloop.cpp
removed stray return from SetFont()
[wxWidgets.git] / src / dfb / evtloop.cpp
index 30ed0b7259343d335ce0b0058d561f8884848cb5..ee7154ff1ef0dd2b9d6c66d0d3cd4de023f5f5c8 100644 (file)
     #include "wx/app.h"
 #endif
 
+#include "wx/thread.h"
 #include "wx/timer.h"
 #include "wx/private/socketevtdispatch.h"
 #include "wx/dfb/private.h"
+#include "wx/nonownedwnd.h"
 
 #define TRACE_EVENTS _T("events")
 
@@ -86,12 +88,18 @@ bool wxEventLoop::Dispatch()
     // NB: we don't block indefinitely waiting for an event, but instead
     //     time out after a brief period in order to make sure that
     //     OnNextIteration() will be called frequently enough
-    //
-    //     FIXME: call NotifyTimers() and wxSocketEventDispatcher::RunLoop() from here
-    //            (and loop) instead?
     const int TIMEOUT = 100;
 
-    if ( ms_buffer->WaitForEventWithTimeout(0, TIMEOUT) )
+    // release the GUI mutex so that other threads have a chance to post
+    // events:
+    wxMutexGuiLeave();
+
+    bool rv = ms_buffer->WaitForEventWithTimeout(0, TIMEOUT);
+
+    // and acquire it back before calling any event handlers:
+    wxMutexGuiEnter();
+
+    if ( rv )
     {
         switch ( ms_buffer->GetLastResult() )
         {
@@ -127,8 +135,6 @@ void wxEventLoop::WakeUp()
 
 void wxEventLoop::OnNextIteration()
 {
-    // see the comment in Dispatch
-
 #if wxUSE_TIMER
     wxTimer::NotifyTimers();
 #endif
@@ -139,6 +145,16 @@ void wxEventLoop::OnNextIteration()
 #endif
 }
 
+void wxEventLoop::Yield()
+{
+    // process all pending events:
+    while ( Pending() )
+        Dispatch();
+
+    // handle timers, sockets etc.
+    OnNextIteration();
+}
+
 
 //-----------------------------------------------------------------------------
 // DirectFB -> wxWidgets events translation
@@ -151,7 +167,7 @@ void wxEventLoop::HandleDFBEvent(const wxDFBEvent& event)
         case DFEC_WINDOW:
         {
             wxDFBWindowEvent winevent(((const DFBEvent&)event).window);
-            wxTopLevelWindowDFB::HandleDFBWindowEvent(winevent);
+            wxNonOwnedWindow::HandleDFBWindowEvent(winevent);
             break;
         }