#include "wxProtoApp.h"
#define WXPROTO_USE_THREADING 1
#ifndef WXPROTO_USE_THREADING
#include "wx/apptrait.h"
#include "wx/cmdline.h"
#include "wx/evtloop.h"
#include "wx/msgout.h"
#include "wx/thread.h"
#include "wx/utils.h"
#include "wx/ptr_scpd.h"
#endif
const wxEventType wxProtoApp::wxPROTO_DISPATCH_EVENT = wxNewEventType();
#define EVT_PROTO_DISPATCH_COMMAND(id, fn) \
DECLARE_EVENT_TABLE_ENTRY( \
wxProtoApp::wxPROTO_DISPATCH_EVENT, id, -1, \
(wxObjectEventFunction)(wxEventFunction)(wxCommandEventFunction)&fn, \
(wxObject *) NULL \
),
DECLARE_APP(wxProtoApp)
BEGIN_EVENT_TABLE(wxProtoApp, wxApp)
EVT_PROTO_DISPATCH_COMMAND(-1, wxProtoApp::OnDispatchEvent)
#ifndef WXPROTO_USE_THREADING
EVT_IDLE(wxProtoApp::OnIdleEvent)
#endif END_EVENT_TABLE()
wxProtoApp::wxProtoApp(bool appDispatch)
: ProtoDispatcher::Controller(dispatcher), app_dispatch(appDispatch)
{
}
wxProtoApp::~wxProtoApp()
{
dispatcher.Stop();
}
int wxProtoApp::MainLoop()
{
#if WXPROTO_USE_THREADING
if (app_dispatch)
dispatcher.StartThread(true, this);
else
dispatcher.StartThread(true);
int result = wxApp::MainLoop();
dispatcher.Stop();
return result;
#else
TRACE("Using unstable, non-threaded wxProtoApp main loop ...\n");
#ifndef WIN32
ProtoTimer guiTimer;
guiTimer.SetRepeat(-1);
guiTimer.SetInterval(0.5);
dispatcher.ActivateTimer(guiTimer);
#endif return wxApp::MainLoop();
#endif
}
bool wxProtoApp::SignalDispatchReady()
{
wxCommandEvent dispatchEvent(wxPROTO_DISPATCH_EVENT);
wxPostEvent(this, dispatchEvent);
return true;
}
void wxProtoApp::OnDispatchEvent(wxCommandEvent& )
{
OnDispatch();
}
void wxProtoApp::OnIdleEvent(wxIdleEvent& event)
{
TRACE("wxProtoApp::OnIdleEvent() ...\n");
if (dispatcher.IsPending())
{
dispatcher.Run(true);
}
event.RequestMore();
}