Line data Source code
1 :
2 : /* Copyright (c) 2011-2013, Stefan Eilemann <eile@eyescale.ch>
3 : * 2012, Daniel Nachbaur <danielnachbaur@gmail.com>
4 : *
5 : * This library is free software; you can redistribute it and/or modify it under
6 : * the terms of the GNU Lesser General Public License version 2.1 as published
7 : * by the Free Software Foundation.
8 : *
9 : * This library is distributed in the hope that it will be useful, but WITHOUT
10 : * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 : * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12 : * details.
13 : *
14 : * You should have received a copy of the GNU Lesser General Public License
15 : * along with this library; if not, write to the Free Software Foundation, Inc.,
16 : * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 : */
18 :
19 : #include "masterConfig.h"
20 :
21 : #include "objectMap.h"
22 : #include "view.h"
23 :
24 : #include <seq/application.h>
25 : #ifndef EQ_2_0_API
26 : # include <eq/client/configEvent.h>
27 : #endif
28 : #include <eq/fabric/configVisitor.h>
29 : #include <eq/client/event.h>
30 : #include <eq/client/eventICommand.h>
31 :
32 : namespace seq
33 : {
34 : namespace detail
35 : {
36 1 : MasterConfig::MasterConfig( eq::ServerPtr parent )
37 : : Config( parent )
38 1 : , _redraw( false )
39 1 : {}
40 :
41 2 : MasterConfig::~MasterConfig()
42 2 : {}
43 :
44 1 : bool MasterConfig::init()
45 : {
46 1 : LBASSERT( !_objects );
47 1 : _objects = new ObjectMap( *this, *getApplication( ));
48 :
49 1 : co::Object* initData = getInitData();
50 1 : if( initData )
51 0 : LBCHECK( _objects->register_( initData, OBJECTTYPE_INITDATA ));
52 1 : _objects->setInitData( initData );
53 :
54 1 : LBCHECK( registerObject( _objects ));
55 :
56 1 : if( !eq::Config::init( _objects->getID( )))
57 : {
58 0 : LBWARN << "Error during initialization" << std::endl;
59 0 : exit();
60 0 : return false;
61 : }
62 :
63 1 : _redraw = true;
64 1 : return true;
65 : }
66 :
67 1 : bool MasterConfig::exit()
68 : {
69 1 : const bool retVal = eq::Config::exit();
70 :
71 1 : if( _objects )
72 1 : deregisterObject( _objects );
73 1 : _objects->clear();
74 1 : delete _objects;
75 1 : _objects = 0;
76 :
77 1 : return retVal;
78 : }
79 :
80 1 : bool MasterConfig::run( co::Object* frameData )
81 : {
82 1 : LBASSERT( _objects );
83 1 : if( frameData )
84 0 : LBCHECK( _objects->register_( frameData, OBJECTTYPE_FRAMEDATA ));
85 1 : _objects->setFrameData( frameData );
86 :
87 1 : seq::Application* const app = getApplication();
88 3 : while( isRunning( ))
89 : {
90 1 : startFrame();
91 1 : finishFrame();
92 :
93 3 : while( !needRedraw( )) // wait for an event requiring redraw
94 : {
95 1 : if( app->hasCommands( )) // execute non-critical pending commands
96 : {
97 1 : app->processCommand();
98 1 : handleEvents(); // non-blocking
99 : }
100 : else // no pending commands, block on user event
101 : {
102 0 : const eq::EventICommand& event = getNextEvent();
103 0 : if( !handleEvent( event ))
104 0 : LBVERB << "Unhandled " << event << std::endl;
105 : }
106 : }
107 1 : handleEvents(); // process all pending events
108 : }
109 1 : finishAllFrames();
110 1 : return true;
111 : }
112 :
113 1 : uint32_t MasterConfig::startFrame()
114 : {
115 1 : _redraw = false;
116 1 : return eq::Config::startFrame( _objects->commit( ));
117 : }
118 :
119 : namespace
120 : {
121 : class ViewUpdateVisitor : public eq::ConfigVisitor
122 : {
123 : public:
124 1 : ViewUpdateVisitor( bool &redraw ) : _redraw( redraw ) {}
125 1 : virtual~ ViewUpdateVisitor() {}
126 :
127 7 : virtual eq::VisitorResult visit( eq::View* v )
128 : {
129 7 : View* view = static_cast< View* >( v );
130 7 : if( view->updateData( ))
131 : {
132 1 : LBVERB << "Redraw: new view data" << std::endl;
133 1 : _redraw = true;
134 : }
135 7 : return eq::TRAVERSE_CONTINUE;
136 : }
137 :
138 : private:
139 : bool& _redraw;
140 : };
141 : }
142 : #ifndef EQ_2_0_API
143 17 : bool MasterConfig::handleEvent( const eq::ConfigEvent* event )
144 : {
145 17 : switch( event->data.type )
146 : {
147 : case eq::Event::CHANNEL_POINTER_BUTTON_PRESS:
148 0 : _currentViewID = event->data.context.view.identifier;
149 0 : return true;
150 :
151 : case eq::Event::KEY_PRESS:
152 : case eq::Event::KEY_RELEASE:
153 0 : if( Config::handleEvent( event ))
154 : {
155 0 : _redraw = true;
156 0 : LBVERB << "Redraw: requested by eq::Config" << std::endl;
157 : }
158 : // no break;
159 : case eq::Event::CHANNEL_POINTER_BUTTON_RELEASE:
160 : case eq::Event::CHANNEL_POINTER_MOTION:
161 : case eq::Event::CHANNEL_POINTER_WHEEL:
162 : case eq::Event::MAGELLAN_AXIS:
163 : {
164 0 : if( _currentViewID == 0 )
165 0 : return false;
166 :
167 0 : View* view = static_cast<View*>( find<eq::View>( _currentViewID ));
168 0 : if( view->handleEvent( event ))
169 : {
170 0 : _redraw = true;
171 0 : LBVERB << "Redraw: requested by view event handler" << std::endl;
172 : }
173 0 : return true;
174 : }
175 :
176 : case eq::Event::STATISTIC:
177 : {
178 14 : Config::handleEvent( event );
179 14 : if( event->data.statistic.type != eq::Statistic::CONFIG_FINISH_FRAME )
180 13 : return false;
181 :
182 1 : ViewUpdateVisitor viewUpdate( _redraw );
183 1 : accept( viewUpdate );
184 1 : return _redraw;
185 : }
186 :
187 : case eq::Event::WINDOW_EXPOSE:
188 : case eq::Event::WINDOW_RESIZE:
189 : case eq::Event::WINDOW_CLOSE:
190 : case eq::Event::VIEW_RESIZE:
191 3 : _redraw = true;
192 3 : LBVERB << "Redraw: window change" << std::endl;
193 3 : break;
194 :
195 : default:
196 0 : break;
197 : }
198 :
199 3 : if( eq::Config::handleEvent( event ))
200 : {
201 0 : _redraw = true;
202 0 : LBVERB << "Redraw: requested by config event handler" << std::endl;
203 : }
204 3 : return _redraw;
205 : }
206 : #endif
207 :
208 17 : bool MasterConfig::handleEvent( eq::EventICommand command )
209 : {
210 17 : switch( command.getEventType( ))
211 : {
212 : case eq::Event::CHANNEL_POINTER_BUTTON_PRESS:
213 : {
214 0 : const eq::Event& event = command.read< eq::Event >();
215 0 : _currentViewID = event.context.view.identifier;
216 0 : return true;
217 : }
218 :
219 : case eq::Event::KEY_PRESS:
220 : case eq::Event::KEY_RELEASE:
221 0 : if( Config::handleEvent( command ))
222 : {
223 0 : _redraw = true;
224 0 : LBVERB << "Redraw: requested by eq::Config" << std::endl;
225 : }
226 : // no break;
227 : case eq::Event::CHANNEL_POINTER_BUTTON_RELEASE:
228 : case eq::Event::CHANNEL_POINTER_MOTION:
229 : case eq::Event::CHANNEL_POINTER_WHEEL:
230 : case eq::Event::MAGELLAN_AXIS:
231 : {
232 0 : if( _currentViewID == 0 )
233 0 : return false;
234 :
235 0 : View* view = static_cast<View*>( find<eq::View>( _currentViewID ));
236 0 : if( view->handleEvent( command ))
237 : {
238 0 : _redraw = true;
239 0 : LBVERB << "Redraw: requested by view event handler" << std::endl;
240 : }
241 0 : return true;
242 : }
243 :
244 : case eq::Event::STATISTIC:
245 : {
246 0 : Config::handleEvent( command );
247 0 : const eq::Event& event = command.read< eq::Event >();
248 0 : if( event.statistic.type != eq::Statistic::CONFIG_FINISH_FRAME )
249 0 : return false;
250 :
251 0 : ViewUpdateVisitor viewUpdate( _redraw );
252 0 : accept( viewUpdate );
253 0 : return _redraw;
254 : }
255 :
256 : case eq::Event::WINDOW_EXPOSE:
257 : case eq::Event::WINDOW_RESIZE:
258 : case eq::Event::WINDOW_CLOSE:
259 : case eq::Event::VIEW_RESIZE:
260 0 : _redraw = true;
261 0 : LBVERB << "Redraw: window change" << std::endl;
262 0 : break;
263 :
264 : default:
265 17 : break;
266 : }
267 :
268 17 : if( eq::Config::handleEvent( command ))
269 : {
270 4 : _redraw = true;
271 4 : LBVERB << "Redraw: requested by config event handler" << std::endl;
272 : }
273 17 : return _redraw;
274 : }
275 :
276 : }
277 3 : }
|