/////////////////////////////////////////////////////////////////////////////
-// 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 <guille@iies.es>
+// 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 <time.h>
+IMPLEMENT_DYNAMIC_CLASS(wxTimerEvent, wxEvent)
-#ifndef __WXMAC__
-#include <sys/types.h>
-#endif
+wxDEFINE_EVENT(wxEVT_TIMER, wxTimerEvent);
-#if (!defined(__SC__) && !defined(__SGI__) && !defined(__GNUWIN32__) && !defined(__MWERKS__)) || defined(__MINGW32__)
-#include <sys/timeb.h>
-#endif
-
-#if defined(__linux__) || defined(__SVR4__) || defined(__SYSV__) || defined(__SGI__) || \
- defined(__ALPHA__) || defined(__GNUWIN32__) || defined(__FreeBSD__) || defined(__NetBSD__) || \
- defined(__SALFORDC__) || defined(__EMX__)
-#include <sys/time.h>
-#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 <sys/timeb.h>
-#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=wxGetCurrentUTime();
+ Stop();
+
+ delete m_impl;
}
-// Returns elapsed time in milliseconds
-long wxGetElapsedTime(bool resetTimer)
+void wxTimer::Init()
{
- long oldTime = wxStartTime;
- long newTime=wxGetCurrentUTime();
+ 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 wxGetCurrentUTime()/1000;
+ wxCHECK_RET( m_impl, wxT("uninitialized timer") );
+
+ m_impl->SetOwner(owner, timerid);
}
-// return GMT time in millisecond
-long wxGetCurrentUTime()
+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=wxGetCurrentUTime()-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=wxGetCurrentUTime()-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=wxGetCurrentUTime()-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 wxGetCurrentUTime()-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
+