- Code: Select all
Starting update (this line is when I start my Nasal update code)
Missing 'parents' vector for ghost
Missing 'parents' vector for ghost
Missing 'parents' vector for ghost
New canvas element /canvas[0]/by-index[0]/texture[0]/group[0]/group[1]/text[0]
Segmentation fault: 11
Code I'm using is:
- Code: Select all
var browser = nil;
var display = func(k,variable,sep=" = ") {
var t = typeof(variable);
if (t == 'scalar') {
call(func size(variable), nil, var err = []);
if (size(err))
k~sep~variable;
else k~sep~"'"~variable~"'";
} elsif (t == 'hash' or t == 'vector')
k~"/ (size: "~size(variable)~")";
elsif (t == 'nil')
k~sep~"nil";
elsif (t == 'ghost')
k~sep~"<ghost/"~ghosttype(variable)~">";
else k~sep~"<"~t~">";
};
var colors = {
'scalar': [0.4,0.0,0.6],
'hash': [0.0,0.0,0.5],
'vector': [0.0,0.8,0.0],
'func': [1.0,0.2,0.0],
'ghost': [1.0,0.3,0.0],
'nil': [0.8,0.8,0.8],
};
var color = func(variable) {
colors[typeof(variable)];
};
var make_window = func {
if (browser != nil) remove_window();
browser = getprop("/sim/version/flightgear") == "2.10.0" ? canvas.Dialog.new([400,600]) : canvas.Window.new([400,600]);
browser.root = globals; browser.scroll = 0;
browser.history = []; browser.loopid = -10e6;
browser.editing = nil; browser.children = [];
browser.listener = setlistener("/devices/status/keyboard/event", func(event) {
if (!event.getNode("pressed").getValue())
return;
var key = event.getNode("key");
var shift = event.getNode("modifier/shift").getValue();
if (key.getValue() == 27 and !shift) {
remove_window();
key.setValue(-1); # drop key event
}
});
var my_canvas = browser.createCanvas()
.setColorBackground(0,0,0,0);
var root = my_canvas.createGroup();
# Title bar:
var title_bar = root.createChild("group");
title_bar.addEventListener("drag", func(e) { browser.move(e.deltaX, e.deltaY); });
var x = 0;
var y = 0;
var rx = 8;
var ry = 8;
var w = 400;
var h = 20;
title_bar.createChild("path")
.moveTo(x + w - rx, y)
.arcSmallCWTo(rx, ry, 0, x + w, y + ry)
.vertTo(y + h)
.horizTo(x)
.vertTo(y + ry)
.arcSmallCWTo(rx, ry, 0, x + rx, y)
.close()
.setColorFill(0.25,0.24,0.22)
.setStrokeLineWidth(0)
.addEventListener("click", func {
#gui.popupTip("Back");
browser.root = pop(browser.history);
if (!size(browser.history)) append(browser.history, globals);
browser.scroll = 0;
display_root();
});
# Border/background
x = 0;
y = 20;
w = 400;
h = 580;
root.createChild("path")
.moveTo(x + w, y)
.vertTo(y + h)
.horizTo(x)
.vertTo(y)
.setColorFill(1,1,1)
.setColor(0,0,0);
# Red-X: close this dialog
x = 8;
y = 5;
w = 10;
h = 10;
title_bar.createChild("path", "icon-close")
.moveTo(x, y)
.lineTo(x + w, y + h)
.moveTo(x + w, y)
.lineTo(x, y + h)
.setColor(1,0,0)
.setStrokeLineWidth(3)
.addEventListener("click", func remove_window());
# Editing window
var editing = root.createChild("text", "editing")
.setText("")
.setTranslation(4, 596)
.setAlignment("left-baseline")
.setFontSize(14)
.setFont("LiberationFonts/LiberationSans-Bold.ttf")
.setColor(0,0,0)
.hide();
# Title of this dialog
title_bar.createChild("text", "dialog-caption")
.setText("Nasal namespace browser")
.setTranslation(x + w + 8, 4)
.setAlignment("left-top")
.setFontSize(14)
.setFont("LiberationFonts/LiberationSans-Bold.ttf")
.setColor(1,1,1);
var body = root.createChild("group");
body.addEventListener("click", func(e) {
var y = e.clientY-20+browser.scroll;
y /= 16;
if (y >= size(browser.children)) return;
var clicked = browser.children[y];
#gui.popupTip("Clicked on "~clicked.id);
if (typeof(clicked.value) == 'hash' or typeof(clicked.value) == 'vector') {
append(browser.history, browser.root);
browser.root = clicked.value;
browser.scroll = 0;
browser.editing = nil;
} else {
browser.editing = clicked;
}
display_root(browser.loopid += 1);
});
body.addEventListener("drag", func(e) {
browser.scroll += e.deltaY;
browser.scroll = browser.scroll < 0 ? 0 : browser.scroll > (size(browser.children)-8)*16 ? math.max((size(browser.children)-8)*16,0) : browser.scroll;
display_root();
});
var update_children = func(id=nil) {
browser.children = [];
var x = 4;
var y = 34-16;
if (typeof(browser.root) == 'hash') {
foreach (var k; sort(keys(browser.root), cmp)) {
if (k == "arg" or k == "__gcsave") continue;
append(browser.children, {
id: k, value: browser.root[k], x: x, y: (y+=16),
});
}
} elsif (typeof(browser.root) == 'vector') {
forindex (var k; browser.root) {
append(browser.children, {
id: k, value: browser.root[k], x: x, y: (y+=16),
});
}
}
};
var last = nil;
var display_root = func(id=nil) {
if (browser == nil) return;
if (browser.children == last) return;
printlog("debug", "Starting update");
last = browser.children;
update_children(browser.loopid += 1);
body.removeAllChildren();
foreach (var child; browser.children) {
var composite = child.y-browser.scroll;
if (composite > 32 and composite < 575)
body.createChild("text")
.setText(display(child.id,child.value))
.setTranslation(child.x, composite)
.setAlignment("left-baseline")
.setFontSize(14)
.setFont("LiberationFonts/LiberationSans-Bold.ttf")
.setColor(color(child.value));
}
if (browser.editing != nil) {
editing.show().setText(display(browser.editing.id,browser.editing.value,": "));
} else editing.hide();
body.update();
if (id != nil) settimer(func display_root(id), 1);
printlog("debug", "Ending update");
};
display_root(1);
};
var toggle_window = func {
if (browser != nil) remove_window();
else {
make_window();
}
};
var remove_window = func {
if (browser == nil) return;
removelistener(browser.listener);
browser.del();
browser = nil;
io.load_nasal(getprop("/sim/fg-root") ~ "/Nasal/nasal_browser.nas"); #reload ourselves for testing purposes
};
It looks like something with settimer() callbacks: removing my auto-update and just scrolling by hand (which calls the same function) and using it, it suddenly works fine. Any ideas? (I hope I'm not making too much noise)