/////////////////////////////////////////////////////////////////////////////
// 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 <guille@iies.es>
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// ============================================================================
// ============================================================================
// ----------------------------------------------------------------------------
-// headers
+// wxWin headers
// ----------------------------------------------------------------------------
-#ifdef __GNUG__
- #pragma implementation "timerbase.h"
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#pragma hdrstop
#endif
+#if wxUSE_TIMER
+
#ifndef WX_PRECOMP
- #include "wx/intl.h"
- #include "wx/log.h"
+ #include "wx/app.h"
#endif
#include "wx/timer.h"
-
-// I'm told VMS is POSIX, so should have localtime()
-#if defined(__WXMSW__) || defined(__VMS__)
- // configure might have found it already for us
- #ifndef HAVE_LOCALTIME
- #define HAVE_LOCALTIME
-
- // TODO add test for broken compilers here if needed
- #define WX_GMTOFF_IN_TM
- #endif
-#endif
-
-#if defined(HAVE_GETTIMEOFDAY)
- #include <sys/time.h>
- #include <unistd.h>
-#elif defined(HAVE_LOCALTIME)
- #include <time.h>
- #ifndef __WXMAC__
- #include <sys/types.h> // for time_t
- #endif
-#elif defined(HAVE_FTIME)
- #include <sys/timeb.h>
-#else
- #error "no function to find the current time on this system"
-#endif
+#include "wx/apptrait.h"
+#include "wx/private/timer.h"
// ----------------------------------------------------------------------------
-// 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)
+
+wxDEFINE_EVENT(wxEVT_TIMER, wxTimerEvent);
// ============================================================================
-// implementation
+// wxTimerBase implementation
// ============================================================================
-// ----------------------------------------------------------------------------
-// wxStopWatch
-// ----------------------------------------------------------------------------
-
-void wxStopWatch::Start(long t)
+wxTimer::~wxTimer()
{
- m_t0 = wxGetCurrentMTime() - t;
+ Stop();
- m_pause = 0;
+ delete m_impl;
}
-long wxStopWatch::Time() const
+void wxTimer::Init()
{
- return m_pause ? m_pause : GetElapsedTime();
-}
+ 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") );
-// ----------------------------------------------------------------------------
-// old timer functions superceded by wxStopWatch
-// ----------------------------------------------------------------------------
+ }
+}
-static long wxStartTime = 0;
+// ============================================================================
+// rest of wxTimer implementation forwarded to wxTimerImpl
+// ============================================================================
-// starts the global timer
-void wxStartTimer()
+void wxTimer::SetOwner(wxEvtHandler *owner, int timerid)
{
- wxStartTime = wxGetCurrentMTime();
+ wxCHECK_RET( m_impl, wxT("uninitialized timer") );
+
+ m_impl->SetOwner(owner, timerid);
}
-// Returns elapsed time in milliseconds
-long wxGetElapsedTime(bool resetTimer)
+wxEvtHandler *wxTimer::GetOwner() const
{
- long oldTime = wxStartTime;
- long newTime = wxGetCurrentMTime();
-
- if ( resetTimer )
- wxStartTime = newTime;
+ wxCHECK_MSG( m_impl, NULL, wxT("uninitialized timer") );
- return newTime - oldTime;
+ return m_impl->GetOwner();
}
-
-// Get number of seconds since 00:00:00 GMT, Jan 1st 1970.
-long wxGetCurrentTime()
+bool wxTimer::Start(int milliseconds, bool oneShot)
{
- return wxGetCurrentMTime() / 1000;
+ wxCHECK_MSG( m_impl, false, wxT("uninitialized timer") );
+
+ return m_impl->Start(milliseconds, oneShot);
}
-// ----------------------------------------------------------------------------
-// the functions to get the current time and timezone info
-// ----------------------------------------------------------------------------
+void wxTimer::Stop()
+{
+ wxCHECK_RET( m_impl, wxT("uninitialized timer") );
+
+ if ( m_impl->IsRunning() )
+ m_impl->Stop();
+}
-// return GMT time in millisecond
-long wxGetCurrentMTime()
+void wxTimer::Notify()
{
-#if defined(HAVE_LOCALTIME)
- time_t t0 = time(&t0);
- if ( t0 != (time_t)-1 )
- {
- struct tm *tp = localtime(&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.") );
- 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
- #error "no function to find the current time on this system"
-#endif
+ m_impl->SendEvent();
+}
- wxLogSysError(_("Failed to get the system time"));
+bool wxTimer::IsRunning() const
+{
+ wxCHECK_MSG( m_impl, false, wxT("uninitialized timer") );
- return -1;
+ return m_impl->IsRunning();
}
-bool wxGetLocalTime(long *timeZone, int *dstObserved)
+int wxTimer::GetId() const
{
-#if defined(HAVE_LOCALTIME) && defined(WX_GMTOFF_IN_TM)
- time_t t0 = time(&t0);
- if ( t0 != (time_t)-1 )
- {
- struct tm *tm = localtime(&t0);
+ wxCHECK_MSG( m_impl, wxID_ANY, wxT("uninitialized timer") );
- if ( tm )
- {
- *timeZone = tm->tm_gmtoff;
- *dstObserved = tm->tm_isdst;
+ return m_impl->GetId();
+}
- 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;
+int wxTimer::GetInterval() const
+{
+ wxCHECK_MSG( m_impl, -1, wxT("uninitialized timer") );
- return TRUE;
- }
-#elif defined(HAVE_FTIME)
- struct timeb tb;
- if ( ftime(&tb) == 0 )
- {
- *timeZone = 60*tb.timezone;
- *dstObserved = tb.dstflag;
- }
-#else
- // special hacks for known compilers - I wonder if this is still needed,
- // i.e. if there are any of them which don't support localtime()? (VZ)
-
- #if defined(__BORLANDC__)
- *timeZone = _timezone;
- *dstObserved = _daylight;
- #elif defined(__SALFORDC__)
- *timeZone = _timezone;
- *dstObserved = daylight;
- #elif defined(__VISAGECPP__)
- *timeZone = _timezone;
- *dstObserved = daylight;
- #else
- wxFAIL_MSG(_T("wxGetLocalTime() not implemented"));
- #endif // compiler
-#endif
+ return m_impl->GetInterval();
+}
+
+bool wxTimer::IsOneShot() const
+{
+ wxCHECK_MSG( m_impl, false, wxT("uninitialized timer") );
- return FALSE;
+ return m_impl->IsOneShot();
}
+
+#endif // wxUSE_TIMER
+