diff --git a/src/osgViewer/CompositeViewer.cpp b/src/osgViewer/CompositeViewer.cpp index fcb12326b..c035fec53 100644 --- a/src/osgViewer/CompositeViewer.cpp +++ b/src/osgViewer/CompositeViewer.cpp @@ -999,8 +999,27 @@ void CompositeViewer::eventTraversal() osgGA::GUIEventAdapter* event = (*itr)->asGUIEventAdapter(); if (!event) continue; + enum EventClassification + { + EVENT_FOR_VIEW_ASSOCIATED_WITH_FOCUS, + EVENT_FOR_VIEWS_ASSOCIATED_WITH_WINDOW, + EVENT_FOR_ALL_VIEWS + }; + + EventClassification classifaction = EVENT_FOR_ALL_VIEWS; + switch(event->getEventType()) { + case(osgGA::GUIEventAdapter::CLOSE_WINDOW): + case(osgGA::GUIEventAdapter::RESIZE): + classifaction = EVENT_FOR_VIEWS_ASSOCIATED_WITH_WINDOW; + break; + + case(osgGA::GUIEventAdapter::QUIT_APPLICATION): + case(osgGA::GUIEventAdapter::USER): + classifaction = EVENT_FOR_ALL_VIEWS; + break; + case(osgGA::GUIEventAdapter::PUSH): case(osgGA::GUIEventAdapter::RELEASE): case(osgGA::GUIEventAdapter::DOUBLECLICK): @@ -1021,8 +1040,10 @@ void CompositeViewer::eventTraversal() _previousEvent = event; + classifaction = EVENT_FOR_VIEW_ASSOCIATED_WITH_FOCUS; break; } + default: if (_previousEvent.valid()) event->copyPointerDataFrom(*_previousEvent); break; @@ -1037,12 +1058,12 @@ void CompositeViewer::eventTraversal() { if (_viewWithFocus.valid()) { - // OSG_NOTICE<<"Falling back to using _viewWithFocus"<getEventQueue()->getCurrentEventState(); - eventState->copyPointerDataFrom(*event); + viewEventsMap[view].push_back( event ); + + osgGA::GUIEventAdapter* eventState = view->getEventQueue()->getCurrentEventState(); + eventState->copyPointerDataFrom(*event); + } + break; + } + case(EVENT_FOR_VIEWS_ASSOCIATED_WITH_WINDOW): + { + typedef std::set ViewSet; + ViewSet views; + osg::GraphicsContext* gc = event->getGraphicsContext(); + if (gc) + { + typedef osg::GraphicsContext::Cameras Cameras; + Cameras& cameras = gc->getCameras(); + for(Cameras::iterator citr = cameras.begin(); + citr != cameras.end(); + ++citr) + { + osgViewer::View* camera_view = dynamic_cast((*citr)->getView()); + if (camera_view) views.insert(camera_view); + } + } + for(ViewSet::iterator vitr=views.begin(); + vitr!=views.end(); + ++vitr) + { + OSG_INFO<<"Sending EVENT_FOR_VIEWS_ASSOCIATED_WITH_WINDOW event "<get()<