!7 sclass FakeFake > DynModule { transient JTextArea ta; S text; LS log = synchroList(); start { onSpeechRecognized(voidfunc(fS s) { log("Heard: " + s); swing { if (!dm_visible() || ta == null) ret; fS line = firstLine(text); if (empty(line)) ret; log("Said: " + line); setText(ta, dropFirstLine(text)); // TODO: move cursor thread { dm_say(line); } } }); } void log(S s) { log.add(print(s)); persistMe(); } visualize { ret ta = jLiveValueWordWrapTypeWriterTextArea_bothWays(dm_fieldLiveValue('text)); } }