POWERMAN
"In each of us sleeps a genius...
and his sleep gets deeper everyday."

Если писать распределённые приложения в стиле файловых серверов, то с графикой в 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.

Я просто решил, что лучше об этих вещах упомянуть хоть так, чем никак. Дальше опять буду писать о вещах с которыми работал. :)