X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/66a09d4776b8ae390d5aa51dbd678b694f2c81d6..f0834140313212fc54d09e28d21a95476d6545f2:/src/mac/timer.cpp diff --git a/src/mac/timer.cpp b/src/mac/timer.cpp index d485c86b8c..2355b8eace 100644 --- a/src/mac/timer.cpp +++ b/src/mac/timer.cpp @@ -26,6 +26,8 @@ IMPLEMENT_ABSTRACT_CLASS(wxTimer, wxObject) #include #endif +#include "wx/dynarray.h" + typedef struct MacTimerInfo { TMTask m_task; @@ -41,20 +43,33 @@ static pascal void MacTimerProc( TMTask * t ) wxMacAddEvent( tm->m_table , wxProcessTimer, 0 , (void*) tm->m_timer , TRUE ) ; } +wxArrayPtrVoid gTimersInProcess ; + static void wxProcessTimer( unsigned long event , void *data ) { if ( !data ) return ; wxTimer* timer = (wxTimer*) data ; + if ( timer->IsOneShot() ) timer->Stop() ; + gTimersInProcess.Add( timer ) ; + timer->Notify(); - if ( timer->m_info->m_task.tmAddr && !timer->IsOneShot() ) + int index = gTimersInProcess.Index( timer ) ; + + if ( index != wxNOT_FOUND ) { - PrimeTime( (QElemPtr) &timer->m_info->m_task , timer->GetInterval() ) ; + gTimersInProcess.RemoveAt( index ) ; + + if ( !timer->IsOneShot() && timer->m_info->m_task.tmAddr ) + { + PrimeTime( (QElemPtr) &timer->m_info->m_task , timer->GetInterval() ) ; + } + } } @@ -77,8 +92,13 @@ bool wxTimer::IsRunning() const wxTimer::~wxTimer() { Stop(); - delete m_info ; - m_info = NULL ; + if (m_info != NULL) { + delete m_info ; + m_info = NULL ; + } + int index = gTimersInProcess.Index( this ) ; + if ( index != wxNOT_FOUND ) + gTimersInProcess.RemoveAt( index ) ; } bool wxTimer::Start(int milliseconds,bool mode)