!7 cmodule VoiceRecognitionStatus { transient S modeOff = "off", modeListenAllTheTime = "listen", modeListenOnNoise = "listen on noise"; transient LS userSelectedModes = ll( modeOff, modeListenAllTheTime, modeListenOnNoise); S userSelectedMode; switchable bool showHostTrayIcon = true; transient TrayIcon hostTrayIcon; transient ButtonGroup buttons; transient long listeningUntil; // optional transient bool listening; start { dm_reloadOnFieldChange showHostTrayIcon(); if (showHostTrayIcon) hostTrayIcon = dm_systemTrayIcon(#1101635, makeTooltip(), rThread nextMode, flattenToArray(map(userSelectedModes, mode -> ll(mode, rThread { setField(userSelectedMode := mode) })))); dm_watchFieldAndNow userSelectedMode(r { selectRadioButton(buttons, indexOfIC(userSelectedModes, userSelectedMode)); if (eqic(userSelectedMode, modeOff)) { // turn off Listen On Noise & actual recognizer dm_call(dm_listenOnNoiseModuleOpt(), 'setEnabled, false); dm_findAndCall("#1020629/SpeechRecognitionControl", 'cancelAll); dm_stopListening(); } else if (eqic(userSelectedMode, modeListenOnNoise)) { dm_call(dm_listenOnNoiseModule(), 'setEnabled, true); dm_startGoogleSpeechRecognition(); } else if (eqic(userSelectedMode, modeListenAllTheTime)) { dm_call(dm_listenOnNoiseModuleOpt(), 'setEnabled, false); dm_startGoogleSpeechRecognition(); } setToolTip(hostTrayIcon, makeTooltip()); }); } visualize { buttons = jRadioButtons(userSelectedModes); selectRadioButton(buttons, indexOfIC(userSelectedModes, userSelectedMode)); onRadioButtonChange(buttons, voidfunc(int i) { setField(userSelectedMode := _get(userSelectedModes, i)); }); ret jfullcenter(vstackWithSpacing(buttonsInGroup(buttons))); } void nextMode { setField(userSelectedMode := nextInCyclicList(userSelectedMode, userSelectedModes)); } S makeTooltip() { ret userSelectedMode + " - voice recognition 3-way switch"; } }