Hi Sebastian,

To track what is happening with resize events I modified the test
example to include the following event callback:

class MyEventCakkback : public osgGA::GUIEventHandler
{
public:

    std::string _message;

    MyEventCakkback(const std::string& message):
        _message(message)
    {
    }

    virtual bool handle(const osgGA::GUIEventAdapter& ea,
osgGA::GUIActionAdapter& aa)
    {
        if (ea.getEventType()==osgGA::GUIEventAdapter::RESIZE)
        {
            OSG_NOTICE<<_message<<" :
ea.getEventType()==osgGA::GUIEventAdapter::RESIZE
("<<ea.getWindowX()<<", "<<ea.getWindowY()<<",
"<<ea.getWindowWidth()<<", "<<ea.getWindowHeight()<<")
gc="<<ea.getGraphicsContext()<<std::endl;
        }
        return false;
    }
};

To callback is then added to the two views thus:


         view->addEventHandler(new MyEventCakkback("View 1"));

         wm->resizeAllWindows();

         view->setSceneData(group);
         viewer.addView(view);

            osgViewer::Viewer::Windows windows;
            viewer.getWindows(windows);
            windows[0]->setWindowName("View 1");
    }

.... code snipped....

        view->addEventHandler(new MyEventCakkback("View 2"));

         wm->resizeAllWindows();

         view->setSceneData(group);
         viewer.addView(view);

            osgViewer::Viewer::Windows windows;
            viewer.getWindows(windows);
            windows[1]->setWindowName("View 2");

    }

I have resizing in various combinations and mostly the callbacks all
report the correct View, settings and graphics context, but
occasionally it looks like resizes to one window/view get assigned to
the other view.

What it looks like to me is that if I move the mouse over the 3d
viewport in any way that window correctly gets "focus" and then any
resizes to that window work correctly.  If I then move the move to
resize the other window without the mouse ever going over the 3d
viewport of that second window then "focus" is left with the original
window and results in the events still going to the original window.

I don't know the cause of this bug yet, but at least I have concrete
way of reproducing it.  I am testing under Kubuntu 16.04, so have
KDE/X11 windowing system running.  It may be helpful to find out if
this same issue occurs on other desktops.

I have attached the modified test program and CMakeLists.txt to build it.

Robert.
cmake_minimum_required(VERSION 3.0)

SET(PROJECT_NAME eventtest)

PROJECT(${PROJECT_NAME})

FIND_PACKAGE(OpenThreads)
FIND_PACKAGE(osg)
FIND_PACKAGE(osgDB)
FIND_PACKAGE(osgUtil)
FIND_PACKAGE(osgGA)
FIND_PACKAGE(osgViewer)
FIND_PACKAGE(osgWidget)

SET(SOURCES
    main.cpp
)

INCLUDE_DIRECTORIES(${OPENTHREADS_INCLUDE_DIR} ${OSG_INCLUDE_DIR})

LINK_DIRECTORIES(${OSG_LIB_DIR})

ADD_EXECUTABLE(${PROJECT_NAME} ${SOURCES})

TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OSG_LIBRARIES} ${OSGWIDGET_LIBRARIES} 
${OSGVIEWER_LIBRARIES} ${OSGUTIL_LIBRARIES} ${OSGDB_LIBRARIES} 
${OSGGA_LIBRARIES} ${OPENTHREADS_LIBRARIES})
// -*-c++-*- osgWidget - Code by: Jeremy Moles (cubicool) 2007-2008
// $Id: osgwidgetcanvas.cpp 33 2008-04-04 19:03:12Z cubicool $

#include <osgWidget/Util>
#include <osgWidget/WindowManager>
#include <osgWidget/Canvas>
//#include <osgViewer/CompositeViewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/StateSetManipulator>
#include <osgWidget/ViewerEventHandlers>

const unsigned int MASK_2D = 0xF0000000;

bool colorWidgetEnter(osgWidget::Event& event) {
    event.getWidget()->addColor(0.5f, 0.2f, 0.3f, 0.0f);

    // osgWidget::warn() << "WIDGET mouseEnter " << event.getWidget()->getName() << std::endl;
    
    return false;
}

bool colorWidgetLeave(osgWidget::Event& event) {
    event.getWidget()->addColor(-0.5f, -0.2f, -0.3f, 0.0f);

    // osgWidget::warn() << "WIDGET mouseLeave" << std::endl;
    
    return true;
}

bool windowMouseOver(osgWidget::Event& /*event*/) {
    //osgWidget::XYCoord xy = event.getWindow()->localXY(event.x, event.y);
    // osgWidget::warn() << "WINDOW " << xy.x() << " - " << xy.y() << std::endl;

    return true;
}

