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:
@@ -12,7 +12,7 @@
|
||||
// For compilers that support precompilation, includes "wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#include "wx/timer.h"
|
||||
#include "wx/motif/private/timer.h"
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/app.h"
|
||||
@@ -29,66 +29,66 @@
|
||||
|
||||
#include "wx/motif/private.h"
|
||||
|
||||
IMPLEMENT_ABSTRACT_CLASS(wxTimer, wxEvtHandler)
|
||||
WX_DECLARE_VOIDPTR_HASH_MAP(wxMotifTimerImpl*, wxTimerHashMap);
|
||||
|
||||
WX_DECLARE_VOIDPTR_HASH_MAP(wxTimer*, wxTimerHashMap);
|
||||
static wxTimerHashMap gs_timers;
|
||||
|
||||
static wxTimerHashMap s_timers;
|
||||
|
||||
void wxTimerCallback (wxTimer * timer)
|
||||
void wxTimerCallback (wxMotifTimerImpl *timer)
|
||||
{
|
||||
// Check to see if it's still on
|
||||
if (s_timers.find(timer) == s_timers.end())
|
||||
return;
|
||||
// Check to see if it's still on
|
||||
if ( gs_timers.find(timer) == gs_timers.end() )
|
||||
return;
|
||||
|
||||
if (timer->m_id == 0)
|
||||
return; // Avoid to process spurious timer events
|
||||
if ( !timer->IsRunning() )
|
||||
return; // Avoid to process spurious timer events
|
||||
|
||||
if (!timer->m_oneShot)
|
||||
timer->m_id = XtAppAddTimeOut((XtAppContext) wxTheApp->GetAppContext(),
|
||||
timer->m_milli,
|
||||
(XtTimerCallbackProc) wxTimerCallback,
|
||||
(XtPointer) timer);
|
||||
else
|
||||
timer->m_id = 0;
|
||||
|
||||
timer->Notify();
|
||||
timer->Notify();
|
||||
}
|
||||
|
||||
void wxTimer::Init()
|
||||
wxMotifTimerImpl::~wxMotifTimerImpl()
|
||||
{
|
||||
m_id = 0;
|
||||
m_milli = 1000;
|
||||
gs_timers.erase(this);
|
||||
}
|
||||
|
||||
wxTimer::~wxTimer()
|
||||
void wxMotifTimerImpl::DoStart()
|
||||
{
|
||||
Stop();
|
||||
s_timers.erase(this);
|
||||
}
|
||||
|
||||
bool wxTimer::Start(int milliseconds, bool mode)
|
||||
{
|
||||
Stop();
|
||||
|
||||
(void)wxTimerBase::Start(milliseconds, mode);
|
||||
|
||||
if (s_timers.find(this) == s_timers.end())
|
||||
s_timers[this] = this;
|
||||
|
||||
m_id = XtAppAddTimeOut((XtAppContext) wxTheApp->GetAppContext(),
|
||||
m_milli,
|
||||
(XtTimerCallbackProc) wxTimerCallback,
|
||||
(XtPointer) this);
|
||||
}
|
||||
|
||||
bool wxMotifTimerImpl::Start(int milliseconds, bool mode)
|
||||
{
|
||||
if ( !wxTimerImpl::Start(milliseconds, mode) )
|
||||
return false;
|
||||
|
||||
if ( gs_timers.find(this) == gs_timers.end() )
|
||||
gs_timers[this] = this;
|
||||
|
||||
DoStart();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void wxTimer::Stop()
|
||||
void wxMotifTimerImpl::Stop()
|
||||
{
|
||||
if (m_id > 0)
|
||||
XtRemoveTimeOut (m_id);
|
||||
m_id = 0;
|
||||
}
|
||||
|
||||
void wxMotifTimerImpl::Notify()
|
||||
{
|
||||
if ( IsOneShot() )
|
||||
{
|
||||
XtRemoveTimeOut (m_id);
|
||||
// nothing to do, timeout is removed automatically by X
|
||||
m_id = 0;
|
||||
}
|
||||
m_milli = 0 ;
|
||||
else // rearm the timer
|
||||
{
|
||||
DoStart();
|
||||
}
|
||||
|
||||
wxTimerImpl::Notify();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user