LCOV - code coverage report
Current view: top level - seq/detail - masterConfig.cpp (source / functions) Hit Total Coverage
Test: lcov2.info Lines: 70 116 60.3 %
Date: 2014-06-18 Functions: 14 15 93.3 %

          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 : }

Generated by: LCOV version 1.10