bool widgetMouseOver(osgWidget::Event& /*event*/) {
    // osgWidget::XYCoord xy = event.getWidget()->localXY(event.x, event.y);
    // osgWidget::warn() << "WIDGET mouseOver " << xy.x() << " - " << xy.y() << std::endl;

    return true;
}

osgWidget::Widget* createWidget(
    const std::string&       name,
    osgWidget::color_type    col,
    osgWidget::Widget::Layer layer
) {
    osgWidget::Widget* widget = new osgWidget::Widget(name, 200.0f, 200.0f);

    widget->setEventMask(osgWidget::EVENT_ALL);
    widget->addCallback(new osgWidget::Callback(&colorWidgetEnter, osgWidget::EVENT_MOUSE_PUSH));
    widget->addCallback(new osgWidget::Callback(&colorWidgetLeave, osgWidget::EVENT_MOUSE_RELEASE));
    widget->addCallback(new osgWidget::Callback(&colorWidgetEnter, osgWidget::EVENT_MOUSE_ENTER));
    widget->addCallback(new osgWidget::Callback(&colorWidgetLeave, osgWidget::EVENT_MOUSE_LEAVE));
    widget->addCallback(new osgWidget::Callback(&widgetMouseOver, osgWidget::EVENT_MOUSE_OVER));
    widget->setColor(col, col, col, 0.5f);
    widget->setLayer(layer);
    
    return widget;
}


class MyEventCakkback : public osgGA::GUIEventHandler
{
public:

    std::string _message;

    MyEventCakkback(const std::string& message):
        _message(message)
    {
    }

    virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
    {
        if (ea.getEventType()==osgGA::GUIEventAdapter::RESIZE)
        {
            OSG_NOTICE<<_message<<" : ea.getEventType()==osgGA::GUIEventAdapter::RESIZE ("<<ea.getWindowX()<<", "<<ea.getWindowY()<<", "<<ea.getWindowWidth()<<", "<<ea.getWindowHeight()<<") gc="<<ea.getGraphicsContext()<<std::endl;
        }
        return false;
    }
};

