Если писать распределённые приложения в стиле файловых серверов, то с графикой в Inferno вы столкнётесь не раньше, чем захотите запустить графический отладчик для отладки своего многопоточного приложения.
Но если вы пишете приложение с UI, которое должно работать на встроенных устройствах или как плагин в браузере (кстати, сейчас вроде разрабатывают аналог существующего Inferno-плагина для IE под Firefox), то сразу возникнет вопрос "а как в Inferno писать графические приложения?".
Tk.
Единственный способ работать с графикой в Inferno - это Tk. Причём поддержка Tk встроена в ядро (!) Inferno. Безусловно, для программирования графического UI проще Tk, наверное, ничего быть не может (я не беру сейчас дизайнеры UI в стиле Delphi, потому что хотя пользоваться ими легко и удобно, но вот код, который они генерируют, на порядок сложнее кода Tk).
На Limbo/Tk в Inferno написаны абсолютно все графические приложения включая саму оконную систему wm (аналог X-Window).
Но лично меня всегда расстраивал внешний вид Tk-приложений и я никогда не мог понять почему никто не сделает для Tk поддержку стилей/шкурок. :(
К сожалению, больше я ничего по этому вопросу добавить не могу, т.к. я с графикой в Inferno не работал - мне пока интереснее писать распределённые приложения и файловые сервера.
Plumbing.
Ещё один интересный механизм в Inferno и Plan9 это Plumbing. В принципе он может использоваться и в текстовом режиме, но в основном он используется при работе в wm.
Этот механизм обеспечивает возможность передачи сообщений между приложениями, причём юзер может этот процесс контролировать через конфиг-файл plumber-сервиса. К примеру, когда вы в файловом менеджере кликаете на файле, он просто передаёт имя этого файла в plumber и тот запускает приложение соответствующее этому файлу. Или при drag-n-drop, когда вы перетаскиваете из одного приложения объект в окно другого приложения то первое просто посылает через plumber сообщение второму с указанием какой именно объект нужно передать.
Вот пример конфига plumber, для наглядности:
# file URLs go to wm/charon kind is text data matches '[a-zA-Z0-9_/\-]+\.html?' data isfile $0 data set file://localhost$file plumb to web plumb start /dis/charon.dis $data # .m files are looked up in /module and passed to wm/brutus kind is text data matches '([a-zA-Z0-9]+\.m)(:[0-9]+)?' data isfile /module/$1 data set /module/$0 plumb to edit plumb start /dis/wm/brutus.dis $file$2
К сожалению, с ним я тоже особо не работал… подробнее про plumbing наверняка смогут рассказать люди, которые работали с Plan9.
Я просто решил, что лучше об этих вещах упомянуть хоть так, чем никак. Дальше опять буду писать о вещах с которыми работал. :)