X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b76b015ed9231ffe128ddba9fb35e37b4be9764d..0bc58f95801cc427948326d79269cdd92b0780ca:/src/common/timercmn.cpp diff --git a/src/common/timercmn.cpp b/src/common/timercmn.cpp index 8a34f3cfda..bb89232709 100644 --- a/src/common/timercmn.cpp +++ b/src/common/timercmn.cpp @@ -1,12 +1,13 @@ ///////////////////////////////////////////////////////////////////////////// // Name: common/timercmn.cpp -// Purpose: Common timer implementation -// Author: Julian Smart -// Modified by: Vadim Zeitlin on 12.11.99 to get rid of all ifdefs +// Purpose: wxTimerBase implementation +// Author: Julian Smart, Guillermo Rodriguez, Vadim Zeitlin +// Modified by: VZ: extracted all non-wxTimer stuff in stopwatch.cpp (20.06.03) // Created: 04/01/98 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Copyright: (c) Julian Smart +// (c) 1999 Guillermo Rodriguez +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -14,13 +15,9 @@ // ============================================================================ // ---------------------------------------------------------------------------- -// headers +// wxWin headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ - #pragma implementation "timerbase.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -28,220 +25,113 @@ #pragma hdrstop #endif +#if wxUSE_TIMER + #ifndef WX_PRECOMP - #include "wx/intl.h" - #include "wx/log.h" + #include "wx/app.h" #endif #include "wx/timer.h" - -// I'm told VMS is POSIX, so should have localtime() -#if defined(__WXMSW__) || defined(__VMS__) || defined(__WXPM__) || defined(__WXMAC__) - // configure might have found it already for us - #ifndef HAVE_LOCALTIME - #define HAVE_LOCALTIME - #endif -#endif - -// TODO: #define WX_GMTOFF_IN_TM for Windows compilers which have it here - -#if defined(__WIN32__) && !defined(WX_GMTOFF_IN_TM) - #include -#endif - -#if defined(HAVE_GETTIMEOFDAY) - #include - #include -#elif defined(HAVE_LOCALTIME) - #include - #ifndef __WXMAC__ - #include // for time_t - #endif -#elif defined(HAVE_FTIME) - #include -#else - #error "no function to find the current time on this system" -#endif +#include "wx/apptrait.h" +#include "wx/private/timer.h" // ---------------------------------------------------------------------------- -// macros +// wxWin macros // ---------------------------------------------------------------------------- -// on some really old systems gettimeofday() doesn't have the second argument, -// define wxGetTimeOfDay() to hide this difference -#ifdef HAVE_GETTIMEOFDAY - #ifdef WX_GETTIMEOFDAY_NO_TZ - struct timezone; - #define wxGetTimeOfDay(tv, tz) gettimeofday(tv) - #else - #define wxGetTimeOfDay(tv, tz) gettimeofday((tv), (tz)) - #endif -#endif // HAVE_GETTIMEOFDAY +IMPLEMENT_DYNAMIC_CLASS(wxTimerEvent, wxEvent) // ============================================================================ -// implementation +// wxTimerBase implementation // ============================================================================ -// ---------------------------------------------------------------------------- -// wxStopWatch -// ---------------------------------------------------------------------------- - -void wxStopWatch::Start(long t) +wxTimer::~wxTimer() { - m_t0 = wxGetCurrentMTime() - t; + Stop(); - m_pause = 0; + delete m_impl; } -long wxStopWatch::Time() const +void wxTimer::Init() { - return m_pause ? m_pause : GetElapsedTime(); -} + wxAppTraits * const traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + m_impl = traits ? traits->CreateTimerImpl(this) : NULL; + if ( !m_impl ) + { + wxFAIL_MSG( _T("No timer implementation for this platform") ); -// ---------------------------------------------------------------------------- -// old timer functions superceded by wxStopWatch -// ---------------------------------------------------------------------------- + } +} -static long wxStartTime = 0; +// ============================================================================ +// rest of wxTimer implementation forwarded to wxTimerImpl +// ============================================================================ -// starts the global timer -void wxStartTimer() +void wxTimer::SetOwner(wxEvtHandler *owner, int timerid) { - wxStartTime = wxGetCurrentMTime(); + wxCHECK_RET( m_impl, _T("uninitialized timer") ); + + m_impl->SetOwner(owner, timerid); } -// Returns elapsed time in milliseconds -long wxGetElapsedTime(bool resetTimer) +wxEvtHandler *wxTimer::GetOwner() const { - long oldTime = wxStartTime; - long newTime = wxGetCurrentMTime(); - - if ( resetTimer ) - wxStartTime = newTime; + wxCHECK_MSG( m_impl, NULL, _T("uninitialized timer") ); - return newTime - oldTime; + return m_impl->GetOwner(); } +bool wxTimer::Start(int milliseconds, bool oneShot) +{ + wxCHECK_MSG( m_impl, false, _T("uninitialized timer") ); + + return m_impl->Start(milliseconds, oneShot); +} -// Get number of seconds since 00:00:00 GMT, Jan 1st 1970. -long wxGetCurrentTime() +void wxTimer::Stop() { - return wxGetCurrentMTime() / 1000; + wxCHECK_RET( m_impl, _T("uninitialized timer") ); + + if ( m_impl->IsRunning() ) + m_impl->Stop(); } -// ---------------------------------------------------------------------------- -// the functions to get the current time and timezone info -// ---------------------------------------------------------------------------- +void wxTimer::Notify() +{ + // the base class version generates an event if it has owner - which it + // should because otherwise nobody can process timer events + wxCHECK_RET( GetOwner(), _T("wxTimer::Notify() should be overridden.") ); -// return GMT time in millisecond -long wxGetCurrentMTime() + m_impl->SendEvent(); +} + +bool wxTimer::IsRunning() const { -#if defined(__WIN32__) - SYSTEMTIME st; - ::GetLocalTime(&st); - - return 1000*(60*(60*st.wHour+st.wMinute)+st.wSecond)+st.wMilliseconds; -#else -#if defined(HAVE_LOCALTIME) - time_t t0 = time(&t0); - if ( t0 != (time_t)-1 ) - { - struct tm *tp = localtime(&t0); + wxCHECK_MSG( m_impl, false, _T("uninitialized timer") ); - if ( tp ) - { - return 1000*(60*(60*tp->tm_hour+tp->tm_min)+tp->tm_sec); - } - } -#elif defined(HAVE_GETTIMEOFDAY) - struct timeval tp; - if ( wxGetTimeOfDay(&tp, (struct timezone *)NULL) != -1 ) - { - return (1000*tp.tv_sec + tp.tv_usec / 1000); - } -#elif defined(HAVE_FTIME) - struct timeb tp; - if ( ftime(&tp) == 0 ) - { - return (1000*tp.time + tp.millitm); - } -#else - #error "no function to find the current time on this system" -#endif + return m_impl->IsRunning(); +} - wxLogSysError(_("Failed to get the system time")); +int wxTimer::GetId() const +{ + wxCHECK_MSG( m_impl, wxID_ANY, _T("uninitialized timer") ); - return -1; -#endif // __WIN32__/!__WIN32__ + return m_impl->GetId(); } -bool wxGetLocalTime(long *timeZone, int *dstObserved) +int wxTimer::GetInterval() const { -#if defined(HAVE_LOCALTIME) && defined(WX_GMTOFF_IN_TM) - time_t t0 = time(&t0); - if ( t0 != (time_t)-1 ) - { - struct tm *tm = localtime(&t0); + wxCHECK_MSG( m_impl, -1, _T("uninitialized timer") ); - if ( tm ) - { - *timeZone = tm->tm_gmtoff; - *dstObserved = tm->tm_isdst; + return m_impl->GetInterval(); +} - return TRUE; - } - } -#elif defined(HAVE_GETTIMEOFDAY) && !defined(WX_GETTIMEOFDAY_NO_TZ) - struct timeval tp; - struct timezone tz; - if ( gettimeofday(&tp, &tz) != -1 ) - { - *timeZone = 60*tz.tz_minuteswest; - *dstObserved = tz.tz_dsttime; +bool wxTimer::IsOneShot() const +{ + wxCHECK_MSG( m_impl, false, _T("uninitialized timer") ); - return TRUE; - } -#elif defined(HAVE_FTIME) - struct timeb tb; - if ( ftime(&tb) == 0 ) - { - *timeZone = 60*tb.timezone; - *dstObserved = tb.dstflag; - } -#else // no standard function return tz info - // special hacks for known compilers - #if defined(__BORLANDC__) || defined(__VISUALC__) - *timeZone = _timezone; - *dstObserved = _daylight; - #elif defined(__SALFORDC__) - *timeZone = _timezone; - *dstObserved = daylight; - #elif defined(__VISAGECPP__) - *timeZone = _timezone; - *dstObserved = daylight; - #elif defined(__WIN32__) - TIME_ZONE_INFORMATION tzInfo; - switch ( GetTimeZoneInformation(&tzInfo) ) - { - default: - wxFAIL_MSG(_T("unknown GetTimeZoneInformation return code")); - // fall through - - case TIME_ZONE_ID_UNKNOWN: - case TIME_ZONE_ID_STANDARD: - *dstObserved = FALSE; - break; - - case TIME_ZONE_ID_DAYLIGHT: - *dstObserved = TRUE; - break; - } - - *timeZone = 60*tzInfo.Bias; - #else - wxFAIL_MSG(_T("wxGetLocalTime() not implemented")); - #endif // compiler -#endif // all ways in the known Universe to get tz info - - return FALSE; + return m_impl->IsOneShot(); } + +#endif // wxUSE_TIMER +