X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b76b015ed9231ffe128ddba9fb35e37b4be9764d..ce7208d49d5ce2ca1dc0b3b83f14f1d04f29c4bf:/src/common/timercmn.cpp?ds=sidebyside diff --git a/src/common/timercmn.cpp b/src/common/timercmn.cpp index 8a34f3cfda..90623b23eb 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,64 @@ #pragma hdrstop #endif -#ifndef WX_PRECOMP - #include "wx/intl.h" - #include "wx/log.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 wxUSE_TIMER -#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" +#ifndef WX_PRECOMP + #include "wx/timer.h" #endif // ---------------------------------------------------------------------------- -// 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) -{ - m_t0 = wxGetCurrentMTime() - t; - - m_pause = 0; -} - -long wxStopWatch::Time() const -{ - return m_pause ? m_pause : GetElapsedTime(); -} - -// ---------------------------------------------------------------------------- -// old timer functions superceded by wxStopWatch -// ---------------------------------------------------------------------------- - -static long wxStartTime = 0; - -// starts the global timer -void wxStartTimer() +wxTimerBase::~wxTimerBase() { - wxStartTime = wxGetCurrentMTime(); + // this destructor is required for Darwin } -// Returns elapsed time in milliseconds -long wxGetElapsedTime(bool resetTimer) +void wxTimerBase::Notify() { - long oldTime = wxStartTime; - long newTime = wxGetCurrentMTime(); - - if ( resetTimer ) - wxStartTime = newTime; - - return newTime - oldTime; -} - + // the base class version generates an event if it has owner - which it + // should because otherwise nobody can process timer events + wxCHECK_RET( m_owner, _T("wxTimer::Notify() should be overridden.") ); -// Get number of seconds since 00:00:00 GMT, Jan 1st 1970. -long wxGetCurrentTime() -{ - return wxGetCurrentMTime() / 1000; + wxTimerEvent event(m_idTimer, m_milli); + event.SetEventObject(this); + (void)m_owner->ProcessEvent(event); } -// ---------------------------------------------------------------------------- -// the functions to get the current time and timezone info -// ---------------------------------------------------------------------------- - -// return GMT time in millisecond -long wxGetCurrentMTime() +bool wxTimerBase::Start(int milliseconds, bool oneShot) { -#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); - - 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 ) + // under MSW timers only work when they're started from the main thread so + // let the caller know about it +#if wxUSE_THREADS + wxASSERT_MSG( wxThread::IsMain(), + _T("timer can only be started from the main thread") ); +#endif // wxUSE_THREADS + + if ( IsRunning() ) { - return (1000*tp.tv_sec + tp.tv_usec / 1000); + // not stopping the already running timer might work for some + // platforms (no problems under MSW) but leads to mysterious crashes + // on the others (GTK), so to be on the safe side do it here + Stop(); } -#elif defined(HAVE_FTIME) - struct timeb tp; - if ( ftime(&tp) == 0 ) + + if ( milliseconds != -1 ) { - return (1000*tp.time + tp.millitm); + m_milli = milliseconds; } -#else - #error "no function to find the current time on this system" -#endif - wxLogSysError(_("Failed to get the system time")); + m_oneShot = oneShot; - return -1; -#endif // __WIN32__/!__WIN32__ + return true; } -bool wxGetLocalTime(long *timeZone, int *dstObserved) -{ -#if defined(HAVE_LOCALTIME) && defined(WX_GMTOFF_IN_TM) - time_t t0 = time(&t0); - if ( t0 != (time_t)-1 ) - { - struct tm *tm = localtime(&t0); - - if ( tm ) - { - *timeZone = tm->tm_gmtoff; - *dstObserved = tm->tm_isdst; - - 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; +#endif // wxUSE_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; -}