X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0e320a79f187558effb04d92020b470372bbe456..1e9b3eff21f80eb00f3c5639e0ac9a02f816c9a1:/src/os2/timer.cpp?ds=sidebyside diff --git a/src/os2/timer.cpp b/src/os2/timer.cpp index 5262040cf6..764afc22ab 100644 --- a/src/os2/timer.cpp +++ b/src/os2/timer.cpp @@ -1,52 +1,171 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: timer.cpp +// Name: src/os2/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" -#endif +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" -#include "wx/timer.h" +#include "wx/os2/private/timer.h" -#if !USE_SHARED_LIBRARY -IMPLEMENT_ABSTRACT_CLASS(wxTimer, wxObject) +#ifndef WX_PRECOMP + #include "wx/list.h" + #include "wx/window.h" + #include "wx/event.h" + #include "wx/app.h" + #include "wx/intl.h" + #include "wx/log.h" #endif -wxTimer::wxTimer() +#include "wx/os2/private.h" + +#include +#include + +#include + +// ---------------------------------------------------------------------------- +// private globals +// ---------------------------------------------------------------------------- + +// define a hash containing all the timers: it is indexed by timer id and +// contains the corresponding timer +WX_DECLARE_HASH_MAP(unsigned long, wxOS2TimerImpl *, wxIntegerHash, wxIntegerEqual, + wxTimerMap); + +// instead of using a global here, wrap it in a static function as otherwise it +// could have been used before being initialized if a timer object were created +// globally +static wxTimerMap& TimerMap() { - m_milli = 0 ; - m_id = 0; - m_oneShot = FALSE; + static wxTimerMap s_timerMap; + + return s_timerMap; } -wxTimer::~wxTimer() +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +// timer callback used for all timers +ULONG wxTimerProc(HWND hwnd, ULONG, int nIdTimer, ULONG); + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxTimer class +// ---------------------------------------------------------------------------- + +bool wxOS2TimerImpl::Start( int nMilliseconds, bool bOneShot ) { - Stop(); + if ( !wxTimerImpl::Start( nMilliseconds, bOneShot ) ) + return false; + + wxWindow* pWin = NULL; + + if (m_owner) + { + pWin = (wxWindow*)m_owner; + m_ulId = ::WinStartTimer( m_Hab + ,pWin->GetHWND() + ,m_idTimer + ,(ULONG)nMilliseconds + ); + } + else + { + m_ulId = ::WinStartTimer( m_Hab + ,NULLHANDLE + ,0 + ,(ULONG)nMilliseconds + ); + } + + if (m_ulId > 0L) + { + // check that SetTimer() didn't reuse an existing id: according to + // the MSDN this can happen and this would be catastrophic to us as + // we rely on ids uniquely identifying the timers because we use + // them as keys in the hash + if ( TimerMap().find(m_ulId) != TimerMap().end() ) + { + wxLogError(_("Timer creation failed.")); + + ::WinStopTimer(m_Hab, pWin?(pWin->GetHWND()):NULL, m_ulId); + m_ulId = 0; + + return false; + } + + TimerMap()[m_ulId] = this; + + return true; + } + else + { + wxLogSysError(_("Couldn't create a timer")); + + return false; + } } -bool wxTimer::Start(int milliseconds,bool mode) +void wxOS2TimerImpl::Stop() { - m_oneShot = mode ; - if (milliseconds <= 0) - return FALSE; + if ( m_ulId ) + { + if (m_owner) + { + wxWindow* pWin = (wxWindow*)m_owner; - m_milli = milliseconds; + ::WinStopTimer(m_Hab, pWin->GetHWND(), m_ulId); + } + else + ::WinStopTimer(m_Hab, NULLHANDLE, m_ulId); - // TODO: set the timer going. - return FALSE; + TimerMap().erase(m_ulId); + } + m_ulId = 0L; } -void wxTimer::Stop() +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +void wxProcessTimer( + wxOS2TimerImpl& rTimer +) { - m_id = 0 ; - m_milli = 0 ; + // + // 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 +) +{ + wxTimerMap::iterator node = TimerMap().find((ULONG)nIdTimer); + wxCHECK_MSG(node != TimerMap().end(), 0, + wxT("bogus timer id in wxTimerProc") ); + wxProcessTimer(*(node->second)); + return 0; +}