X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d90895ac118ad4546eed7ee4c358a3fe644a1ad7..2e14066008229145e2da7b9f05a478ce38631f83:/src/os2/timer.cpp?ds=inline diff --git a/src/os2/timer.cpp b/src/os2/timer.cpp index bca6302c87..764afc22ab 100644 --- a/src/os2/timer.cpp +++ b/src/os2/timer.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: timer.cpp +// Name: src/os2/timer.cpp // Purpose: wxTimer implementation // Author: David Webster // Modified by: @@ -12,20 +12,18 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#include "wx/window.h" -#include "wx/os2/private.h" +#include "wx/os2/private/timer.h" #ifndef WX_PRECOMP - #include "wx/setup.h" #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 -#include "wx/intl.h" -#include "wx/log.h" - -#include "wx/timer.h" +#include "wx/os2/private.h" #include #include @@ -33,102 +31,141 @@ #include // ---------------------------------------------------------------------------- -// private functions +// private globals // ---------------------------------------------------------------------------- -wxList wxTimerList(wxKEY_INTEGER); -UINT wxTimerProc(HWND hwnd, WORD, int idTimer, DWORD); +// 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() +{ + static wxTimerMap s_timerMap; + + return s_timerMap; +} // ---------------------------------------------------------------------------- -// macros +// private functions // ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY -IMPLEMENT_ABSTRACT_CLASS(wxTimer, wxObject) -#endif +// timer callback used for all timers +ULONG wxTimerProc(HWND hwnd, ULONG, int nIdTimer, ULONG); -wxTimer::wxTimer() -{ - milli = 0 ; - id = 0; - oneShot = FALSE; -} +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxTimer class +// ---------------------------------------------------------------------------- -wxTimer::~wxTimer() +bool wxOS2TimerImpl::Start( int nMilliseconds, bool bOneShot ) { - Stop(); + if ( !wxTimerImpl::Start( nMilliseconds, bOneShot ) ) + return false; - wxTimerList.DeleteObject(this); -} + wxWindow* pWin = NULL; -bool wxTimer::Start(int milliseconds,bool mode) -{ - oneShot = mode; - if (milliseconds < 0) - milliseconds = lastMilli; + 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 + ); + } - wxCHECK_MSG( milliseconds > 0, FALSE, wxT("invalid value for timer timeour") ); + 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.")); - lastMilli = milli = milliseconds; + ::WinStopTimer(m_Hab, pWin?(pWin->GetHWND()):NULL, m_ulId); + m_ulId = 0; - wxTimerList.DeleteObject(this); -// TODO: -/* - TIMERPROC wxTimerProcInst = (TIMERPROC) - MakeProcInstance((FARPROC)wxTimerProc, wxGetInstance()); + return false; + } - id = SetTimer(NULL, (UINT)(id ? id : 1), - (UINT)milliseconds, wxTimerProcInst); -*/ - if (id > 0) - { - wxTimerList.Append(id, this); + TimerMap()[m_ulId] = this; - return TRUE; + return true; } else { wxLogSysError(_("Couldn't create a timer")); - return FALSE; + return false; } } -void wxTimer::Stop() +void wxOS2TimerImpl::Stop() { - if ( id ) + if ( m_ulId ) { -// KillTimer(NULL, (UINT)id); - wxTimerList.DeleteObject(this); + if (m_owner) + { + wxWindow* pWin = (wxWindow*)m_owner; + + ::WinStopTimer(m_Hab, pWin->GetHWND(), m_ulId); + } + else + ::WinStopTimer(m_Hab, NULLHANDLE, m_ulId); + + TimerMap().erase(m_ulId); } - id = 0; - milli = 0; + m_ulId = 0L; } // ---------------------------------------------------------------------------- // private functions // ---------------------------------------------------------------------------- -void wxProcessTimer(wxTimer& timer) +void wxProcessTimer( + wxOS2TimerImpl& rTimer +) { + // // Avoid to process spurious timer events - if ( timer.id == 0) + // + if (rTimer.m_ulId == 0L) return; - if ( timer.oneShot ) - timer.Stop(); + if (rTimer.IsOneShot()) + rTimer.Stop(); - timer.Notify(); + rTimer.Notify(); } -UINT wxTimerProc(HWND WXUNUSED(hwnd), WORD, int idTimer, DWORD) +ULONG wxTimerProc( + HWND WXUNUSED(hwnd) +, ULONG +, int nIdTimer +, ULONG +) { - wxNode *node = wxTimerList.Find((long)idTimer); - - wxCHECK_MSG( node, 0, wxT("bogus timer id in wxTimerProc") ); - - wxProcessTimer(*(wxTimer *)node->Data()); + wxTimerMap::iterator node = TimerMap().find((ULONG)nIdTimer); + wxCHECK_MSG(node != TimerMap().end(), 0, + wxT("bogus timer id in wxTimerProc") ); + wxProcessTimer(*(node->second)); return 0; } -