#include "wx/thread.h"
#include "wx/generic/private/timer.h"
-#include "wx/private/selectdispatcher.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
// 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();
// 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();
}
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
}
}
- 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
wxGenericTimerImpl::NotifyTimers();
#if wxUSE_SOCKETS
// handle any pending socket events:
- wxSelectDispatcher::Get().RunLoop(0);
+ wxFDIODispatcher::DispatchPending();
#endif
}
-void wxEventLoop::Yield()
+void wxGUIEventLoop::Yield()
{
// process all pending events:
while ( Pending() )
// DirectFB -> wxWidgets events translation
//-----------------------------------------------------------------------------
-void wxEventLoop::HandleDFBEvent(const wxDFBEvent& event)
+void wxGUIEventLoop::HandleDFBEvent(const wxDFBEvent& event)
{
switch ( event.GetClass() )
{
#endif
{
wxLogTrace(TRACE_EVENTS,
- _T("ignoring event of unsupported class %i"),
+ "ignoring event of unsupported class %i",
(int)event.GetClass());
}
}