///////////////////////////////////////////////////////////////////////////////
// Name: src/os2/evtloop.cpp
-// Purpose: implements wxEventLoop for PM
+// Purpose: implements wxGUIEventLoop for PM
// Author: Vadim Zeitlin
// Modified by:
// Created: 01.06.01
#include "wx/evtloop.h"
#include "wx/tooltip.h"
-#include "wx/ptr_scpd.h"
+#include "wx/scopedptr.h"
#include "wx/os2/private.h"
+#include "wx/os2/private/timer.h" // for wxTimerProc
#if wxUSE_THREADS
// define the array of QMSG strutures
}
// ============================================================================
-// wxEventLoop implementation
+// wxGUIEventLoop implementation
// ============================================================================
// ----------------------------------------------------------------------------
-// wxEventLoop running and exiting
+// wxGUIEventLoop running and exiting
// ----------------------------------------------------------------------------
-wxEventLoop::~wxEventLoop()
+wxGUIEventLoop::~wxGUIEventLoop()
{
- wxASSERT_MSG( !m_impl, _T("should have been deleted in Run()") );
+ wxASSERT_MSG( !m_impl, wxT("should have been deleted in Run()") );
}
//////////////////////////////////////////////////////////////////////////////
class CallEventLoopMethod
{
public:
- typedef void (wxEventLoop::*FuncType)();
+ typedef void (wxGUIEventLoop::*FuncType)();
- CallEventLoopMethod(wxEventLoop *evtLoop, FuncType fn)
+ CallEventLoopMethod(wxGUIEventLoop *evtLoop, FuncType fn)
: m_evtLoop(evtLoop), m_fn(fn) { }
~CallEventLoopMethod() { (m_evtLoop->*m_fn)(); }
private:
- wxEventLoop *m_evtLoop;
+ wxGUIEventLoop *m_evtLoop;
FuncType m_fn;
};
-int wxEventLoop::Run()
+int wxGUIEventLoop::Run()
{
// event loops are not recursive, you need to create another loop!
- wxCHECK_MSG( !IsRunning(), -1, _T("can't reenter a message loop") );
+ wxCHECK_MSG( !IsRunning(), -1, wxT("can't reenter a message loop") );
// SendIdleMessage() and Dispatch() below may throw so the code here should
// be exception-safe, hence we must use local objects for all actions we
wxEventLoopActivator activate(this);
wxEventLoopImplTiedPtr impl(&m_impl, new wxEventLoopImpl);
- CallEventLoopMethod callOnExit(this, &wxEventLoop::OnExit);
+ CallEventLoopMethod callOnExit(this, &wxGUIEventLoop::OnExit);
for ( ;; )
{
wxMilliSleep(10);
}
+ OnExit();
+
return m_impl->GetExitCode();
}
-void wxEventLoop::Exit(int rc)
+void wxGUIEventLoop::Exit(int rc)
{
- wxCHECK_RET( IsRunning(), _T("can't call Exit() if not running") );
+ wxCHECK_RET( IsRunning(), wxT("can't call Exit() if not running") );
m_impl->SetExitCode(rc);
}
// ----------------------------------------------------------------------------
-// wxEventLoop message processing dispatching
+// wxGUIEventLoop message processing dispatching
// ----------------------------------------------------------------------------
-bool wxEventLoop::Pending() const
+bool wxGUIEventLoop::Pending() const
{
QMSG msg;
return ::WinPeekMsg(vHabmain, &msg, 0, 0, 0, PM_NOREMOVE) != 0;
}
-bool wxEventLoop::Dispatch()
+bool wxGUIEventLoop::Dispatch()
{
- wxCHECK_MSG( IsRunning(), false, _T("can't call Dispatch() if not running") );
+ wxCHECK_MSG( IsRunning(), false, wxT("can't call Dispatch() if not running") );
QMSG msg;
BOOL bRc = ::WinGetMsg(vHabmain, &msg, (HWND) NULL, 0, 0);
return true;
}
+
+//
+// Yield to incoming messages
+//
+bool wxGUIEventLoop::YieldFor(long eventsToProcess)
+{
+ HAB vHab = 0;
+ QMSG vMsg;
+
+ //
+ // Disable log flushing from here because a call to wxYield() shouldn't
+ // normally result in message boxes popping up &c
+ //
+ wxLog::Suspend();
+
+ m_isInsideYield = true;
+ m_eventsToProcessInsideYield = eventsToProcess;
+
+ //
+ // We want to go back to the main message loop
+ // if we see a WM_QUIT. (?)
+ //
+ while (::WinPeekMsg(vHab, &vMsg, (HWND)NULL, 0, 0, PM_NOREMOVE) && vMsg.msg != WM_QUIT)
+ {
+ // TODO: implement event filtering using the eventsToProcess mask
+
+#if wxUSE_THREADS
+ wxMutexGuiLeaveOrEnter();
+#endif // wxUSE_THREADS
+ if (!wxTheApp->Dispatch())
+ break;
+ }
+
+ //
+ // If they are pending events, we must process them.
+ //
+ if (wxTheApp)
+ {
+ wxTheApp->ProcessPendingEvents();
+ wxTheApp->HandleSockets();
+ }
+
+ //
+ // Let the logs be flashed again
+ //
+ wxLog::Resume();
+ m_isInsideYield = false;
+
+ return true;
+} // end of wxYield