home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / CPROG / WXWIN140.ZIP / SRC / WX_TIMER.CC < prev    next >
C/C++ Source or Header  |  1993-04-18  |  5KB  |  203 lines

  1. /*
  2.  * File:     wx_timer.cc
  3.  * Purpose:  wxTimer implementation
  4.  *
  5.  *                       wxWindows 1.40
  6.  * Copyright (c) 1993 Artificial Intelligence Applications Institute,
  7.  *                   The University of Edinburgh
  8.  *
  9.  *                     Author: Julian Smart
  10.  *                       Date: 18-4-93
  11.  *
  12.  * Permission to use, copy, modify, and distribute this software and its
  13.  * documentation for any purpose is hereby granted without fee, provided
  14.  * that the above copyright notice, author statement and this permission
  15.  * notice appear in all copies of this software and related documentation.
  16.  *
  17.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS,
  18.  * IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
  19.  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  20.  *
  21.  * IN NO EVENT SHALL THE ARTIFICIAL INTELLIGENCE APPLICATIONS INSTITUTE OR THE
  22.  * UNIVERSITY OF EDINBURGH BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR
  23.  * CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM
  24.  * LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF
  25.  * DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH
  26.  * THE USE OR PERFORMANCE OF THIS SOFTWARE.
  27.  */
  28.  
  29. #include <windows.h>
  30. #include <time.h>
  31. #include <sys/types.h>
  32. #include <sys/timeb.h>
  33. #include "wx_timer.h"
  34. #include "wx_list.h"
  35. #include "wx_main.h"
  36. #include "wx_frame.h"
  37.  
  38. #ifdef wx_motif
  39. #include <Xm/Xm.h>
  40. #endif
  41.  
  42. #ifdef wx_x // Can't find an include file with this in!!
  43. extern "C" int ftime(struct timeb *);
  44. #endif
  45.  
  46. #ifdef wx_motif
  47. void wxTimerCallback(wxTimer *timer)
  48. {
  49.   timer->timerId = XtAppAddTimeOut(wxTheApp->appContext, timer->milli, wxTimerCallback, timer);
  50.   timer->Notify();
  51. }
  52. #endif
  53.  
  54. #ifdef wx_msw
  55. wxList wxTimerList(wxKEY_INTEGER);
  56. UINT FAR PASCAL _export wxTimerProc(HWND hwnd, WORD, int idTimer, DWORD);
  57. #endif
  58.  
  59. #ifdef wx_xview
  60. Notify_value wxTimerFunc(Notify_client client, int which);
  61. #endif
  62.  
  63. wxTimer::wxTimer(void)
  64. {
  65. #ifdef wx_motif
  66.   timerId = 0;
  67.   milli = 0;
  68. #endif
  69. #ifdef wx_xview
  70.   timerval.it_value.tv_usec = 0;
  71.   timerval.it_interval.tv_usec = 0;
  72. #endif
  73. #ifdef wx_msw
  74.   id = 0;
  75.   milli = -1;
  76. #endif
  77. }
  78.  
  79. wxTimer::~wxTimer(void)
  80. {
  81.   Stop();
  82. #ifdef wx_msw
  83.   wxTimerList.DeleteObject(this);
  84. #endif
  85. }
  86.  
  87. Bool wxTimer::Start(int milliseconds)
  88. {
  89. #ifdef wx_motif
  90.   milli = milliseconds;
  91.   timerId = XtAppAddTimeOut(wxTheApp->appContext, milliseconds, wxTimerCallback, this);
  92.   return TRUE;
  93. #endif
  94. #ifdef wx_xview
  95.   if (milliseconds > -1)
  96.   {
  97.     long secs = (long)(milliseconds/1000);
  98.     long usecs = (long)(milliseconds - 1000*secs)*1000;
  99.  
  100.     timerval.it_value.tv_sec = secs;
  101.     timerval.it_interval.tv_sec = secs;
  102.  
  103.     timerval.it_value.tv_usec = usecs;
  104.     timerval.it_interval.tv_usec = usecs;
  105.   }
  106.  
  107.   notify_set_itimer_func((Notify_client)this, (Notify_func)wxTimerFunc, ITIMER_REAL,
  108.                          &timerval, NULL);
  109.   return TRUE;
  110. #endif
  111. #ifdef wx_msw
  112.   if (milliseconds < 0)
  113.     milliseconds = milli;
  114.  
  115.   if (milliseconds < 0)
  116.     return FALSE;
  117.  
  118.   milli = milliseconds;
  119.  
  120.   wxTimerList.DeleteObject(this);
  121.   TIMERPROC wxTimerProcInst = (TIMERPROC) MakeProcInstance((FARPROC)wxTimerProc,
  122.                                           wxhInstance);
  123.  
  124.   id = SetTimer(NULL, (UINT)(id ? id : 1), (UINT)milliseconds, wxTimerProcInst);
  125.   if (id > 0)
  126.   {
  127.     wxTimerList.Append(id, this);
  128.     return TRUE;
  129.   }
  130.   else return FALSE;
  131. #endif
  132. }
  133.  
  134. void wxTimer::Stop(void)
  135. {
  136. #ifdef wx_motif
  137.   if (timerId > 0)
  138.   {
  139.     XtRemoveTimeOut(timerId);
  140.     timerId = 0;
  141.   }
  142. #endif
  143. #ifdef wx_xview
  144.   notify_set_itimer_func((Notify_client)this, NOTIFY_FUNC_NULL, ITIMER_REAL,
  145.                          NULL, NULL);
  146. #endif
  147. #ifdef wx_msw
  148.   KillTimer(NULL, (UINT)id);
  149. #endif
  150. }
  151.  
  152. // Override me!
  153. void wxTimer::Notify(void)
  154. {
  155. }
  156.  
  157. #ifdef wx_xview
  158. Notify_value wxTimerFunc(Notify_client client, int which)
  159. {
  160.   wxTimer *timer = (wxTimer *)client;
  161.   timer->Notify();
  162.   return NOTIFY_DONE;
  163. }
  164. #endif
  165.  
  166. #ifdef wx_msw
  167. UINT FAR PASCAL _export wxTimerProc(HWND hwnd, WORD, int idTimer, DWORD)
  168.  
  169. {
  170.   wxNode *node = wxTimerList.Find((long)idTimer);
  171.   if (node)
  172.   {
  173.     wxTimer *timer = (wxTimer *)node->Data();
  174.     timer->Notify();
  175.   }
  176.   return 0;
  177. }
  178.  
  179. #endif
  180.  
  181. /*
  182.  * Timer functions
  183.  *
  184.  */
  185.  
  186. long wxStartTime = 0;
  187. void wxStartTimer(void)
  188. {
  189.   struct timeb tp;
  190.   ftime(&tp);
  191.   wxStartTime = 1000*tp.time + tp.millitm;
  192. }
  193.  
  194. // Returns elapsed time in milliseconds
  195. long wxGetElapsedTime(void)
  196. {
  197.   struct timeb tp;
  198.   ftime(&tp);
  199.   long oldTime = wxStartTime;
  200.   wxStartTime = 1000*tp.time + tp.millitm;
  201.   return wxStartTime - oldTime;
  202. }
  203.