X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4bb6408c2631988fab9925014c6619358bf867de..58c7cd12b9035450e702d36dfdce63bfd008bcd0:/src/motif/timer.cpp diff --git a/src/motif/timer.cpp b/src/motif/timer.cpp index bca8e00e0c..69b4917557 100644 --- a/src/motif/timer.cpp +++ b/src/motif/timer.cpp @@ -14,13 +14,39 @@ #endif #include "wx/timer.h" +#include "wx/app.h" +#include "wx/list.h" + +#include + +#include "wx/motif/private.h" #if !USE_SHARED_LIBRARY IMPLEMENT_ABSTRACT_CLASS(wxTimer, wxObject) #endif +static wxList wxTimerList(wxKEY_INTEGER); + +void wxTimerCallback (wxTimer * timer) +{ + // Check to see if it's still on + if (!wxTimerList.Find((long)timer)) + 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 (); +} + wxTimer::wxTimer() { + m_id = 0; m_milli = 0 ; m_id = 0; m_oneShot = FALSE; @@ -29,23 +55,37 @@ wxTimer::wxTimer() wxTimer::~wxTimer() { Stop(); + wxTimerList.DeleteObject(this); } -bool wxTimer::Start(int milliseconds,bool mode) +bool wxTimer::Start(int milliseconds, bool mode) { - m_oneShot = mode ; + Stop(); + + m_oneShot = mode; + if (milliseconds < 0) + milliseconds = m_lastMilli; + if (milliseconds <= 0) return FALSE; - m_milli = milliseconds; + m_lastMilli = m_milli = milliseconds; + + if (!wxTimerList.Find((long)this)) + wxTimerList.Append((long)this, this); - // TODO: set the timer going. - return FALSE; + m_id = XtAppAddTimeOut ((XtAppContext) wxTheApp->GetAppContext(), milliseconds, + (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 ; }