X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f0599ea91951caa2cda364498ea844be593b8a2a..517cce713e1f345bbf656ef5f02ab2f18f278491:/src/common/timercmn.cpp diff --git a/src/common/timercmn.cpp b/src/common/timercmn.cpp index db6eeee6b8..90623b23eb 100644 --- a/src/common/timercmn.cpp +++ b/src/common/timercmn.cpp @@ -1,230 +1,88 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: timercmn.cpp -// Purpose: Common timer implementation -// Author: Julian Smart -// Modified by: +// Name: common/timercmn.cpp +// 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 ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -//#pragma implementation "timercmn.h" -#pragma implementation -#endif +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxWin headers +// ---------------------------------------------------------------------------- // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop -#endif - -#ifndef WX_PRECOMP -#include "wx/defs.h" -#include "wx/list.h" -#endif - -#include "wx/timer.h" - -#if defined(__SVR4__) && !defined(__SYSV__) -#define __SYSV__ -#endif - -#include - -#ifndef __WXMAC__ -#include + #pragma hdrstop #endif -#if (!defined(__SC__) && !defined(__SGI__) && !defined(__GNUWIN32__) && !defined(__MWERKS__)) || defined(__MINGW32__) -#include -#endif +#if wxUSE_TIMER -#if defined(__linux__) || defined(__SVR4__) || defined(__SYSV__) || defined(__SGI__) || \ - defined(__ALPHA__) || defined(__GNUWIN32__) || defined(__FreeBSD__) || defined(__NetBSD__) || \ - defined(__SALFORDC__) || defined(__EMX__) -#include +#ifndef WX_PRECOMP + #include "wx/timer.h" #endif -#ifdef __MINGW32__ -#include "windows.h" -#endif +// ---------------------------------------------------------------------------- +// wxWin macros +// ---------------------------------------------------------------------------- -#if defined(__SUN__) || defined(__OSF__) || defined(__FreeBSD__) -// At least on Sun, ftime is undeclared. -// Need to be verified on other platforms. -extern "C" int ftime(struct timeb *tp); -//extern "C" int gettimeofday(struct timeval *tp, void *); -// 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 +IMPLEMENT_DYNAMIC_CLASS(wxTimerEvent, wxEvent) -/* - * Timer functions - * - */ +// ============================================================================ +// wxTimerBase implementation +// ============================================================================ -long wxStartTime = 0; -void wxStartTimer(void) +wxTimerBase::~wxTimerBase() { - wxStartTime=wxGetCurrentUTime(); + // this destructor is required for Darwin } -// Returns elapsed time in milliseconds -long wxGetElapsedTime(bool resetTimer) +void wxTimerBase::Notify() { - long oldTime = wxStartTime; - long newTime=wxGetCurrentUTime(); + // 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.") ); - if (resetTimer) wxStartTime = newTime; - return newTime - oldTime; + wxTimerEvent event(m_idTimer, m_milli); + event.SetEventObject(this); + (void)m_owner->ProcessEvent(event); } - -// Get number of seconds since 00:00:00 GMT, Jan 1st 1970. -long wxGetCurrentTime(void) +bool wxTimerBase::Start(int milliseconds, bool oneShot) { - return wxGetCurrentUTime()/1000; + // 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() ) + { + // 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(); + } + + if ( milliseconds != -1 ) + { + m_milli = milliseconds; + } + + m_oneShot = oneShot; + + return true; } -// return GMT time in millisecond -long wxGetCurrentUTime() -{ -#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 - return (1000*tp.tv_sec + tp.tv_usec / 1000); -#elif (defined(__SC__) || defined(__SGI__) || defined(___BSDI__) || defined(__ALPHA__) || \ - defined(__MINGW32__)|| defined(__MWERKS__) || defined(__FreeBSD__)) - time_t t0; - struct tm *tp; - time(&t0); - tp = localtime(&t0); - return 1000*(60*(60*tp->tm_hour+tp->tm_min)+tp->tm_sec); -#else - struct timeb tp; - ftime(&tp); - return (1000*tp.time + tp.millitm); -#endif -} +#endif // wxUSE_TIMER -//--------------- -// wxChrono class -// This class encapsulates the above fonctions, -// such that several wxChrono can be created -// simultaneously - -wxChrono::wxChrono() -{ - Start(); -} - -void wxChrono::Start(long t) -{ - m_t0=wxGetCurrentUTime()-t; - m_pause=0; -} - -void wxChrono::Pause() -{ - m_pause=wxGetCurrentUTime()-m_t0; -} - -void wxChrono::Resume() -{ - m_t0=wxGetCurrentUTime()-m_pause; - m_pause=0; -} - -long wxChrono::Time() -{ - if (m_pause) return m_pause; - return wxGetCurrentUTime()-m_t0; -} - - - -// EXPERIMENTAL: comment this out if it doesn't compile. -#ifndef __VMS__ -bool wxGetLocalTime(long *timeZone, int *dstObserved) -{ -#if defined(__MINGW32__) - time_t t0; - struct tm *tp; - time(&t0); - tp = localtime(&t0); -# if __GNUC__ == 2 && __GNUC_MINOR__ <= 8 - // gcc 2.8.x or earlier - timeb tz; - ftime(& tz); - *timeZone = tz._timezone; -# else - // egcs or gcc 2.95 - *timeZone = _timezone; // tp->tm_gmtoff; // ??? -# endif - *dstObserved = tp->tm_isdst; -#else -// not mingw32... -#if (((defined(__SYSV__) && !defined(__HPUX__)) || defined(__MSDOS__) || defined(__WXMSW__) || defined(__WXPM__)) \ - && !defined(__GNUWIN32__) && !defined(__MWERKS__) ) -# if defined(__BORLANDC__) - /* Borland uses underscores */ - *timeZone = _timezone; - *dstObserved = _daylight; -# elif defined(__SALFORDC__) - *timeZone = _timezone; - *dstObserved = daylight; -# elif defined(__VISAGECPP__) - *timeZone = _timezone; - *dstObserved = daylight; -# else - *timeZone = timezone; - *dstObserved = daylight; -# endif -#elif defined(__xlC__) || defined(__AIX__) || defined(__SVR4__) || defined(__SYSV__) || defined(__MWERKS__) || (defined(__GNUWIN32__) && !defined(__MINGW32__)) // || defined(__AIXV3__) -# ifndef __MWERKS__ // shouldn't this be one scope below ? - struct timeval tp; -# endif -# 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); -# ifndef __MWERKS__ - *timeZone = tp->tm_gmtoff; // ??? -# else - *timeZone = 0 ; -# endif - *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; -} -#endif