X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f7a50432401c62a3300b0b9faa7e99d7ffe3d4e8..fada8bef05c36e3bae29f9442f8d32b024905207:/src/dfb/evtloop.cpp?ds=sidebyside diff --git a/src/dfb/evtloop.cpp b/src/dfb/evtloop.cpp index 3cc18ac290..7f7807ac72 100644 --- a/src/dfb/evtloop.cpp +++ b/src/dfb/evtloop.cpp @@ -26,11 +26,12 @@ #endif #include "wx/thread.h" -#include "wx/timer.h" -#include "wx/private/socketevtdispatch.h" +#include "wx/generic/private/timer.h" +#include "wx/private/fdiodispatcher.h" #include "wx/dfb/private.h" +#include "wx/nonownedwnd.h" -#define TRACE_EVENTS _T("events") +#define TRACE_EVENTS "events" // =========================================================================== // implementation @@ -40,28 +41,28 @@ // wxEventLoop initialization //----------------------------------------------------------------------------- -wxIDirectFBEventBufferPtr wxEventLoop::ms_buffer; +wxIDirectFBEventBufferPtr wxGUIEventLoop::ms_buffer; -wxEventLoop::wxEventLoop() +wxGUIEventLoop::wxGUIEventLoop() { if ( !ms_buffer ) InitBuffer(); } /* static */ -void wxEventLoop::InitBuffer() +void wxGUIEventLoop::InitBuffer() { ms_buffer = wxIDirectFB::Get()->CreateEventBuffer(); } /* static */ -void wxEventLoop::CleanUp() +void wxGUIEventLoop::CleanUp() { ms_buffer.Reset(); } /* static */ -wxIDirectFBEventBufferPtr wxEventLoop::GetDirectFBEventBuffer() +wxIDirectFBEventBufferPtr wxGUIEventLoop::GetDirectFBEventBuffer() { if ( !ms_buffer ) InitBuffer(); @@ -73,27 +74,37 @@ wxIDirectFBEventBufferPtr wxEventLoop::GetDirectFBEventBuffer() // events dispatch and loop handling //----------------------------------------------------------------------------- -bool wxEventLoop::Pending() const +bool wxGUIEventLoop::Pending() const { - wxCHECK_MSG( ms_buffer, false, _T("invalid event buffer") ); + wxCHECK_MSG( ms_buffer, false, "invalid event buffer" ); return ms_buffer->HasEvent(); } -bool wxEventLoop::Dispatch() +bool wxGUIEventLoop::Dispatch() { - wxCHECK_MSG( ms_buffer, false, _T("invalid event buffer") ); - // 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 + // + // TODO: remove this hack, instead use CreateFileDescriptor() to properly + // multiplex GUI and socket input const int TIMEOUT = 100; + // treat time out (-1 return value) as normal successful return so that + // OnNextIteration() is called + return !!DispatchTimeout(TIMEOUT); +} + +int wxGUIEventLoop::DispatchTimeout(unsigned long timeout) +{ + wxCHECK_MSG( ms_buffer, 0, "invalid event buffer" ); + // release the GUI mutex so that other threads have a chance to post // events: wxMutexGuiLeave(); - bool rv = ms_buffer->WaitForEventWithTimeout(0, TIMEOUT); + bool rv = ms_buffer->WaitForEventWithTimeout(0, timeout); // and acquire it back before calling any event handlers: wxMutexGuiEnter(); @@ -111,9 +122,7 @@ bool wxEventLoop::Dispatch() } case DFB_TIMEOUT: - // timed out, pretend we processed an event so that - // OnNextIteration is called - break; + return -1; default: // don't terminate the loop due to errors (they were reported @@ -122,29 +131,29 @@ bool wxEventLoop::Dispatch() } } - return true; + return 1; } -void wxEventLoop::WakeUp() +void wxGUIEventLoop::WakeUp() { - wxCHECK_RET( ms_buffer, _T("invalid event buffer") ); + wxCHECK_RET( ms_buffer, "invalid event buffer" ); ms_buffer->WakeUp(); } -void wxEventLoop::OnNextIteration() +void wxGUIEventLoop::OnNextIteration() { #if wxUSE_TIMER - wxTimer::NotifyTimers(); + wxGenericTimerImpl::NotifyTimers(); #endif #if wxUSE_SOCKETS // handle any pending socket events: - wxSocketEventDispatcher::Get().RunLoop(); + wxFDIODispatcher::DispatchPending(); #endif } -void wxEventLoop::Yield() +void wxGUIEventLoop::Yield() { // process all pending events: while ( Pending() ) @@ -159,14 +168,14 @@ void wxEventLoop::Yield() // DirectFB -> wxWidgets events translation //----------------------------------------------------------------------------- -void wxEventLoop::HandleDFBEvent(const wxDFBEvent& event) +void wxGUIEventLoop::HandleDFBEvent(const wxDFBEvent& event) { switch ( event.GetClass() ) { case DFEC_WINDOW: { wxDFBWindowEvent winevent(((const DFBEvent&)event).window); - wxTopLevelWindowDFB::HandleDFBWindowEvent(winevent); + wxNonOwnedWindow::HandleDFBWindowEvent(winevent); break; } @@ -178,7 +187,7 @@ void wxEventLoop::HandleDFBEvent(const wxDFBEvent& event) #endif { wxLogTrace(TRACE_EVENTS, - _T("ignoring event of unsupported class %i"), + "ignoring event of unsupported class %i", (int)event.GetClass()); } }