git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61470
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
bool m_shouldExit;
private:
bool m_shouldExit;
private:
+ // process all already pending events and dispatch a new one (blocking
+ // until it appears in the event queue if necessary)
+ //
+ // returns the return value of Dispatch()
+ bool ProcessEvents();
+
wxDECLARE_NO_COPY_CLASS(wxEventLoopManual);
};
wxDECLARE_NO_COPY_CLASS(wxEventLoopManual);
};
bool wxAppConsoleBase::ProcessIdle()
{
bool wxAppConsoleBase::ProcessIdle()
{
- // process pending wx events before sending idle events
- ProcessPendingEvents();
-
// synthesize an idle event and check if more of them are needed
wxIdleEvent event;
event.SetEventObject(this);
// synthesize an idle event and check if more of them are needed
wxIdleEvent event;
event.SetEventObject(this);
+bool wxEventLoopManual::ProcessEvents()
+{
+ // process pending wx events first as they correspond to low-level events
+ // which happened before, i.e. typically pending events were queued by a
+ // previous call to Dispatch() and if we didn't process them now the next
+ // call to it might enqueue them again (as happens with e.g. socket events
+ // which would be generated as long as there is input available on socket
+ // and this input is only removed from it when pending event handlers are
+ // executed)
+ if ( wxTheApp )
+ wxTheApp->ProcessPendingEvents();
+
+ return Dispatch();
+}
+
int wxEventLoopManual::Run()
{
// event loops are not recursive, you need to create another loop!
wxCHECK_MSG( !IsRunning(), -1, _T("can't reenter a message loop") );
int wxEventLoopManual::Run()
{
// event loops are not recursive, you need to create another loop!
wxCHECK_MSG( !IsRunning(), -1, _T("can't reenter a message loop") );
- // ProcessIdle() and Dispatch() below may throw so the code here should
+ // ProcessIdle() and ProcessEvents() below may throw so the code here should
// be exception-safe, hence we must use local objects for all actions we
// should undo
wxEventLoopActivator activate(this);
// we must ensure that OnExit() is called even if an exception is thrown
// be exception-safe, hence we must use local objects for all actions we
// should undo
wxEventLoopActivator activate(this);
// we must ensure that OnExit() is called even if an exception is thrown
- // from inside Dispatch() but we must call it from Exit() in normal
+ // from inside ProcessEvents() but we must call it from Exit() in normal
// situations because it is supposed to be called synchronously,
// wxModalEventLoop depends on this (so we can't just use ON_BLOCK_EXIT or
// something similar here)
// situations because it is supposed to be called synchronously,
// wxModalEventLoop depends on this (so we can't just use ON_BLOCK_EXIT or
// something similar here)
if ( m_shouldExit )
{
while ( Pending() )
if ( m_shouldExit )
{
while ( Pending() )
- // a message came or no more idle processing to do, sit in
- // Dispatch() waiting for the next message
- if ( !Dispatch() )
+ // a message came or no more idle processing to do, dispatch
+ // all the pending events and call Dispatch() to wait for the
+ // next message
+ if ( !ProcessEvents() )
{
// we got WM_QUIT
break;
{
// we got WM_QUIT
break;
gdk_threads_enter();
bool needMore;
do {
gdk_threads_enter();
bool needMore;
do {
+ ProcessPendingEvents();
+
needMore = ProcessIdle();
} while (needMore && gtk_events_pending() == 0);
gdk_threads_leave();
needMore = ProcessIdle();
} while (needMore && gtk_events_pending() == 0);
gdk_threads_leave();