+
+//------------------------------------------------------------------------------
+void DesktopGroup::handleMouseMode(SGPropertyNode* node)
+{
+ // pass-through indicates events should pass through to the UI
+ _handle_events = fgGetNode("/input/mice/mouse[0]/mode", node->getIntValue())
+ ->getBoolValue("pass-through");
+}
+
+//------------------------------------------------------------------------------
+GUIMgr::GUIMgr()
+{
+
+}
+
+//------------------------------------------------------------------------------
+canvas::WindowPtr GUIMgr::createWindow(const std::string& name)
+{
+ canvas::WindowPtr window = _desktop->createChild<canvas::Window>(name);
+ if( name.empty() )
+ window->set<std::string>
+ (
+ "id",
+ boost::lexical_cast<std::string>(window->getProps()->getIndex())
+ );
+ return window;
+}
+
+//------------------------------------------------------------------------------
+void GUIMgr::init()
+{
+ DesktopPtr desktop( new DesktopGroup );
+ desktop->handleResize
+ (
+ 0,
+ 0,
+ fgGetInt("/sim/startup/xsize"),
+ fgGetInt("/sim/startup/ysize")
+ );
+ _desktop = desktop;
+
+ _event_handler = new GUIEventHandler(desktop);
+ globals->get_renderer()
+ ->getViewer()
+ ->getEventHandlers()
+ // GUI is on top of everything so lets install as first event handler
+ .push_front( _event_handler );
+
+ simgear::canvas::Canvas::addPlacementFactory
+ (
+ "window",
+ boost::bind(&GUIMgr::addWindowPlacement, this, _1, _2)
+ );
+
+ _desktop->getProps()->fireCreatedRecursive();
+}
+
+//------------------------------------------------------------------------------
+void GUIMgr::shutdown()
+{
+ _desktop->destroy();
+ _desktop.reset();
+ simgear::canvas::Canvas::removePlacementFactory("window");
+
+ globals->get_renderer()
+ ->getViewer()
+ ->removeEventHandler( _event_handler );
+ _event_handler = 0;
+}
+
+//------------------------------------------------------------------------------
+void GUIMgr::update(double dt)
+{
+ _desktop->update(dt);
+}
+
+//------------------------------------------------------------------------------
+simgear::canvas::GroupPtr GUIMgr::getDesktop()
+{
+ return _desktop;
+}
+
+//------------------------------------------------------------------------------
+simgear::canvas::Placements
+GUIMgr::addWindowPlacement( SGPropertyNode* placement,
+ simgear::canvas::CanvasPtr canvas )
+{
+ const std::string& id = placement->getStringValue("id");
+
+ simgear::canvas::Placements placements;
+ canvas::WindowPtr window = _desktop->getChild<canvas::Window>(id);
+ if( window )
+ {
+ window->setCanvasContent(canvas);
+ placements.push_back(
+ simgear::canvas::PlacementPtr(
+ new WindowPlacement(placement, window, canvas)
+ ));
+ }
+ return placements;
+}