X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4f3ac409263ef169b015057f2718c6a98498f163..94e0018723919fe2ca2f5b5f0a42804c16dbf3a1:/src/common/timercmn.cpp diff --git a/src/common/timercmn.cpp b/src/common/timercmn.cpp index b1556e325e..ee7a83f4b1 100644 --- a/src/common/timercmn.cpp +++ b/src/common/timercmn.cpp @@ -1,230 +1,139 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: timercmn.cpp -// Purpose: Common timer implementation -// Author: Julian Smart -// Modified by: +// Name: src/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 + #pragma hdrstop #endif +#if wxUSE_TIMER + #ifndef WX_PRECOMP -#include "wx/defs.h" -#include "wx/list.h" + #include "wx/app.h" #endif #include "wx/timer.h" +#include "wx/apptrait.h" +#include "wx/private/timer.h" -#if defined(__SVR4__) && !defined(__SYSV__) -#define __SYSV__ -#endif +// ---------------------------------------------------------------------------- +// wxWin macros +// ---------------------------------------------------------------------------- -#include +IMPLEMENT_DYNAMIC_CLASS(wxTimerEvent, wxEvent) -#ifndef __WXMAC__ -#include -#endif +wxDEFINE_EVENT(wxEVT_TIMER, wxTimerEvent); -#if (!defined(__SC__) && !defined(__SGI__) && !defined(__GNUWIN32__) && !defined(__MWERKS__)) || defined(__MINGW32__) -#include -#endif - -#if defined(__linux__) || defined(__SVR4__) || defined(__SYSV__) || defined(__SGI__) || \ - defined(__ALPHA__) || defined(__GNUWIN32__) || defined(__FreeBSD__) || defined(__NetBSD__) || \ - defined(__SALFORDC__) || defined(__EMX__) -#include -#endif +// ============================================================================ +// wxTimerBase implementation +// ============================================================================ -#ifdef __MINGW32__ -#include "windows.h" -#endif - -#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 - -/* - * Timer functions - * - */ - -long wxStartTime = 0; -void wxStartTimer(void) +wxTimer::~wxTimer() { - wxStartTime=wxGetCurrentMTime(); + Stop(); + + delete m_impl; } -// Returns elapsed time in milliseconds -long wxGetElapsedTime(bool resetTimer) +void wxTimer::Init() { - long oldTime = wxStartTime; - long newTime=wxGetCurrentMTime(); + wxAppTraits * const traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + m_impl = traits ? traits->CreateTimerImpl(this) : NULL; + if ( !m_impl ) + { + wxFAIL_MSG( wxT("No timer implementation for this platform") ); - if (resetTimer) wxStartTime = newTime; - return newTime - oldTime; + } } +// ============================================================================ +// rest of wxTimer implementation forwarded to wxTimerImpl +// ============================================================================ -// Get number of seconds since 00:00:00 GMT, Jan 1st 1970. -long wxGetCurrentTime(void) +void wxTimer::SetOwner(wxEvtHandler *owner, int timerid) { - return wxGetCurrentMTime()/1000; + wxCHECK_RET( m_impl, wxT("uninitialized timer") ); + + m_impl->SetOwner(owner, timerid); } -// return GMT time in millisecond -long wxGetCurrentMTime() +wxEvtHandler *wxTimer::GetOwner() 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 - 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 -} + wxCHECK_MSG( m_impl, NULL, wxT("uninitialized timer") ); -//--------------- -// wxChrono class -// This class encapsulates the above fonctions, -// such that several wxChrono can be created -// simultaneously + return m_impl->GetOwner(); +} -wxChrono::wxChrono() +bool wxTimer::Start(int milliseconds, bool oneShot) { - Start(); + wxCHECK_MSG( m_impl, false, wxT("uninitialized timer") ); + + return m_impl->Start(milliseconds, oneShot); } -void wxChrono::Start(long t) +void wxTimer::Stop() { - m_t0=wxGetCurrentMTime()-t; - m_pause=0; + wxCHECK_RET( m_impl, wxT("uninitialized timer") ); + + if ( m_impl->IsRunning() ) + m_impl->Stop(); } -void wxChrono::Pause() +void wxTimer::Notify() { - m_pause=wxGetCurrentMTime()-m_t0; + // the base class version generates an event if it has owner - which it + // should because otherwise nobody can process timer events + wxCHECK_RET( GetOwner(), wxT("wxTimer::Notify() should be overridden.") ); + + m_impl->SendEvent(); } -void wxChrono::Resume() +bool wxTimer::IsRunning() const { - m_t0=wxGetCurrentMTime()-m_pause; - m_pause=0; + wxCHECK_MSG( m_impl, false, wxT("uninitialized timer") ); + + return m_impl->IsRunning(); } -long wxChrono::Time() +int wxTimer::GetId() const { - if (m_pause) return m_pause; - return wxGetCurrentMTime()-m_t0; + wxCHECK_MSG( m_impl, wxID_ANY, wxT("uninitialized timer") ); + + return m_impl->GetId(); } +int wxTimer::GetInterval() const +{ + wxCHECK_MSG( m_impl, -1, wxT("uninitialized timer") ); + return m_impl->GetInterval(); +} -// EXPERIMENTAL: comment this out if it doesn't compile. -#ifndef __VMS__ -bool wxGetLocalTime(long *timeZone, int *dstObserved) +bool wxTimer::IsOneShot() const { -#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; + wxCHECK_MSG( m_impl, false, wxT("uninitialized timer") ); + + return m_impl->IsOneShot(); } -#endif + +#endif // wxUSE_TIMER +