X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d90895ac118ad4546eed7ee4c358a3fe644a1ad7..578dc95029e761a59911b7c1bc09f59384d64ddf:/src/os2/timer.cpp?ds=sidebyside diff --git a/src/os2/timer.cpp b/src/os2/timer.cpp index bca6302c87..f102ace512 100644 --- a/src/os2/timer.cpp +++ b/src/os2/timer.cpp @@ -9,6 +9,10 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// +#ifdef __GNUG__ + #pragma implementation "timer.h" +#endif + // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -31,104 +35,141 @@ #include #include - // ---------------------------------------------------------------------------- // private functions // ---------------------------------------------------------------------------- wxList wxTimerList(wxKEY_INTEGER); -UINT wxTimerProc(HWND hwnd, WORD, int idTimer, DWORD); +ULONG wxTimerProc(HWND hwnd, ULONG, int nIdTimer, ULONG); // ---------------------------------------------------------------------------- // macros // ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY IMPLEMENT_ABSTRACT_CLASS(wxTimer, wxObject) -#endif -wxTimer::wxTimer() +void wxTimer::Init() { - milli = 0 ; - id = 0; - oneShot = FALSE; + m_ulId = 0; } wxTimer::~wxTimer() { - Stop(); + wxTimer::Stop(); wxTimerList.DeleteObject(this); } -bool wxTimer::Start(int milliseconds,bool mode) +void wxTimer::Notify() { - oneShot = mode; - if (milliseconds < 0) - milliseconds = lastMilli; - - wxCHECK_MSG( milliseconds > 0, FALSE, wxT("invalid value for timer timeour") ); + // + // The base class version generates an event if it has owner - which it + // should because otherwise nobody can process timer events, but it does + // not use the OS's ID, which OS/2 must have to figure out which timer fired + // + wxCHECK_RET( m_owner, _T("wxTimer::Notify() should be overridden.") ); + + wxTimerEvent vEvent( m_idTimer + ,m_milli + ); + + (void)m_owner->ProcessEvent(vEvent); +} // end of wxTimer::Notify + +bool wxTimer::Start( + int nMilliseconds +, bool bOneShot +) +{ + (void)wxTimerBase::Start( nMilliseconds + ,bOneShot + ); - lastMilli = milli = milliseconds; + wxCHECK_MSG( m_milli > 0L, FALSE, wxT("invalid value for timer") ); wxTimerList.DeleteObject(this); -// TODO: -/* - TIMERPROC wxTimerProcInst = (TIMERPROC) - MakeProcInstance((FARPROC)wxTimerProc, wxGetInstance()); - - id = SetTimer(NULL, (UINT)(id ? id : 1), - (UINT)milliseconds, wxTimerProcInst); -*/ - if (id > 0) - { - wxTimerList.Append(id, this); - return TRUE; + wxWindow* pWin = NULL; + + if (m_owner) + { + pWin = (wxWindow*)m_owner; + m_ulId = ::WinStartTimer( m_Hab + ,pWin->GetHWND() + ,m_idTimer + ,(ULONG)nMilliseconds + ); + } + else + m_ulId = ::WinStartTimer( m_Hab + ,NULLHANDLE + ,0 + ,(ULONG)nMilliseconds + ); + if (m_ulId > 0L) + { + wxTimerList.Append( m_ulId + ,this + ); + return(TRUE); } else { wxLogSysError(_("Couldn't create a timer")); - return FALSE; + return(FALSE); } } void wxTimer::Stop() { - if ( id ) + if ( m_ulId ) { -// KillTimer(NULL, (UINT)id); + if (m_owner) + { + wxWindow* pWin = (wxWindow*)m_owner; + + ::WinStopTimer(m_Hab, pWin->GetHWND(), m_ulId); + } + else + ::WinStopTimer(m_Hab, NULLHANDLE, m_ulId); wxTimerList.DeleteObject(this); } - id = 0; - milli = 0; + m_ulId = 0L; } // ---------------------------------------------------------------------------- // private functions // ---------------------------------------------------------------------------- -void wxProcessTimer(wxTimer& timer) +void wxProcessTimer( + wxTimer& rTimer +) { + // // Avoid to process spurious timer events - if ( timer.id == 0) + // + if (rTimer.m_ulId == 0L) return; - if ( timer.oneShot ) - timer.Stop(); + if (rTimer.IsOneShot()) + rTimer.Stop(); - timer.Notify(); + rTimer.Notify(); } -UINT wxTimerProc(HWND WXUNUSED(hwnd), WORD, int idTimer, DWORD) +ULONG wxTimerProc( + HWND WXUNUSED(hwnd) +, ULONG +, int nIdTimer +, ULONG +) { - wxNode *node = wxTimerList.Find((long)idTimer); - - wxCHECK_MSG( node, 0, wxT("bogus timer id in wxTimerProc") ); - - wxProcessTimer(*(wxTimer *)node->Data()); + wxNode* pNode = wxTimerList.Find((ULONG)nIdTimer); + wxCHECK_MSG(pNode, 0, wxT("bogus timer id in wxTimerProc") ); + if (pNode) + wxProcessTimer(*(wxTimer *)pNode->Data()); return 0; }