From 63b7efeaa740de9b1787d6f9a758a8215539cb11 Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Fri, 5 Feb 2010 00:26:01 +0000 Subject: [PATCH] Backport r62977 and others from trunk to allow timers with ID of zero. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@63390 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/msw/timer.cpp | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/msw/timer.cpp b/src/msw/timer.cpp index cece7e76a1..49f02870b6 100644 --- a/src/msw/timer.cpp +++ b/src/msw/timer.cpp @@ -120,16 +120,25 @@ wxTimer::~wxTimer() bool wxTimer::Start(int milliseconds, bool oneShot) { - (void)wxTimerBase::Start(milliseconds, oneShot); + if ( !wxTimerBase::Start(milliseconds, oneShot) ) + return false; - wxCHECK_MSG( m_milli > 0, false, wxT("invalid value for timer timeout") ); + // SetTimer() doesn't accept 0 timer id so use something else if the timer + // id at wx level is 0: as -1 (wxID_ANY) can't be used, we can safely + // replace 0 with it at MSW level + UINT idTimer = GetId(); + if ( !idTimer ) + idTimer = (UINT)-1; - m_id = ::SetTimer( - wxTimerHiddenWindowModule::GetHWND(), // window to send the messages to - GetId(), // timer ID - (UINT)m_milli, // delay - NULL // timer proc. Not used since we pass hwnd - ); + // SetTimer() normally returns just idTimer but this might change in the + // future so use its return value to be safe + m_id = ::SetTimer + ( + wxTimerHiddenWindowModule::GetHWND(), // window for WM_TIMER + idTimer, // timer ID to create + (UINT)m_milli, // delay + NULL // timer proc (unused) + ); if ( !m_id ) { @@ -141,6 +150,11 @@ bool wxTimer::Start(int milliseconds, bool oneShot) // 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 + // + // notice that this also happens if the same id is reused for multiple + // timers: this used to work in previous versions but was never supported + // and absolutely shouldn't be done, use wxID_ANY to assign an id to the + // timer automatically or ensure that all your timers have unique ids if ( TimerMap().find(m_id) != TimerMap().end() ) { wxLogError(_("Timer creation failed."));