]> git.saurik.com Git - wxWidgets.git/blame - src/common/timercmn.cpp
Added wxWakeUpIdle() for MSW and empty stubs for Motif, OS2, and Mac
[wxWidgets.git] / src / common / timercmn.cpp
CommitLineData
c801d85f 1/////////////////////////////////////////////////////////////////////////////
0470b1e6 2// Name: common/timercmn.cpp
c801d85f
KB
3// Purpose: Common timer implementation
4// Author: Julian Smart
0470b1e6 5// Modified by: Vadim Zeitlin on 12.11.99 to get rid of all ifdefs
c801d85f
KB
6// Created: 04/01/98
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart and Markus Holzem
9// Licence: wxWindows license
10/////////////////////////////////////////////////////////////////////////////
11
0470b1e6
VZ
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
c801d85f 20#ifdef __GNUG__
0470b1e6 21 #pragma implementation "timerbase.h"
c801d85f
KB
22#endif
23
24// For compilers that support precompilation, includes "wx.h".
25#include "wx/wxprec.h"
26
27#ifdef __BORLANDC__
0470b1e6 28 #pragma hdrstop
c801d85f
KB
29#endif
30
31#ifndef WX_PRECOMP
0470b1e6
VZ
32 #include "wx/intl.h"
33 #include "wx/log.h"
c801d85f
KB
34#endif
35
36#include "wx/timer.h"
37
0470b1e6 38// I'm told VMS is POSIX, so should have localtime()
6b1e0606 39#if defined(__WXMSW__) || defined(__VMS__) || defined(__WXPM__)
0470b1e6
VZ
40 // configure might have found it already for us
41 #ifndef HAVE_LOCALTIME
42 #define HAVE_LOCALTIME
0470b1e6
VZ
43 #endif
44#endif
45
07cf98cb
VZ
46// TODO: #define WX_GMTOFF_IN_TM for Windows compilers which have it here
47
48#if defined(__WIN32__) && !defined(WX_GMTOFF_IN_TM)
c09f2879 49 #include <windows.h>
07cf98cb
VZ
50#endif
51
0470b1e6
VZ
52#if defined(HAVE_GETTIMEOFDAY)
53 #include <sys/time.h>
54 #include <unistd.h>
55#elif defined(HAVE_LOCALTIME)
56 #include <time.h>
57 #ifndef __WXMAC__
58 #include <sys/types.h> // for time_t
59 #endif
60#elif defined(HAVE_FTIME)
61 #include <sys/timeb.h>
62#else
63 #error "no function to find the current time on this system"
c801d85f
KB
64#endif
65
0470b1e6
VZ
66// ----------------------------------------------------------------------------
67// macros
68// ----------------------------------------------------------------------------
ce3ed50d 69
0470b1e6
VZ
70// on some really old systems gettimeofday() doesn't have the second argument,
71// define wxGetTimeOfDay() to hide this difference
72#ifdef HAVE_GETTIMEOFDAY
73 #ifdef WX_GETTIMEOFDAY_NO_TZ
74 struct timezone;
75 #define wxGetTimeOfDay(tv, tz) gettimeofday(tv)
76 #else
77 #define wxGetTimeOfDay(tv, tz) gettimeofday((tv), (tz))
78 #endif
79#endif // HAVE_GETTIMEOFDAY
c801d85f 80
0470b1e6
VZ
81// ============================================================================
82// implementation
83// ============================================================================
c801d85f 84
0470b1e6
VZ
85// ----------------------------------------------------------------------------
86// wxStopWatch
87// ----------------------------------------------------------------------------
c801d85f 88
0470b1e6
VZ
89void wxStopWatch::Start(long t)
90{
91 m_t0 = wxGetCurrentMTime() - t;
c801d85f 92
0470b1e6
VZ
93 m_pause = 0;
94}
95
96long wxStopWatch::Time() const
97{
98 return m_pause ? m_pause : GetElapsedTime();
99}
100
101// ----------------------------------------------------------------------------
102// old timer functions superceded by wxStopWatch
103// ----------------------------------------------------------------------------
c801d85f 104
0470b1e6 105static long wxStartTime = 0;
c801d85f 106
0470b1e6
VZ
107// starts the global timer
108void wxStartTimer()
c801d85f 109{
0470b1e6 110 wxStartTime = wxGetCurrentMTime();
c801d85f
KB
111}
112
113// Returns elapsed time in milliseconds
114long wxGetElapsedTime(bool resetTimer)
f0599ea9 115{
0470b1e6
VZ
116 long oldTime = wxStartTime;
117 long newTime = wxGetCurrentMTime();
f0599ea9 118
0470b1e6
VZ
119 if ( resetTimer )
120 wxStartTime = newTime;
121
122 return newTime - oldTime;
f0599ea9
SB
123}
124
125
126// Get number of seconds since 00:00:00 GMT, Jan 1st 1970.
0470b1e6 127long wxGetCurrentTime()
f0599ea9 128{
0470b1e6 129 return wxGetCurrentMTime() / 1000;
f0599ea9
SB
130}
131
0470b1e6
VZ
132// ----------------------------------------------------------------------------
133// the functions to get the current time and timezone info
134// ----------------------------------------------------------------------------
135
f0599ea9 136// return GMT time in millisecond
4f3ac409 137long wxGetCurrentMTime()
c801d85f 138{
0470b1e6
VZ
139#if defined(HAVE_LOCALTIME)
140 time_t t0 = time(&t0);
141 if ( t0 != (time_t)-1 )
142 {
143 struct tm *tp = localtime(&t0);
144
145 if ( tp )
146 {
147 return 1000*(60*(60*tp->tm_hour+tp->tm_min)+tp->tm_sec);
148 }
149 }
150#elif defined(HAVE_GETTIMEOFDAY)
151 struct timeval tp;
152 if ( wxGetTimeOfDay(&tp, (struct timezone *)NULL) != -1 )
153 {
154 return (1000*tp.tv_sec + tp.tv_usec / 1000);
155 }
156#elif defined(HAVE_FTIME)
157 struct timeb tp;
158 if ( ftime(&tp) == 0 )
159 {
160 return (1000*tp.time + tp.millitm);
161 }
c801d85f 162#else
0470b1e6 163 #error "no function to find the current time on this system"
c801d85f 164#endif
c801d85f 165
0470b1e6 166 wxLogSysError(_("Failed to get the system time"));
f0599ea9 167
0470b1e6 168 return -1;
f0599ea9
SB
169}
170
c801d85f
KB
171bool wxGetLocalTime(long *timeZone, int *dstObserved)
172{
0470b1e6
VZ
173#if defined(HAVE_LOCALTIME) && defined(WX_GMTOFF_IN_TM)
174 time_t t0 = time(&t0);
175 if ( t0 != (time_t)-1 )
176 {
177 struct tm *tm = localtime(&t0);
178
179 if ( tm )
180 {
181 *timeZone = tm->tm_gmtoff;
182 *dstObserved = tm->tm_isdst;
183
184 return TRUE;
185 }
186 }
187#elif defined(HAVE_GETTIMEOFDAY) && !defined(WX_GETTIMEOFDAY_NO_TZ)
188 struct timeval tp;
189 struct timezone tz;
190 if ( gettimeofday(&tp, &tz) != -1 )
191 {
192 *timeZone = 60*tz.tz_minuteswest;
193 *dstObserved = tz.tz_dsttime;
194
195 return TRUE;
196 }
197#elif defined(HAVE_FTIME)
198 struct timeb tb;
199 if ( ftime(&tb) == 0 )
200 {
201 *timeZone = 60*tb.timezone;
202 *dstObserved = tb.dstflag;
203 }
07cf98cb
VZ
204#else // no standard function return tz info
205 // special hacks for known compilers
206 #if defined(__BORLANDC__) || defined(__VISUALC__)
0470b1e6
VZ
207 *timeZone = _timezone;
208 *dstObserved = _daylight;
209 #elif defined(__SALFORDC__)
210 *timeZone = _timezone;
211 *dstObserved = daylight;
212 #elif defined(__VISAGECPP__)
213 *timeZone = _timezone;
214 *dstObserved = daylight;
07cf98cb
VZ
215 #elif defined(__WIN32__)
216 TIME_ZONE_INFORMATION tzInfo;
217 switch ( GetTimeZoneInformation(&tzInfo) )
218 {
219 default:
220 wxFAIL_MSG(_T("unknown GetTimeZoneInformation return code"));
221 // fall through
222
223 case TIME_ZONE_ID_UNKNOWN:
224 case TIME_ZONE_ID_STANDARD:
225 *dstObserved = FALSE;
226 break;
227
228 case TIME_ZONE_ID_DAYLIGHT:
229 *dstObserved = TRUE;
230 break;
231 }
232
233 *timeZone = 60*tzInfo.Bias;
0470b1e6
VZ
234 #else
235 wxFAIL_MSG(_T("wxGetLocalTime() not implemented"));
236 #endif // compiler
07cf98cb 237#endif // all ways in the known Universe to get tz info
0470b1e6
VZ
238
239 return FALSE;
c801d85f 240}