X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f57fe24c6389876d7ddf02aa7a09f3b48a6956de..1aaaa7120e9a7a5c0c11fa1c532fef414f071594:/src/common/timercmn.cpp diff --git a/src/common/timercmn.cpp b/src/common/timercmn.cpp index 93e8beb8cc..8a34f3cfda 100644 --- a/src/common/timercmn.cpp +++ b/src/common/timercmn.cpp @@ -1,210 +1,247 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: timercmn.cpp +// Name: common/timercmn.cpp // Purpose: Common timer implementation // Author: Julian Smart -// Modified by: +// Modified by: Vadim Zeitlin on 12.11.99 to get rid of all ifdefs // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart and Markus Holzem // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + #ifdef __GNUG__ -//#pragma implementation "timercmn.h" -#pragma implementation + #pragma implementation "timerbase.h" #endif // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif #ifndef WX_PRECOMP -#include "wx/defs.h" -#include "wx/list.h" + #include "wx/intl.h" + #include "wx/log.h" #endif #include "wx/timer.h" -#ifdef __SVR4__ -#define __SYSV__ +// 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 -#include -#include +// TODO: #define WX_GMTOFF_IN_TM for Windows compilers which have it here -#if (!defined(__SC__) && !defined(__SGI__) && !defined(__GNUWIN32__)) || defined(__MINGW32__) -#include +#if defined(__WIN32__) && !defined(WX_GMTOFF_IN_TM) + #include #endif -#if defined(__linux__) || defined(__SVR4__) || defined(__SYSV__) || defined(__SGI__) || \ - defined(__ALPHA__) || defined(__GNUWIN32__) || defined(__FreeBSD__) || defined(__NetBSD__) -#include +#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 -#ifdef __MINGW32__ -#include "windows.h" -#endif +// ---------------------------------------------------------------------------- +// macros +// ---------------------------------------------------------------------------- -#if defined(__SUN__) || defined(__OSF__) -// At least on Sun, ftime is undeclared. -// Need to be verified on other platforms. -extern "C" int ftime(struct timeb *tp); -// extern "C" time_t time(time_t); -// #include -#if defined(__SVR4__) && !defined(__ALPHA__) -// ditto for gettimeofday on Solaris 2.x. -extern "C" int gettimeofday(struct timeval *tp, void *); -#endif -#endif +// 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 + +// ============================================================================ +// implementation +// ============================================================================ -/* - * Timer functions - * - */ +// ---------------------------------------------------------------------------- +// wxStopWatch +// ---------------------------------------------------------------------------- -long wxStartTime = 0; -void wxStartTimer(void) +void wxStopWatch::Start(long t) { -#if defined(__xlC__) || defined(__AIX__) || defined(__SVR4__) || defined(__SYSV__) || (defined(__GNUWIN32__) && !defined(__MINGW32__)) // || defined(__AIXV3__) - struct timeval tp; -#if defined(__SYSV__) || (defined (__GNUWIN32__) && !defined (__MINGW32__)) - gettimeofday(&tp, (struct timezone *)NULL); -#else - gettimeofday(&tp); -#endif - wxStartTime = 1000*tp.tv_sec + tp.tv_usec/1000; -#elif (defined(__SC__) || defined(__SGI__) || defined(___BSDI__) || defined(__ALPHA__) || defined(__MINGW32__)) - time_t t0; - struct tm *tp; - time(&t0); - tp = localtime(&t0); - wxStartTime = 1000*(60*(60*tp->tm_hour+tp->tm_min)+tp->tm_sec); -#else - struct timeb tp; - ftime(&tp); - wxStartTime = 1000*tp.time + tp.millitm; -#endif + m_t0 = wxGetCurrentMTime() - t; + + m_pause = 0; } -// Returns elapsed time in milliseconds -long wxGetElapsedTime(bool resetTimer) +long wxStopWatch::Time() const { -#if defined(__xlC__) || defined(__AIX__) || defined(__SVR4__) || defined(__SYSV__) || (defined(__GNUWIN32__) && !defined(__MINGW32__)) // || defined(__AIXV3__) - struct timeval tp; -#if defined(__SYSV__) || (defined (__GNUWIN32__) && !defined (__MINGW32__)) - gettimeofday(&tp, (struct timezone *)NULL); -#else - gettimeofday(&tp); -#endif - long oldTime = wxStartTime; - long newTime = 1000*tp.tv_sec + tp.tv_usec / 1000; - if (resetTimer) - wxStartTime = newTime; -#elif (defined(__SC__) || defined(__SGI__) || defined(___BSDI__) || defined(__ALPHA__) || defined(__MINGW32__)) - time_t t0; - struct tm *tp; - time(&t0); - tp = localtime(&t0); - long oldTime = wxStartTime; - long newTime = 1000*(60*(60*tp->tm_hour+tp->tm_min)+tp->tm_sec); - if (resetTimer) - wxStartTime = newTime; -#else - struct timeb tp; - ftime(&tp); - long oldTime = wxStartTime; - long newTime = 1000*tp.time + tp.millitm; - if (resetTimer) - wxStartTime = newTime; -#endif - return newTime - oldTime; + return m_pause ? m_pause : GetElapsedTime(); } -// EXPERIMENTAL: comment this out if it doesn't compile. -#ifndef __VMS__ -bool wxGetLocalTime(long *timeZone, int *dstObserved) +// ---------------------------------------------------------------------------- +// old timer functions superceded by wxStopWatch +// ---------------------------------------------------------------------------- + +static long wxStartTime = 0; + +// starts the global timer +void wxStartTimer() { -#if defined(__MINGW32__) && defined(__EGCS__) - time_t t0; - struct tm *tp; - time(&t0); - tp = localtime(&t0); - *timeZone = timezone; // tp->tm_gmtoff; // ??? - *dstObserved = tp->tm_isdst; -#elif defined(__MINGW32__) - time_t t0; - struct tm *tp; - time(&t0); - tp = localtime(&t0); - timeb tz; - ftime(& tz); - *timeZone = tz._timezone; - *dstObserved = tp->tm_isdst; -#else + wxStartTime = wxGetCurrentMTime(); +} -#if (((defined(__SYSV__) && !defined(__HPUX__)) || defined(__MSDOS__) || defined(__WXMSW__)) && !defined(__GNUWIN32__)) -#ifdef __BORLANDC__ - /* Borland uses underscores */ - *timeZone = _timezone; - *dstObserved = _daylight; -#else - *timeZone = timezone; - *dstObserved = daylight; -#endif -#elif defined(__xlC__) || defined(__AIX__) || defined(__SVR4__) || defined(__SYSV__) || (defined(__GNUWIN32__) && !defined(__MINGW32__)) // || defined(__AIXV3__) - struct timeval tp; -#if defined(__SYSV__) || (defined(__GNUWIN32__) && !defined(__MINGW32)) - struct timezone tz; - gettimeofday(&tp, &tz); - *timeZone = 60*(tz.tz_minuteswest); - *dstObserved = tz.tz_dsttime; -#else - time_t t0; - struct tm *tp; - time(&t0); - tp = localtime(&t0); - *timeZone = tp->tm_gmtoff; // ??? - *dstObserved = tp->tm_isdst; -#endif -#elif defined(__WXSTUBS__) - return FALSE; -#else -// #error wxGetLocalTime not implemented. - struct timeval tp; - struct timezone tz; - gettimeofday(&tp, &tz); - *timeZone = 60*(tz.tz_minuteswest); - *dstObserved = tz.tz_dsttime; -#endif -#endif - // __MINGW32__ - return TRUE; +// Returns elapsed time in milliseconds +long wxGetElapsedTime(bool resetTimer) +{ + long oldTime = wxStartTime; + long newTime = wxGetCurrentMTime(); + + if ( resetTimer ) + wxStartTime = newTime; + + return newTime - oldTime; } -#endif + // Get number of seconds since 00:00:00 GMT, Jan 1st 1970. -long wxGetCurrentTime(void) +long wxGetCurrentTime() { -#if defined(__xlC__) || defined(__AIX__) || defined(__SVR4__) || defined(__SYSV__) // || defined(__AIXV3__) - struct timeval tp; -#if defined(__SYSV__) || (defined (__GNUWIN32__) && !defined (__MINGW32__)) - gettimeofday(&tp, (struct timezone *)NULL); + return wxGetCurrentMTime() / 1000; +} + +// ---------------------------------------------------------------------------- +// the functions to get the current time and timezone info +// ---------------------------------------------------------------------------- + +// return GMT time in millisecond +long wxGetCurrentMTime() +{ +#if defined(__WIN32__) + SYSTEMTIME st; + ::GetLocalTime(&st); + + return 1000*(60*(60*st.wHour+st.wMinute)+st.wSecond)+st.wMilliseconds; #else - gettimeofday(&tp); -#endif - return tp.tv_sec; -#else // (defined(__SC__) || defined(__SGI__) || defined(___BSDI__) || defined(__ALPHA__)) - return time(0); -#endif -/* +#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 ) + { + 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 - struct timeb tp; - ftime(&tp); - return tp.time; + #error "no function to find the current time on this system" #endif -*/ + + wxLogSysError(_("Failed to get the system time")); + + return -1; +#endif // __WIN32__/!__WIN32__ } +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; + + 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; +}