int main(int argc, char** argv) {
    osgViewer::CompositeViewer viewer;
    {
		osgViewer::View* view = new osgViewer::View;

		osgWidget::WindowManager* wm = new osgWidget::WindowManager(
			view,
			1280.0f,
			1024.0f,
			MASK_2D,
			osgWidget::WindowManager::WM_PICK_DEBUG
		);

		osgWidget::Canvas* canvas = new osgWidget::Canvas("canvas");

		canvas->addCallback(new osgWidget::Callback(&windowMouseOver, osgWidget::EVENT_MOUSE_OVER));
		canvas->attachMoveCallback();
		canvas->attachRotateCallback();
		canvas->attachScaleCallback();

		canvas->addWidget(
			createWidget("w1", 0.2f, osgWidget::Widget::LAYER_LOW),
			0.0f,
			0.0f
		);

		canvas->addWidget(
			createWidget("w2", 0.4f, osgWidget::Widget::LAYER_MIDDLE),
			200.0f,
			0.0f
		);

		canvas->addWidget(
			createWidget("w3", 0.6f, osgWidget::Widget::LAYER_HIGH),
			400.0f,
			0.0f
		);

		// Add a child and then resize it relatively to the size of the parent Window.
		osgWidget::Widget* relWidget = new osgWidget::Widget("relative");

		relWidget->setLayer(osgWidget::Widget::LAYER_LOW, 1);
		relWidget->setCoordinateMode(osgWidget::Widget::CM_RELATIVE);
		relWidget->setSize(0.2f, 0.2f);
		relWidget->setColor(0.5f, 0.5f, 0.1f, 0.9f);

		osgWidget::warn() << canvas->getWidth() << std::endl;

		canvas->addWidget(relWidget, 0.4f, 0.4f);

		relWidget->addOrigin(0.1f, 0.1f);
		relWidget->addSize(0.2f, 0.2f);

		canvas->resize();

		// Finally, add the whole thing to the WindowManager.
		wm->addChild(canvas);

		if(!wm) return 1;

		view->setUpViewInWindow(
			 50,
			 50,
			 static_cast<int>(wm->getWidth()),
			 static_cast<int>(wm->getHeight())
		 );

		 osg::Group*  group  = new osg::Group();
		 osg::Camera* camera = wm->createParentOrthoCamera();

		 group->addChild(camera);

		 view->addEventHandler(new osgWidget::MouseHandler(wm));
		 view->addEventHandler(new osgWidget::KeyboardHandler(wm));
		 view->addEventHandler(new osgWidget::ResizeHandler(wm, camera));
		 view->addEventHandler(new osgWidget::CameraSwitchHandler(wm, camera));
		 view->addEventHandler(new osgViewer::StatsHandler());
		 view->addEventHandler(new osgViewer::WindowSizeHandler());
		 view->addEventHandler(new osgGA::StateSetManipulator(
				 view->getCamera()->getOrCreateStateSet()
		 ));

         view->addEventHandler(new MyEventCakkback("View 1"));

         wm->resizeAllWindows();

		 view->setSceneData(group);
		 viewer.addView(view);

			osgViewer::Viewer::Windows windows;
			viewer.getWindows(windows);
			windows[0]->setWindowName("View 1");
	}

    {
		osgViewer::View* view = new osgViewer::View;

		osgWidget::WindowManager* wm = new osgWidget::WindowManager(
			view,
			1280.0f,
			1024.0f,
			MASK_2D,
			osgWidget::WindowManager::WM_PICK_DEBUG
		);

		osgWidget::Canvas* canvas = new osgWidget::Canvas("canvas");

		canvas->addCallback(new osgWidget::Callback(&windowMouseOver, osgWidget::EVENT_MOUSE_OVER));
		canvas->attachMoveCallback();
		canvas->attachRotateCallback();
		canvas->attachScaleCallback();

		canvas->addWidget(
			createWidget("w1", 0.2f, osgWidget::Widget::LAYER_LOW),
			0.0f,
			0.0f
		);

		canvas->addWidget(
			createWidget("w2", 0.4f, osgWidget::Widget::LAYER_MIDDLE),
			200.0f,
			0.0f
		);

		canvas->addWidget(
			createWidget("w3", 0.6f, osgWidget::Widget::LAYER_HIGH),
			400.0f,
			0.0f
		);

		// Add a child and then resize it relatively to the size of the parent Window.
		osgWidget::Widget* relWidget = new osgWidget::Widget("relative");

		relWidget->setLayer(osgWidget::Widget::LAYER_LOW, 1);
		relWidget->setCoordinateMode(osgWidget::Widget::CM_RELATIVE);
		relWidget->setSize(0.2f, 0.2f);
		relWidget->setColor(0.5f, 0.5f, 0.1f, 0.9f);

		osgWidget::warn() << canvas->getWidth() << std::endl;

		canvas->addWidget(relWidget, 0.4f, 0.4f);

		relWidget->addOrigin(0.1f, 0.1f);
		relWidget->addSize(0.2f, 0.2f);

		canvas->resize();

		// Finally, add the whole thing to the WindowManager.
		wm->addChild(canvas);

		if(!wm) return 1;

		view->setUpViewInWindow(
			 50,
			 50,
			 static_cast<int>(wm->getWidth()),
			 static_cast<int>(wm->getHeight())
		 );

		 osg::Group*  group  = new osg::Group();
		 osg::Camera* camera = wm->createParentOrthoCamera();

		 group->addChild(camera);

		 view->addEventHandler(new osgWidget::MouseHandler(wm));
		 view->addEventHandler(new osgWidget::KeyboardHandler(wm));
		 view->addEventHandler(new osgWidget::ResizeHandler(wm, camera));
		 view->addEventHandler(new osgWidget::CameraSwitchHandler(wm, camera));
		 view->addEventHandler(new osgViewer::StatsHandler());
		 view->addEventHandler(new osgViewer::WindowSizeHandler());
		 view->addEventHandler(new osgGA::StateSetManipulator(
				 view->getCamera()->getOrCreateStateSet()
		 ));

         view->addEventHandler(new MyEventCakkback("View 2"));

		 wm->resizeAllWindows();

		 view->setSceneData(group);
		 viewer.addView(view);

			osgViewer::Viewer::Windows windows;
			viewer.getWindows(windows);
			windows[1]->setWindowName("View 2");

	}
    return viewer.run();

    //return osgWidget::createExample(viewer, wm);
}

/*
int main(int argc, char** argv) {
    osgViewer::Viewer viewer;

    osgWidget::WindowManager* wm = new osgWidget::WindowManager(
        &viewer,
        1280.0f,
        1024.0f,
        MASK_2D,
        osgWidget::WindowManager::WM_PICK_DEBUG
    );
    
    osgWidget::Canvas* canvas = new osgWidget::Canvas("canvas");

    canvas->addWidget(new osgWidget::Widget("spacer", 2.0f, 300.0f), 1280.0f, 0.0f);

    canvas->setOrigin(0.0f, 300.0f);

    wm->addChild(canvas);

    return osgWidget::createExample(viewer, wm);
}
*/
_______________________________________________
osg-submissions mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org

Reply via email to