* beginning of tooltips (only in the console at the moment ;)
[vlc.git] / modules / gui / skins / x11 / x11_timer.cpp
1 /*****************************************************************************
2  * x11_timer.cpp: helper class to implement timers
3  *****************************************************************************
4  * Copyright (C) 2003 VideoLAN
5  * $Id: x11_timer.cpp,v 1.2 2003/06/07 12:19:23 asmax Exp $
6  *
7  * Authors: Cyril Deguet     <asmax@videolan.org>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111,
22  * USA.
23  *****************************************************************************/
24
25 #ifdef X11_SKINS
26
27 //--- VLC -------------------------------------------------------------------
28 #include <vlc/intf.h>
29 #include <mtime.h>
30
31 //--- SKIN ------------------------------------------------------------------
32 #include "x11_timer.h"
33
34
35 //---------------------------------------------------------------------------
36
37 X11Timer::X11Timer( intf_thread_t *p_intf, mtime_t interval, callback_t func,
38                     void *data )
39 {
40     _p_intf = p_intf;
41     _interval = interval;
42     _callback = func;
43     _data = data;
44 }
45
46
47 X11Timer::~X11Timer()
48 {
49 }
50
51
52 mtime_t X11Timer::getNextDate( mtime_t current )
53 {
54     return (current / _interval + 1) * _interval;
55 }
56
57
58 bool X11Timer::Execute()
59 {
60     return (*_callback)( _data );
61 }
62
63 //---------------------------------------------------------------------------
64 //---------------------------------------------------------------------------
65
66 X11TimerManager *X11TimerManager::_instance = NULL;
67
68
69 X11TimerManager::X11TimerManager( intf_thread_t *p_intf )
70 {
71     _p_intf = p_intf;
72     
73     // Create the timer thread
74     _p_timer = (timer_thread_t*)vlc_object_create( _p_intf,
75                                                    sizeof( timer_thread_t ) );
76     _p_timer->die = 0;
77 }
78
79
80 X11TimerManager::~X11TimerManager()
81 {
82     _p_timer->die = 1;
83     vlc_thread_join( _p_timer );
84 }
85
86
87 // Return the instance of X11TimerManager (design pattern singleton)
88 X11TimerManager *X11TimerManager::Instance( intf_thread_t *p_intf )
89 {
90     if( _instance == NULL )
91     {
92         _instance = new X11TimerManager( p_intf );
93         // Run the timer thread
94         vlc_thread_create( _instance->_p_timer, "Skins timer thread", 
95                            &Thread, 0, VLC_TRUE );
96     }
97     return _instance;
98 }
99
100
101 // Destroy the instance, if any
102 void X11TimerManager::Destroy()
103 {
104     if( _instance != NULL )
105     {
106         delete _instance;
107     }
108 }
109
110  
111 // Main timer loop
112 void *X11TimerManager::Thread( void *p_timer )
113 {
114     vlc_thread_ready( (vlc_object_t*) p_timer );
115
116     while( !((timer_thread_t*)p_timer)->die )
117     {
118         list<X11Timer*>::iterator timer;
119         // FIXME temporary
120         for( timer = _instance->_timers.begin(); 
121              timer != _instance->_timers.end(); timer++ )
122         {
123             bool ret = (*timer)->Execute();
124             if( !ret ) 
125             {   _instance->_timers.remove( *timer );
126                 break;
127             }
128         }
129         msleep( 100000 );
130     }
131 }
132
133 #endif