LCOV - code coverage report
Current view: top level - seq/detail - masterConfig.cpp (source / functions) Hit Total Coverage
Test: Equalizer Lines: 69 112 61.6 %
Date: 2017-12-16 05:07:20 Functions: 15 26 57.7 %

          Line data    Source code
       1             : 
       2             : /* Copyright (c) 2011-2017, Stefan Eilemann <eile@eyescale.ch>
       3             :  *                          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 <eq/eventICommand.h>
      25             : #include <eq/fabric/configVisitor.h>
      26             : #include <eq/fabric/pointerEvent.h>
      27             : #include <eq/fabric/sizeEvent.h>
      28             : #include <eq/fabric/statistic.h>
      29             : #include <seq/application.h>
      30             : 
      31             : namespace seq
      32             : {
      33             : namespace detail
      34             : {
      35           1 : MasterConfig::MasterConfig(eq::ServerPtr parent)
      36             :     : Config(parent)
      37           1 :     , _redraw(false)
      38             : {
      39           1 : }
      40             : 
      41           2 : MasterConfig::~MasterConfig()
      42             : {
      43           2 : }
      44             : 
      45           1 : bool MasterConfig::init()
      46             : {
      47           1 :     LBASSERT(!_objects);
      48           1 :     _objects = new ObjectMap(*this, *getApplication());
      49             : 
      50           1 :     co::Object* initData = getInitData();
      51           1 :     if (initData)
      52           0 :         LBCHECK(_objects->register_(initData, OBJECTTYPE_INITDATA));
      53           1 :     _objects->setInitData(initData);
      54             : 
      55           1 :     LBCHECK(registerObject(_objects));
      56             : 
      57           1 :     if (!eq::Config::init(_objects->getID()))
      58             :     {
      59           0 :         LBWARN << "Error during initialization" << std::endl;
      60           0 :         exit();
      61           0 :         return false;
      62             :     }
      63             : 
      64           1 :     _redraw = true;
      65           1 :     return true;
      66             : }
      67             : 
      68           1 : bool MasterConfig::exit()
      69             : {
      70           1 :     const bool retVal = eq::Config::exit();
      71             : 
      72           1 :     if (_objects)
      73           1 :         deregisterObject(_objects);
      74           1 :     _objects->clear();
      75           1 :     delete _objects;
      76           1 :     _objects = 0;
      77             : 
      78           1 :     return retVal;
      79             : }
      80             : 
      81           1 : bool MasterConfig::run(co::Object* frameData)
      82             : {
      83           1 :     LBASSERT(_objects);
      84           1 :     if (frameData)
      85           0 :         LBCHECK(_objects->register_(frameData, OBJECTTYPE_FRAMEDATA));
      86           1 :     _objects->setFrameData(frameData);
      87             : 
      88           1 :     seq::Application* const app = getApplication();
      89           3 :     while (isRunning())
      90             :     {
      91           1 :         startFrame();
      92           1 :         finishFrame();
      93             : 
      94           5 :         while (!needRedraw()) // wait for an event requiring redraw
      95             :         {
      96           2 :             if (app->hasCommands()) // execute non-critical pending commands
      97             :             {
      98           1 :                 app->processCommand();
      99           1 :                 handleEvents(); // non-blocking
     100             :             }
     101             :             else // no pending commands, block on user event
     102             :             {
     103           2 :                 const eq::EventICommand& event = getNextEvent();
     104           1 :                 if (!Config::handleEvent(event))
     105           1 :                     LBVERB << "Unhandled " << event << std::endl;
     106             :             }
     107             :         }
     108           1 :         handleEvents(); // process all pending events
     109             :     }
     110           1 :     finishAllFrames();
     111           1 :     return true;
     112             : }
     113             : 
     114           1 : uint32_t MasterConfig::startFrame()
     115             : {
     116           1 :     _redraw = false;
     117           1 :     return eq::Config::startFrame(_objects->commit());
     118             : }
     119             : 
     120             : namespace
     121             : {
     122             : class ViewUpdateVisitor : public eq::ConfigVisitor
     123             : {
     124             : public:
     125           1 :     explicit ViewUpdateVisitor(bool& redraw)
     126           1 :         : _redraw(redraw)
     127             :     {
     128           1 :     }
     129           1 :     virtual ~ViewUpdateVisitor() {}
     130           7 :     virtual eq::VisitorResult visit(eq::View* v)
     131             :     {
     132           7 :         View* view = static_cast<View*>(v);
     133           7 :         if (view->updateData())
     134             :         {
     135           1 :             LBVERB << "Redraw: new view data" << std::endl;
     136           1 :             _redraw = true;
     137             :         }
     138           7 :         return eq::TRAVERSE_CONTINUE;
     139             :     }
     140             : 
     141             : private:
     142             :     bool& _redraw;
     143             : };
     144             : }
     145             : 
     146             : template <class E>
     147           0 : bool MasterConfig::_handleEvent(eq::EventType type, E& event)
     148             : {
     149           0 :     if (Config::handleEvent(type, event))
     150           0 :         _redraw = true;
     151             : 
     152           0 :     if (_currentViewID == 0)
     153           0 :         return _redraw;
     154             : 
     155           0 :     View* view = static_cast<View*>(find<eq::View>(_currentViewID));
     156           0 :     if (view && view->handleEvent(type, event))
     157           0 :         _redraw = true;
     158             : 
     159           0 :     return _redraw;
     160             : }
     161             : 
     162             : template <class E>
     163           0 : bool MasterConfig::_handleEvent(E& event)
     164             : {
     165           0 :     if (Config::handleEvent(event))
     166           0 :         _redraw = true;
     167             : 
     168           0 :     if (_currentViewID == 0)
     169           0 :         return _redraw;
     170             : 
     171           0 :     View* view = static_cast<View*>(find<eq::View>(_currentViewID));
     172           0 :     if (view && view->handleEvent(event))
     173           0 :         _redraw = true;
     174             : 
     175           0 :     return _redraw;
     176             : }
     177             : 
     178          15 : bool MasterConfig::handleEvent(EventICommand command)
     179             : {
     180          15 :     switch (command.getEventType())
     181             :     {
     182             :     case EVENT_REDRAW:
     183           0 :         _redraw = true;
     184           0 :         LBVERB << "Redraw request" << std::endl;
     185           0 :         return true;
     186             : 
     187             :     default:
     188          15 :         return Config::handleEvent(command);
     189             :     }
     190             : }
     191             : 
     192           0 : bool MasterConfig::handleEvent(const eq::EventType type, const SizeEvent& event)
     193             : {
     194           0 :     _redraw = true;
     195           0 :     return _handleEvent(type, event);
     196             : }
     197             : 
     198           0 : bool MasterConfig::handleEvent(const eq::EventType type,
     199             :                                const PointerEvent& event)
     200             : {
     201           0 :     switch (type)
     202             :     {
     203             :     case EVENT_CHANNEL_POINTER_BUTTON_PRESS:
     204           0 :         _currentViewID = event.context.view.identifier;
     205           0 :         break;
     206             : 
     207             :     default:
     208           0 :         break;
     209             :     }
     210             : 
     211           0 :     return _handleEvent(type, event);
     212             : }
     213             : 
     214           0 : bool MasterConfig::handleEvent(const eq::EventType type, const KeyEvent& event)
     215             : {
     216           0 :     return _handleEvent(type, event);
     217             : }
     218             : 
     219           0 : bool MasterConfig::handleEvent(const AxisEvent& event)
     220             : {
     221           0 :     return _handleEvent(event);
     222             : }
     223             : 
     224           0 : bool MasterConfig::handleEvent(const ButtonEvent& event)
     225             : {
     226           0 :     return _handleEvent(event);
     227             : }
     228             : 
     229           1 : bool MasterConfig::handleEvent(const eq::EventType type, const Event& event)
     230             : {
     231           1 :     if (Config::handleEvent(type, event))
     232           0 :         _redraw = true;
     233             : 
     234           1 :     switch (type)
     235             :     {
     236             :     case EVENT_WINDOW_EXPOSE:
     237             :     case EVENT_WINDOW_CLOSE:
     238           1 :         _redraw = true;
     239           1 :         return true;
     240             : 
     241             :     default:
     242           0 :         return _redraw;
     243             :     }
     244             : }
     245             : 
     246          15 : void MasterConfig::addStatistic(const Statistic& stat)
     247             : {
     248          15 :     Config::addStatistic(stat);
     249          15 :     if (stat.type == eq::Statistic::CONFIG_FINISH_FRAME)
     250             :     {
     251           2 :         ViewUpdateVisitor viewUpdate(_redraw);
     252           1 :         accept(viewUpdate);
     253             :     }
     254          15 : }
     255             : }
     256          30 : }

Generated by: LCOV version 1.11