X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/df69528b7eacc7c74f31879e761c804e470d12f8..31a9fc93900c8f958a4d37b3281e73f7601e6a63:/src/motif/timer.cpp?ds=sidebyside diff --git a/src/motif/timer.cpp b/src/motif/timer.cpp index 48677e8a1f..fb6815fc06 100644 --- a/src/motif/timer.cpp +++ b/src/motif/timer.cpp @@ -12,7 +12,7 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#include "wx/timer.h" +#include "wx/motif/private/timer.h" #ifndef WX_PRECOMP #include "wx/app.h" @@ -29,66 +29,66 @@ #include "wx/motif/private.h" -IMPLEMENT_ABSTRACT_CLASS(wxTimer, wxEvtHandler) +WX_DECLARE_VOIDPTR_HASH_MAP(wxMotifTimerImpl*, wxTimerHashMap); -WX_DECLARE_VOIDPTR_HASH_MAP(wxTimer*, wxTimerHashMap); +static wxTimerHashMap gs_timers; -static wxTimerHashMap s_timers; - -void wxTimerCallback (wxTimer * timer) +void wxTimerCallback (wxMotifTimerImpl *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(); + // Check to see if it's still on + if ( gs_timers.find(timer) == gs_timers.end() ) + return; + + if ( !timer->IsRunning() ) + return; // Avoid to process spurious timer events + + timer->Notify(); } -void wxTimer::Init() +wxMotifTimerImpl::~wxMotifTimerImpl() { - m_id = 0; - m_milli = 1000; + gs_timers.erase(this); } -wxTimer::~wxTimer() +void wxMotifTimerImpl::DoStart() { - Stop(); - s_timers.erase(this); + m_id = XtAppAddTimeOut((XtAppContext) wxTheApp->GetAppContext(), + m_milli, + (XtTimerCallbackProc) wxTimerCallback, + (XtPointer) this); } -bool wxTimer::Start(int milliseconds, bool mode) +bool wxMotifTimerImpl::Start(int milliseconds, bool mode) { - Stop(); + if ( !wxTimerImpl::Start(milliseconds, mode) ) + return false; - (void)wxTimerBase::Start(milliseconds, mode); + if ( gs_timers.find(this) == gs_timers.end() ) + gs_timers[this] = this; - if (s_timers.find(this) == s_timers.end()) - s_timers[this] = this; + DoStart(); - m_id = XtAppAddTimeOut((XtAppContext) wxTheApp->GetAppContext(), - m_milli, - (XtTimerCallbackProc) wxTimerCallback, - (XtPointer) this); return true; } -void wxTimer::Stop() +void wxMotifTimerImpl::Stop() +{ + XtRemoveTimeOut (m_id); + m_id = 0; +} + +void wxMotifTimerImpl::Notify() { - if (m_id > 0) + if ( IsOneShot() ) { - XtRemoveTimeOut (m_id); + // nothing to do, timeout is removed automatically by X m_id = 0; } - m_milli = 0 ; + else // rearm the timer + { + DoStart(); + } + + wxTimerImpl::Notify(); } +