joystick-info vbox 3 hbox 1 true value = func(p, default = "") { return p != nil and (var v = p.getValue()) != nil ? v : default; } items = func(it, name) { var t = ""; foreach (var x; it) { t ~= " ["; t ~= value(x.getNode("name"), name ~ " #" ~ x.getIndex()); t ~= "] "; t ~= value(x.getNode("desc"), "???"); t ~= "\n"; } return t; } var t = ""; var joysticks = props.globals.getNode("/input/joysticks").getChildren("js"); var numjoysticks = size(joysticks); forindex (var i; joysticks) { var js = joysticks[i]; t ~= "Joystick #" ~ js.getIndex() ~ ": \"" ~ value(js.getNode("id"), "[unnamed]") ~ "\"\n\n"; t ~= " Configuration: " ~ value(js.getNode("source"), "[user defined]") ~ "\n"; var names = js.getChildren("name"); if (size(names)) { t ~= " Used for: "; var last = pop(names); foreach (var n; names) { t ~= '"' ~ value(n) ~ '", '; } t ~= '"' ~ value(last) ~ '"'; } t ~= "\n\n"; t ~= items(js.getChildren("axis"), "Axis"); t ~= "\n"; t ~= items(js.getChildren("button"), "Button"); if (numjoysticks > 1 and i < numjoysticks - 1) { t ~= "\n\n\n----------------------------------------\n\n\n"; } } var text = props.globals.getNode("/sim/gui/dialogs/joystick-info/text", 1); text.setValue(t); text.setValue(""); fill 640 480 20 true false /sim/gui/dialogs/joystick-info/text