X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0e320a79f187558effb04d92020b470372bbe456..7b9da2077d0975db6c965a85c91d5aca671ab5e3:/src/os2/timer.cpp diff --git a/src/os2/timer.cpp b/src/os2/timer.cpp index 5262040cf6..6ae0e005b0 100644 --- a/src/os2/timer.cpp +++ b/src/os2/timer.cpp @@ -1,52 +1,142 @@ ///////////////////////////////////////////////////////////////////////////// // Name: timer.cpp // Purpose: wxTimer implementation -// Author: AUTHOR +// Author: David Webster // Modified by: -// Created: ??/??/98 +// Created: 10/17/99 // RCS-ID: $Id$ -// Copyright: (c) AUTHOR -// Licence: wxWindows licence +// Copyright: (c) David Webster +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "timer.h" +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#include "wx/window.h" +#include "wx/os2/private.h" + +#ifndef WX_PRECOMP + #include "wx/setup.h" + #include "wx/list.h" + #include "wx/event.h" + #include "wx/app.h" #endif +#include "wx/intl.h" +#include "wx/log.h" + #include "wx/timer.h" +#include +#include + +#include + +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +wxList wxTimerList(wxKEY_INTEGER); +ULONG wxTimerProc(HWND hwnd, ULONG, int nIdTimer, ULONG); + +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- + #if !USE_SHARED_LIBRARY IMPLEMENT_ABSTRACT_CLASS(wxTimer, wxObject) #endif wxTimer::wxTimer() { - m_milli = 0 ; - m_id = 0; - m_oneShot = FALSE; + m_ulId = 0; } wxTimer::~wxTimer() { Stop(); + + wxTimerList.DeleteObject(this); } -bool wxTimer::Start(int milliseconds,bool mode) +bool wxTimer::Start( + int nMilliseconds +, bool bOneShot +) { - m_oneShot = mode ; - if (milliseconds <= 0) - return FALSE; + (void)wxTimerBase::Start( nMilliseconds + ,bOneShot + ); + + wxCHECK_MSG( m_milli > 0L, FALSE, wxT("invalid value for timer") ); + + wxTimerList.DeleteObject(this); - m_milli = milliseconds; + // + // Create a windowless timer + // + m_ulId = ::WinStartTimer( m_Hab + ,NULL + ,(m_ulId ? m_ulId : 1L) + ,(ULONG)nMilliseconds + ); + if (m_ulId > 0L) + { + wxTimerList.Append( m_ulId + ,this + ); + return(TRUE); + } + else + { + wxLogSysError(_("Couldn't create a timer")); - // TODO: set the timer going. - return FALSE; + return(FALSE); + } } void wxTimer::Stop() { - m_id = 0 ; - m_milli = 0 ; + if ( m_ulId ) + { + ::WinStopTimer(m_Hab, NULL, m_ulId); + wxTimerList.DeleteObject(this); + } + m_ulId = 0L; } +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +void wxProcessTimer( + wxTimer& rTimer +) +{ + // + // Avoid to process spurious timer events + // + if (rTimer.m_ulId == 0L) + return; + + if (rTimer.IsOneShot()) + rTimer.Stop(); + + rTimer.Notify(); +} + +ULONG wxTimerProc( + HWND WXUNUSED(hwnd) +, ULONG +, int nIdTimer +, ULONG +) +{ + wxNode* pNode = wxTimerList.Find((ULONG)nIdTimer); + + wxCHECK_MSG(pNode, 0, wxT("bogus timer id in wxTimerProc") ); + + wxProcessTimer(*(wxTimer *)pNode->Data()); + return 0; +}