+/**
+ * Get ghost for existing Canvas.
+ */
+static naRef f_getCanvas(naContext c, naRef me, int argc, naRef* args)
+{
+ nasal::CallContext ctx(c, argc, args);
+ SGPropertyNode& props = *ctx.requireArg<SGPropertyNode*>(0);
+ CanvasMgr& canvas_mgr = requireCanvasMgr(c);
+
+ sc::CanvasPtr canvas;
+ if( canvas_mgr.getPropertyRoot() == props.getParent() )
+ {
+ // get a canvas specified by its root node
+ canvas = canvas_mgr.getCanvas( props.getIndex() );
+ if( !canvas || canvas->getProps() != &props )
+ return naNil();
+ }
+ else
+ {
+ // get a canvas by name
+ if( props.hasValue("name") )
+ canvas = canvas_mgr.getCanvas( props.getStringValue("name") );
+ else if( props.hasValue("index") )
+ canvas = canvas_mgr.getCanvas( props.getIntValue("index") );
+ }
+
+ return NasalCanvas::create(c, canvas);
+}
+
+naRef f_canvasCreateGroup(sc::Canvas& canvas, const nasal::CallContext& ctx)
+{
+ return NasalGroup::create
+ (
+ ctx.c,
+ canvas.createGroup( ctx.getArg<std::string>(0) )
+ );
+}
+
+/**
+ * Get group containing all gui windows
+ */
+naRef f_getDesktop(naContext c, naRef me, int argc, naRef* args)
+{
+ return NasalGroup::create(c, requireGUIMgr(c).getDesktop());
+}
+
+naRef f_groupCreateChild(sc::Group& group, const nasal::CallContext& ctx)
+{
+ return NasalElement::create
+ (
+ ctx.c,
+ group.createChild( ctx.requireArg<std::string>(0),
+ ctx.getArg<std::string>(1) )
+ );
+}
+
+naRef f_groupGetChild(sc::Group& group, const nasal::CallContext& ctx)
+{
+ return NasalElement::create
+ (
+ ctx.c,
+ group.getChild( ctx.requireArg<SGPropertyNode*>(0) )
+ );