]>
git.saurik.com Git - wxWidgets.git/blob - src/os2/timer.cpp
   1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/os2/timer.cpp 
   3 // Purpose:     wxTimer implementation 
   4 // Author:      David Webster 
   8 // Copyright:   (c) David Webster 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // For compilers that support precompilation, includes "wx.h". 
  13 #include "wx/wxprec.h" 
  19     #include "wx/window.h" 
  26 #include "wx/os2/private.h" 
  29 #include <sys/types.h> 
  31 #include <sys/timeb.h> 
  33 // ---------------------------------------------------------------------------- 
  35 // ---------------------------------------------------------------------------- 
  37 // define a hash containing all the timers: it is indexed by timer id and 
  38 // contains the corresponding timer 
  39 WX_DECLARE_HASH_MAP(unsigned long, wxTimer 
*, wxIntegerHash
, wxIntegerEqual
, 
  42 // instead of using a global here, wrap it in a static function as otherwise it 
  43 // could have been used before being initialized if a timer object were created 
  45 static wxTimerMap
& TimerMap() 
  47     static wxTimerMap s_timerMap
; 
  52 // ---------------------------------------------------------------------------- 
  54 // ---------------------------------------------------------------------------- 
  56 // timer callback used for all timers 
  57 ULONG 
wxTimerProc(HWND hwnd
, ULONG
, int nIdTimer
, ULONG
); 
  59 // ---------------------------------------------------------------------------- 
  61 // ---------------------------------------------------------------------------- 
  63 IMPLEMENT_ABSTRACT_CLASS(wxTimer
, wxEvtHandler
) 
  65 // ============================================================================ 
  67 // ============================================================================ 
  69 // ---------------------------------------------------------------------------- 
  71 // ---------------------------------------------------------------------------- 
  83 void wxTimer::Notify() 
  86     // The base class version generates an event if it has owner - which it 
  87     // should because otherwise nobody can process timer events, but it does 
  88     // not use the OS's ID, which OS/2 must have to figure out which timer fired 
  90     wxCHECK_RET( m_owner
, _T("wxTimer::Notify() should be overridden.") ); 
  92     wxTimerEvent                    
vEvent( m_idTimer
 
  96     (void)m_owner
->ProcessEvent(vEvent
); 
  97 } // end of wxTimer::Notify 
  99 bool wxTimer::Start( int nMilliseconds
, bool bOneShot 
) 
 101     (void)wxTimerBase::Start( nMilliseconds
, bOneShot 
); 
 103     wxCHECK_MSG( m_milli 
> 0L, false, wxT("invalid value for timer") ); 
 105     wxWindow
* pWin 
= NULL
; 
 109         pWin 
= (wxWindow
*)m_owner
; 
 110         m_ulId 
= ::WinStartTimer( m_Hab
 
 113                                  ,(ULONG
)nMilliseconds
 
 117         m_ulId 
= ::WinStartTimer( m_Hab
 
 120                                  ,(ULONG
)nMilliseconds
 
 124         // check that SetTimer() didn't reuse an existing id: according to 
 125         // the MSDN this can happen and this would be catastrophic to us as 
 126         // we rely on ids uniquely identifying the timers because we use 
 127         // them as keys in the hash 
 128         if ( TimerMap().find(m_ulId
) != TimerMap().end() ) 
 130             wxLogError(_("Timer creation failed.")); 
 132             ::WinStopTimer(m_Hab
, pWin
?(pWin
->GetHWND()):NULL
, m_ulId
); 
 138         TimerMap()[m_ulId
] = this; 
 144         wxLogSysError(_("Couldn't create a timer")); 
 156             wxWindow
*                   pWin 
= (wxWindow
*)m_owner
; 
 158             ::WinStopTimer(m_Hab
, pWin
->GetHWND(), m_ulId
); 
 161             ::WinStopTimer(m_Hab
, NULLHANDLE
, m_ulId
); 
 163         TimerMap().erase(m_ulId
); 
 168 // ---------------------------------------------------------------------------- 
 170 // ---------------------------------------------------------------------------- 
 177     // Avoid to process spurious timer events 
 179     if (rTimer
.m_ulId 
== 0L) 
 182     if (rTimer
.IsOneShot()) 
 195     wxTimerMap::iterator node 
= TimerMap().find((ULONG
)nIdTimer
); 
 197     wxCHECK_MSG(node 
!= TimerMap().end(), 0, 
 198                 wxT("bogus timer id in wxTimerProc") ); 
 199     wxProcessTimer(*(node
->second
));