На данный момент в alterator поддерживаются интерфейсы Qt и Http. Как же удаётся lookout одновременно работать со столь различными по подходу вариантами? Всё дело в волшебных пузырьках – то есть в драйверах.
Каждый драйвер интерфейса предоставляет как минимум следующую информацию:
Вот небольшой фрагмент описания готового драйвера для http-интферфейса:
Драйвер Qt устроен относительно просто (суммарный объём исходного текста драйвера – чуть больше 120K).
Создание, удаление интерфейса соответствует в точности созданию и удалению QApplication. Описание виджетов практически напрямую отображаются соответствующие объекты Qt: QPushButton, QLabel, и так далее. Корневой виджет – фактически vbox, а Popup – QDialog. Запуск интерфейса состоит в получении описания виджета с идентификатором «/», заключению его в popup и запуске диалога. По завершению работы с основным диалогом работа с интерфейсом заканчивается.
Большая часть драйвера описана на C++, остальное – на Scheme. Мостик между этими языками настолько крошечный что при переходе на другую реализацию схемы менять придётся не много. Связующие функции делатся на две группы:
В части C++ построена иерархия объектов, наследников базового типа qt_widget. Каждый наследник является маленькой оболочкой вокруг того или иного виджета qt и в его задачу входит: разбирать входящие запросы на изменение/получение аттрибутов. Перехватывать события qt и передавать их вызов в соответствующий callback на уровне Scheme. Часть слотов реализована так что их вызов происходит отложенным ибо может происходить изменение объекта «из-под самого себя», чего не могут пережить часть виджетов Qt. Также во избежание проблем с зацикливанием вызов callback'a Scheme происходит только в случае поступления события от пользователя, а не в случае попутного вызова в результате операций set.
В части Scheme построена небольшая иерархия объектов?. Иерархия потребовалась для введения уточнений и более удобной работы с listbox и popup.
Предпочитаемые языки определяются согласно переменным среды, то есть фактически точно также как действовал бы обычный gettext.
Более сложный драйвер. Состоит из трёх отдельных частей:
* сервер – обеспечивает хранение состояний пользовательских сессий, аутентификацию и обработку callback'ов.
* fcgi-скрипт – мостик между сервером и web-браузером. Принимает Http-запросы, считывает и выставляет cookies.
* javascript – работает на клиентском браузере, здесь собственно заканчивается alterator и начинается движок интерфейса – *qooxdoo*.
Можно смотреть как на мостик между Javascript и Scheme.