+ wxTimer* timer = (wxTimer*) data;
+ if ( timer->IsOneShot() )
+ timer->Stop();
+
+ gTimersInProcess.Add( timer );
+ timer->Notify();
+
+ int index = gTimersInProcess.Index( timer );
+ if ( index != wxNOT_FOUND )
+ {
+ gTimersInProcess.RemoveAt( index );
+
+ if ( !timer->IsOneShot() && timer->m_info->m_task.tmAddr )
+ PrimeTime( (QElemPtr) &timer->m_info->m_task, timer->GetInterval() );
+ }
+}
+
+void wxTimer::Init()
+{
+ m_info = new MacTimerInfo();
+ m_info->m_task.tmAddr = NULL;
+ m_info->m_task.tmWakeUp = 0;
+ m_info->m_task.tmReserved = 0;
+ m_info->m_task.qType = 0;
+ m_info->m_table = wxMacGetNotifierTable();
+ m_info->m_timer = this;
+}
+
+bool wxTimer::IsRunning() const
+{
+ // as the qType may already indicate it is elapsed, but it
+ // was not handled internally yet
+ return ( m_info->m_task.tmAddr != NULL );
+}
+
+wxTimer::~wxTimer()
+{
+ Stop();
+ 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 )
+{
+ (void)wxTimerBase::Start( milliseconds, mode );
+
+ wxCHECK_MSG( m_milli > 0, false, wxT("invalid value for timer timeout") );
+ wxCHECK_MSG( m_info->m_task.tmAddr == NULL, false, wxT("attempting to restart a timer") );
+
+ m_info->m_task.tmAddr = NewTimerUPP( MacTimerProc );
+ m_info->m_task.tmWakeUp = 0;
+ m_info->m_task.tmReserved = 0;
+ m_info->m_task.qType = 0;
+ m_info->m_timer = this;
+ InsXTime( (QElemPtr) &m_info->m_task );
+ PrimeTime( (QElemPtr) &m_info->m_task, m_milli );
+
+ return true;
+}
+
+void wxTimer::Stop()
+{
+ if ( m_info->m_task.tmAddr )
+ {
+ RmvTime( (QElemPtr) &m_info->m_task );
+ DisposeTimerUPP( m_info->m_task.tmAddr );
+ m_info->m_task.tmAddr = NULL;
+ }
+
+ wxMacRemoveAllNotifiersForData( wxMacGetNotifierTable(), this );
+}
+
+#endif