preparation for allowing to use wxTimer in wxBase (heavily modified patch 1113088):
1. Changed wxTimer to use wxTimerImpl 2. Added Unix-specific generic timer implementation 3. Added wxAppTraits::CreateTimerImpl() git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45544 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -28,9 +28,13 @@
|
||||
#if wxUSE_TIMER
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/timer.h"
|
||||
#include "wx/app.h"
|
||||
#endif
|
||||
|
||||
#include "wx/timer.h"
|
||||
#include "wx/apptrait.h"
|
||||
#include "wx/private/timer.h"
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxWin macros
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -41,47 +45,92 @@ IMPLEMENT_DYNAMIC_CLASS(wxTimerEvent, wxEvent)
|
||||
// wxTimerBase implementation
|
||||
// ============================================================================
|
||||
|
||||
wxTimerBase::~wxTimerBase()
|
||||
wxTimer::~wxTimer()
|
||||
{
|
||||
// this destructor is required for Darwin
|
||||
Stop();
|
||||
|
||||
delete m_impl;
|
||||
}
|
||||
|
||||
void wxTimerBase::Notify()
|
||||
void wxTimer::Init()
|
||||
{
|
||||
wxAppTraits * const traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
|
||||
m_impl = traits ? traits->CreateTimerImpl(this) : NULL;
|
||||
if ( !m_impl )
|
||||
{
|
||||
wxFAIL_MSG( _T("No timer implementation for this platform") );
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// rest of wxTimer implementation forwarded to wxTimerImpl
|
||||
// ============================================================================
|
||||
|
||||
void wxTimer::SetOwner(wxEvtHandler *owner, int timerid)
|
||||
{
|
||||
wxCHECK_RET( m_impl, _T("uninitialized timer") );
|
||||
|
||||
m_impl->SetOwner(owner, timerid);
|
||||
}
|
||||
|
||||
wxEvtHandler *wxTimer::GetOwner() const
|
||||
{
|
||||
wxCHECK_MSG( m_impl, NULL, _T("uninitialized timer") );
|
||||
|
||||
return m_impl->GetOwner();
|
||||
}
|
||||
|
||||
bool wxTimer::Start(int milliseconds, bool oneShot)
|
||||
{
|
||||
wxCHECK_MSG( m_impl, false, _T("uninitialized timer") );
|
||||
|
||||
return m_impl->Start(milliseconds, oneShot);
|
||||
}
|
||||
|
||||
void wxTimer::Stop()
|
||||
{
|
||||
wxCHECK_RET( m_impl, _T("uninitialized timer") );
|
||||
|
||||
if ( m_impl->IsRunning() )
|
||||
m_impl->Stop();
|
||||
}
|
||||
|
||||
void wxTimer::Notify()
|
||||
{
|
||||
// the base class version generates an event if it has owner - which it
|
||||
// should because otherwise nobody can process timer events
|
||||
wxCHECK_RET( m_owner, _T("wxTimer::Notify() should be overridden.") );
|
||||
wxCHECK_RET( GetOwner(), _T("wxTimer::Notify() should be overridden.") );
|
||||
|
||||
wxTimerEvent event(m_idTimer, m_milli);
|
||||
event.SetEventObject(this);
|
||||
(void)m_owner->ProcessEvent(event);
|
||||
m_impl->SendEvent();
|
||||
}
|
||||
|
||||
bool wxTimerBase::Start(int milliseconds, bool oneShot)
|
||||
bool wxTimer::IsRunning() const
|
||||
{
|
||||
// under MSW timers only work when they're started from the main thread so
|
||||
// let the caller know about it
|
||||
#if wxUSE_THREADS
|
||||
wxASSERT_MSG( wxThread::IsMain(),
|
||||
_T("timer can only be started from the main thread") );
|
||||
#endif // wxUSE_THREADS
|
||||
wxCHECK_MSG( m_impl, false, _T("uninitialized timer") );
|
||||
|
||||
if ( IsRunning() )
|
||||
{
|
||||
// not stopping the already running timer might work for some
|
||||
// platforms (no problems under MSW) but leads to mysterious crashes
|
||||
// on the others (GTK), so to be on the safe side do it here
|
||||
Stop();
|
||||
}
|
||||
return m_impl->IsRunning();
|
||||
}
|
||||
|
||||
if ( milliseconds != -1 )
|
||||
{
|
||||
m_milli = milliseconds;
|
||||
}
|
||||
int wxTimer::GetId() const
|
||||
{
|
||||
wxCHECK_MSG( m_impl, wxID_ANY, _T("uninitialized timer") );
|
||||
|
||||
m_oneShot = oneShot;
|
||||
return m_impl->GetId();
|
||||
}
|
||||
|
||||
return true;
|
||||
int wxTimer::GetInterval() const
|
||||
{
|
||||
wxCHECK_MSG( m_impl, -1, _T("uninitialized timer") );
|
||||
|
||||
return m_impl->GetInterval();
|
||||
}
|
||||
|
||||
bool wxTimer::IsOneShot() const
|
||||
{
|
||||
wxCHECK_MSG( m_impl, false, _T("uninitialized timer") );
|
||||
|
||||
return m_impl->IsOneShot();
|
||||
}
|
||||
|
||||
#endif // wxUSE_TIMER
|
||||
|
||||
Reference in New Issue
Block a user