X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/925fcf5f1b38c232b2156b8e85987ef75df6d4e3..137c8bde085d6d5b7c459902d2ea1a198ab48765:/src/generic/timer.cpp diff --git a/src/generic/timer.cpp b/src/generic/timer.cpp index 406fb93634..92b513ef35 100644 --- a/src/generic/timer.cpp +++ b/src/generic/timer.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: mgl/timer.cpp +// Name: src/generic/timer.cpp // Purpose: wxTimer implementation // Author: Vaclav Slavik // Id: $Id$ @@ -7,10 +7,6 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "timer.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -24,11 +20,14 @@ // is in wxEventLoop::Dispatch(). // ---------------------------------------------------------------------------- +#if wxUSE_TIMER + #include "wx/timer.h" -#if wxUSE_TIMER +#ifndef WX_PRECOMP + #include "wx/log.h" +#endif -#include "wx/log.h" #include "wx/module.h" // ---------------------------------------------------------------------------- @@ -47,6 +46,28 @@ #define wxTimerTickFmtSpec _T("lu") #define wxTimerTickPrintfArg(tt) (tt) + + #ifdef __DOS__ + // Under DOS the MGL timer has a 24hr period, so consider the 12 hours + // before y to be 'less' and the the 12 hours after 'greater' modulo + // 24 hours. + inline bool wxTickGreaterEqual(wxTimerTick_t x, wxTimerTick_t y) + { + // _EVT_getTicks wraps at 1573040 * 55 + const wxTimerTick_t modulus = 1573040 * 55; + return (2 * modulus + x - y) % modulus < modulus / 2; + } + #else + // If wxTimerTick_t is 32-bits then it'll wrap in around 50 days. So + // let the 25 days before y be 'less' and 25 days after be 'greater'. + inline bool wxTickGreaterEqual(wxTimerTick_t x, wxTimerTick_t y) + { + // This code assumes wxTimerTick_t is an unsigned type. + // Set half_modulus with top bit set and the rest zeros. + const wxTimerTick_t half_modulus = ~((~(wxTimerTick_t)0) >> 1); + return x - y < half_modulus; + } + #endif #else // !__WXMGL__ #define GetMillisecondsTime wxGetLocalTimeMillis @@ -59,6 +80,11 @@ #define wxTimerTickFmtSpec _T("s") #define wxTimerTickPrintfArg(tt) (tt.ToString().c_str()) #endif // wx/native long long + + inline bool wxTickGreaterEqual(wxTimerTick_t x, wxTimerTick_t y) + { + return x >= y; + } #endif // __WXMGL__/!__WXMGL__ // ---------------------------------------------------------------------------- @@ -145,7 +171,7 @@ void wxTimerScheduler::NotifyTimers() for ( wxTimerDesc *desc = m_timers; desc; desc = desc->next ) { - if ( desc->running && desc->shotTime <= now ) + if ( desc->running && wxTickGreaterEqual(now, desc->shotTime) ) { oneShot = desc->timer->IsOneShot(); RemoveTimer(desc); @@ -167,7 +193,11 @@ void wxTimerScheduler::NotifyTimers() QueueTimer(desc, now + desc->timer->GetInterval()); } else + { desc = m_timers; + if (!desc) + break; + } } } }