X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4bb6408c2631988fab9925014c6619358bf867de..926ce9e3ac32e1a33cc43420f76876fac8868436:/src/motif/timer.cpp?ds=inline diff --git a/src/motif/timer.cpp b/src/motif/timer.cpp index bca8e00e0c..edf7f20a5e 100644 --- a/src/motif/timer.cpp +++ b/src/motif/timer.cpp @@ -9,43 +9,84 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "timer.h" -#endif +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" #include "wx/timer.h" +#include "wx/app.h" +#include "wx/hashmap.h" -#if !USE_SHARED_LIBRARY -IMPLEMENT_ABSTRACT_CLASS(wxTimer, wxObject) +#ifdef __VMS__ +#pragma message disable nosimpint +#endif +#include +#ifdef __VMS__ +#pragma message enable nosimpint #endif -wxTimer::wxTimer() +#include "wx/motif/private.h" + +IMPLEMENT_ABSTRACT_CLASS(wxTimer, wxEvtHandler) + +WX_DECLARE_VOIDPTR_HASH_MAP(wxTimer*, wxTimerHashMap); + +static wxTimerHashMap s_timers; + +void wxTimerCallback (wxTimer * timer) +{ + // Check to see if it's still on + if (s_timers.find(timer) == s_timers.end()) + return; + + if (timer->m_id == 0) + return; // Avoid to process spurious timer events + + if (!timer->m_oneShot) + timer->m_id = XtAppAddTimeOut((XtAppContext) wxTheApp->GetAppContext(), + timer->m_milli, + (XtTimerCallbackProc) wxTimerCallback, + (XtPointer) timer); + else + timer->m_id = 0; + + timer->Notify(); +} + +void wxTimer::Init() { - m_milli = 0 ; m_id = 0; - m_oneShot = FALSE; + m_milli = 1000; } wxTimer::~wxTimer() { Stop(); + s_timers.erase(this); } -bool wxTimer::Start(int milliseconds,bool mode) +bool wxTimer::Start(int milliseconds, bool mode) { - m_oneShot = mode ; - if (milliseconds <= 0) - return FALSE; + Stop(); + + (void)wxTimerBase::Start(milliseconds, mode); - m_milli = milliseconds; + if (s_timers.find(this) == s_timers.end()) + s_timers[this] = this; - // TODO: set the timer going. - return FALSE; + m_id = XtAppAddTimeOut((XtAppContext) wxTheApp->GetAppContext(), + m_milli, + (XtTimerCallbackProc) wxTimerCallback, + (XtPointer) this); + return true; } void wxTimer::Stop() { - m_id = 0 ; + if (m_id > 0) + { + XtRemoveTimeOut (m_id); + m_id = 0; + } m_milli = 0 ; }