X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ec7cd4c478ae1a192c21a89a41bd499e5bc0908a..20ea6894a2660c453c3255a66aa9f7e24cf97ec8:/src/common/timercmn.cpp diff --git a/src/common/timercmn.cpp b/src/common/timercmn.cpp index 0a9261b912..93b58499e5 100644 --- a/src/common/timercmn.cpp +++ b/src/common/timercmn.cpp @@ -49,7 +49,7 @@ #include #endif -#if defined(__WIN32__) && !defined(HAVE_FTIME) +#if defined(__WIN32__) && !defined(HAVE_FTIME) && !defined(__MWERKS__) #define HAVE_FTIME #endif @@ -60,6 +60,11 @@ # endif #endif +#if defined(__MWERKS__) && defined(__WXMSW__) +# undef HAVE_FTIME +# undef HAVE_GETTIMEOFDAY +#endif + #include #ifndef __WXMAC__ #include // for time_t @@ -72,6 +77,10 @@ #include #endif +#ifdef __WXMAC__ + #include + #include +#endif // ---------------------------------------------------------------------------- // wxWin macros // ---------------------------------------------------------------------------- @@ -105,6 +114,11 @@ #if wxUSE_GUI && wxUSE_TIMER +wxTimerBase::~wxTimerBase() +{ + // this destructor is required for Darwin +} + void wxTimerBase::Notify() { // the base class version generates an event if it has owner - which it @@ -151,12 +165,12 @@ void wxStopWatch::Start(long t) long wxStopWatch::GetElapsedTime() const { - return (wxGetLocalTimeMillis() - m_t0).GetLo(); + return (wxGetLocalTimeMillis() - m_t0).GetLo(); } long wxStopWatch::Time() const { - return (m_pause ? m_pause : GetElapsedTime()); + return m_pauseCount ? m_pause : GetElapsedTime(); } #endif // wxUSE_LONGLONG @@ -284,7 +298,24 @@ wxLongLong wxGetLocalTimeMillis() // If possible, use a function which avoids conversions from // broken-up time structures to milliseconds -#if defined(HAVE_GETTIMEOFDAY) +#if defined(__WXMSW__) && defined(__MWERKS__) + // This should probably be the way all WXMSW compilers should do it + // Go direct to the OS for time + + SYSTEMTIME thenst = { 1970, 1, 4, 1, 0, 0, 0, 0 }; // 00:00:00 Jan 1st 1970 + FILETIME thenft; + SystemTimeToFileTime( &thenst, &thenft ); + wxLongLong then( thenft.dwHighDateTime, thenft.dwLowDateTime ); // time in 100 nanoseconds + + SYSTEMTIME nowst; + GetLocalTime( &nowst ); + FILETIME nowft; + SystemTimeToFileTime( &nowst, &nowft ); + wxLongLong now( nowft.dwHighDateTime, nowft.dwLowDateTime ); // time in 100 nanoseconds + + return ( now - then ) / 10000.0; // time from 00:00:00 Jan 1st 1970 to now in milliseconds + +#elif defined(HAVE_GETTIMEOFDAY) struct timeval tp; if ( wxGetTimeOfDay(&tp, (struct timezone *)NULL) != -1 ) { @@ -304,6 +335,22 @@ wxLongLong wxGetLocalTimeMillis() (void)ftime(&tp); val *= tp.time; return (val + tp.millitm); +#elif defined(__WXMAC__) + + unsigned long secs ; + UInt64 gMilliAtStart = 0 ; + Nanoseconds upTime = AbsoluteToNanoseconds( UpTime() ) ; + if ( gMilliAtStart == 0 ) + { + time_t start = time(NULL) ; + gMilliAtStart = ((UInt64) start) * 1000L ; + gMilliAtStart -= upTime.lo / 1000 ; + gMilliAtStart -= ( ( (UInt64) upTime.hi ) << 32 ) / 1000 ; + } + UInt64 millival = gMilliAtStart ; + millival += upTime.lo / 1000 ; + millival += ( ( (UInt64) upTime.hi ) << 32 ) / 1000 ; + return millival ; #else // no gettimeofday() nor ftime() // We use wxGetLocalTime() to get the seconds since // 00:00:00 Jan 1st 1970 and then whatever is available