!7 srecord PlayingProgram( S processID, S applicationName, S sinkName, int sinkIndex, int index ) {} cmodule ListPlayingPrograms > DynObjectTable { start { set fieldsInOrder; dontPersist(); doEvery(0.0, 10.0, r updateList); } void updateList enter { LS parts = withoutEmptyAfterTrims(splitByZeroIndent(backtick("pactl list sink-inputs"))); new L list; for (S part : parts) { int idx = parseFirstInt(part); SS properties1 = parseColonProperties(part); SS properties2 = parseEqualsProperties(part); int sinkIndex = parseIntOrMinus1(properties1.get("Sink")); S sinkName = cast dm_findAndCallModule("#1027072/ListAudioSinks", 'getSinkName, sinkIndex); list.add(nu(PlayingProgram, index := idx, applicationName := unquote(properties2.get("application.name")), processID := unquote(properties2.get("application.process.id")), +sinkIndex, +sinkName)); } setData(list); } visualize { JComponent c = super.visualize(); ret centerAndEastWithMargins(c, vstackWithSpacing(jlabel("Buttons go here"))); } }