diff --git a/include/osgGLUT/Viewer b/include/osgGLUT/Viewer index 6566b0f25..83c0eaad4 100644 --- a/include/osgGLUT/Viewer +++ b/include/osgGLUT/Viewer @@ -19,6 +19,7 @@ #include +#include #include namespace osgGLUT @@ -82,13 +83,17 @@ class OSGGLUT_EXPORT Viewer : public Window, public osgGA::GUIActionAdapter void selectCameraManipulator(unsigned int pos, unsigned int viewport = 0); - void addEventHandler(osgGA::GUIEventHandler* handler,unsigned int viewport = 0); + void prependEventHandler(osgGA::GUIEventHandler* handler,unsigned int viewport = 0); + void appendEventHandler(osgGA::GUIEventHandler* handler,unsigned int viewport = 0); // derived from osgGA::GUIActionAdapter virtual void requestRedraw() {} // redraw always by idle callback done. virtual void requestContinuousUpdate(bool /*needed*/) {} // continuous update always virtual void requestWarpPointer(int x,int y); + virtual void requestShutdown() { exit(1); }; + /// Toggle fullscreen + virtual void toggleFullScreen(); /** read the command line string list, removing any matched control sequences.*/ void readCommandLine(std::vector& commandLine); @@ -97,7 +102,7 @@ class OSGGLUT_EXPORT Viewer : public Window, public osgGA::GUIActionAdapter const osg::DisplaySettings* getDisplaySettings() const { return _displaySettings.get(); } typedef std::vector > CameraManipList; - typedef std::vector > EventHandlerList; + typedef std::list > EventHandlerList; protected: @@ -111,7 +116,7 @@ class OSGGLUT_EXPORT Viewer : public Window, public osgGA::GUIActionAdapter virtual void keyboard(unsigned char key, int x, int y); void setFocusedViewport(unsigned int pos); - int mapWindowXYToSceneView(int x, int y); + int mapWindowXYToViewport(int x, int y); void showStats(unsigned int i); // gwm 24.09.01 pass the viewport to collect sta for each viewport diff --git a/src/Demos/osgoccluder/osgoccluder.cpp b/src/Demos/osgoccluder/osgoccluder.cpp index eab08ac1c..e279c51d4 100644 --- a/src/Demos/osgoccluder/osgoccluder.cpp +++ b/src/Demos/osgoccluder/osgoccluder.cpp @@ -390,7 +390,7 @@ int main( int argc, char **argv ) if (manuallyCreateImpostors) { - viewer.addEventHandler(new OccluderEventHandler(viewer.getViewportSceneView(0),rootnode)); + viewer.prependEventHandler(new OccluderEventHandler(viewer.getViewportSceneView(0),rootnode)); } // open the viewer window. diff --git a/src/Demos/osgsequence/osgsequence.cpp b/src/Demos/osgsequence/osgsequence.cpp index 13d2161f2..eb563566e 100644 --- a/src/Demos/osgsequence/osgsequence.cpp +++ b/src/Demos/osgsequence/osgsequence.cpp @@ -187,7 +187,7 @@ int main( int argc, char **argv ) viewer.addViewport(rootNode); // register additional event handler - viewer.addEventHandler(osgNew MyEventHandler(&seq), 0); + viewer.prependEventHandler(osgNew MyEventHandler(&seq), 0); // register trackball, flight and drive. viewer.registerCameraManipulator(new osgGA::TrackballManipulator); diff --git a/src/osgGLUT/Viewer.cpp b/src/osgGLUT/Viewer.cpp index 70f9bd7a4..5c166379e 100644 --- a/src/osgGLUT/Viewer.cpp +++ b/src/osgGLUT/Viewer.cpp @@ -173,6 +173,22 @@ void Viewer::readCommandLine(std::vector& commandLine) _displaySettings->readCommandLine(commandLine); } +void +Viewer::toggleFullScreen() +{ + _fullscreen = !_fullscreen; + if (_fullscreen) + { + _saved_ww = _ww; + _saved_wh = _wh; + glutFullScreen(); + } else + { + //glutPositionWindow(wx,wy); + glutReshapeWindow(_saved_ww,_saved_wh); + } +} + /** * Configure and open the GLUT window for this Viewer * @@ -317,7 +333,13 @@ unsigned int Viewer::registerCameraManipulator(osgGA::CameraManipulator* cm, return pos; } -void Viewer::addEventHandler(osgGA::GUIEventHandler* handler,unsigned int viewport) +void Viewer::prependEventHandler(osgGA::GUIEventHandler* handler,unsigned int viewport) +{ + ViewportDef &viewp = _viewportList[viewport]; + viewp._eventHandlerList.push_front( handler ); +} + +void Viewer::appendEventHandler(osgGA::GUIEventHandler* handler,unsigned int viewport) { ViewportDef &viewp = _viewportList[viewport]; viewp._eventHandlerList.push_back( handler ); @@ -376,6 +398,7 @@ float Viewer::app(unsigned int viewport) if ( eh->valid() ) { if ( (*eh)->handle(*ea,*this) ) { handled = true; + break; } } } @@ -421,7 +444,7 @@ float Viewer::draw(unsigned int viewport) } -int Viewer::mapWindowXYToSceneView(int x, int y) +int Viewer::mapWindowXYToViewport(int x, int y) { int ogl_y = _wh-y; @@ -775,6 +798,7 @@ void Viewer::mouseMotion(int x, int y) if ( eh->valid() ) { if ( (*eh)->handle(*ea,*this) ) { handled = true; + break; } } } @@ -799,7 +823,7 @@ void Viewer::mousePassiveMotion(int x, int y) // Switch viewport focus if no buttons are pressed if (ea->getButtonMask() == 0) { - int focus = mapWindowXYToSceneView(x,y); + int focus = mapWindowXYToViewport(x,y); if (focus >= 0 && focus != int(_focusedViewport)) setFocusedViewport(focus); } @@ -812,6 +836,7 @@ void Viewer::mousePassiveMotion(int x, int y) if ( eh->valid() ) { if ( (*eh)->handle(*ea,*this) ) { handled = true; + break; } } } @@ -836,7 +861,7 @@ void Viewer::mouse(int button, int state, int x, int y) mask == osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON || mask == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON)) { - int focus = mapWindowXYToSceneView(x,y); + int focus = mapWindowXYToViewport(x,y); if (focus >= 0 && focus != int(_focusedViewport)) setFocusedViewport(focus); } @@ -849,6 +874,7 @@ void Viewer::mouse(int button, int state, int x, int y) if ( eh->valid() ) { if ( (*eh)->handle(*ea,*this) ) { handled = true; + break; } } } @@ -868,7 +894,6 @@ void Viewer::keyboard(unsigned char key, int x, int y) osg::ref_ptr ea = osgNew GLUTEventAdapter; ea->adaptKeyboard(clockSeconds(),key,x,y); - bool handled = false; for ( EventHandlerList::iterator eh = _viewportList[_focusedViewport]._eventHandlerList.begin(); eh != _viewportList[_focusedViewport]._eventHandlerList.end(); @@ -879,11 +904,9 @@ void Viewer::keyboard(unsigned char key, int x, int y) } } } - if ( !handled ) { - if ( _viewportList[_focusedViewport]._cameraManipulator->handle( - *ea,*this) ) { - return; - } + if ( _viewportList[_focusedViewport]._cameraManipulator->handle( + *ea,*this) ) { + return; } if (key>='1' && key<='3') @@ -1104,17 +1127,7 @@ void Viewer::keyboard(unsigned char key, int x, int y) break; case 'f' : - _fullscreen = !_fullscreen; - if (_fullscreen) - { - _saved_ww = _ww; - _saved_wh = _wh; - glutFullScreen(); - } else - { - //glutPositionWindow(wx,wy); - glutReshapeWindow(_saved_ww,_saved_wh); - } + toggleFullScreen(); break; case 'o' :