00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifdef X11_SKINS
00026
00027 #include <unistd.h>
00028 #include <fcntl.h>
00029
00030 #include "x11_timer.hpp"
00031 #include "x11_factory.hpp"
00032 #include "../commands/cmd_generic.hpp"
00033
00034
00035 X11Timer::X11Timer( intf_thread_t *pIntf, CmdGeneric &rCmd ):
00036 OSTimer( pIntf ), m_rCommand( rCmd )
00037 {
00038
00039 X11Factory *m_pOsFactory = (X11Factory*)(OSFactory::instance( pIntf ) );
00040 m_pTimerLoop = m_pOsFactory->getTimerLoop();
00041 }
00042
00043
00044 X11Timer::~X11Timer()
00045 {
00046 stop();
00047 }
00048
00049
00050 void X11Timer::start( int delay, bool oneShot )
00051 {
00052 m_interval = 1000 * delay;
00053 m_oneShot = oneShot;
00054 m_nextDate = mdate() + m_interval;
00055 m_pTimerLoop->addTimer( *this );
00056 }
00057
00058
00059 void X11Timer::stop()
00060 {
00061 m_pTimerLoop->removeTimer( *this );
00062 }
00063
00064
00065 mtime_t X11Timer::getNextDate() const
00066 {
00067 return m_nextDate;
00068 }
00069
00070
00071 bool X11Timer::execute()
00072 {
00073 m_nextDate += m_interval;
00074
00075 m_rCommand.execute();
00076
00077 return !m_oneShot;
00078 }
00079
00080
00081 X11TimerLoop::X11TimerLoop( intf_thread_t *pIntf, int connectionNumber ):
00082 SkinObject( pIntf ), m_connectionNumber( connectionNumber )
00083 {
00084 }
00085
00086
00087 X11TimerLoop::~X11TimerLoop()
00088 {
00089 }
00090
00091
00092 void X11TimerLoop::addTimer( X11Timer &rTimer )
00093 {
00094 m_timers.push_back( &rTimer );
00095 }
00096
00097
00098 void X11TimerLoop::removeTimer( X11Timer &rTimer )
00099 {
00100 m_timers.remove( &rTimer );
00101 }
00102
00103
00104 void X11TimerLoop::waitNextTimer()
00105 {
00106 mtime_t curDate = mdate();
00107 mtime_t nextDate = LAST_MDATE;
00108
00109 X11Timer *nextTimer = NULL;
00110
00111
00112 list<X11Timer*>::const_iterator timer;
00113 for( timer = m_timers.begin(); timer != m_timers.end(); timer++ )
00114 {
00115 mtime_t timerDate = (*timer)->getNextDate();
00116 if( timerDate < nextDate )
00117 {
00118 nextTimer = *timer;
00119 nextDate = timerDate;
00120 }
00121 }
00122
00123 if( nextTimer == NULL )
00124 {
00125 this->sleep( 1000 );
00126 }
00127 else
00128 {
00129 if( nextDate > curDate )
00130 {
00131 if( this->sleep( (nextDate - curDate ) / 1000 ) )
00132 {
00133
00134 return;
00135 }
00136 }
00137
00138 if( ! nextTimer->execute() )
00139 {
00140
00141 m_timers.remove( nextTimer );
00142 }
00143 }
00144 }
00145
00146
00147 bool X11TimerLoop::sleep( int delay )
00148 {
00149
00150 struct timeval tv;
00151 tv.tv_sec = delay / 1000;
00152 tv.tv_usec = 1000 * (delay % 1000);
00153
00154
00155 fd_set rfds;
00156 FD_ZERO( &rfds );
00157 FD_SET( m_connectionNumber, &rfds );
00158
00159
00160 int num = select( m_connectionNumber + 1, &rfds, NULL, NULL, &tv );
00161
00162 return ( num > 0 );
00163 }
00164
00165
00166 #endif