Как устроена подсистема graffiti в palmos?
Статья рассказывает об архитектуре подсистемы граффити в PalmOS.
PalmOS пятой версии стала модульнее. В отличии от предыдущих версий оси, где все системные библиотеки были объединены в один модуль, новая PalmOS аккуратно разделена между отдельными модулями.
Ядро PalmOS состоит из следующих модулей:
Библиотека граффити также вынесена в отдельный модуль. С точки зрения остальной части PalmOS эта библиотека является черным ящиком. Как и любая библиотека, модуль граффити предоставляет набор из 23 функций. Из них только три вызываются ядром: GrfInit ( инициализация библиотеки), GrfProcessStroke (передача штриха на обработку) и SysGraffitiReferenceDialog (показ подсказки по граффити). Все остальные функции изредка вызываются прикладными программами.
Ядро PalmOS ( модуль BOOT )делает следующие действия:
Еще во времена PalmOS 4 было понятно, что совершенно необязательно вводить граффити именно в поле, предназначенном для ввода. Первой ласточкой полноэкранного граффити была программа NewPen. В настоящее время самой известной программой такого класса является GraffitiAnywhere. На некоторых машинках от PalmOne существует альтернативная реализация, наываемая GoLCD.
Как работают эти программы?
Очень просто. У программ существует два режима - обычный ввод и переключени граффити на полный экран. Во втором режиме все росчерки масштабируются в росчерки в области граффити линейным преобразованием и передаются в библиотеку. Понятно, что программам, как и ядру не должно быть никакого дела до версии граффити.
Подмена библиотеки граффити основана именно на том, что
Остановимся на п 4. поподробнее. Как ядро определяет какую из двух библиотек (G2 в ROM и G1 в RAM) нужно загружать? Ведь обе билиотеки имеют совпадающий тип и создателя?
!DataManager (менеджер баз) поступает просто - он ищет базу с максимальной версией. Версия - это внутреннее поле в заголовке базы. У библиотек G1 и G2 это поле совпадает. Если версии сопадают, то будет выбрана библиотека из RAM. Именно это и позволяет выбирать версию G1.
Если посмотреть на алгоритм использования, то становится ясно, что билиотека выбирается однажды при загрузке. Именно поэтому и требуется ресет.
Все проблемы с инсталляцией библиотеки через хотсинк вызваны простой причиной: протокол хотсинк плохо умеет замещать файлы, одноименные файлом из ROM.
Старый метод подмены библиотеки перестал работать на устройствах с PalmOS 5.4. В чем проблема?
Все оказалось просто: PalmSource изменили интерфейс библиотеки и добавили в нее еще одну функцию GrfHandleEvent. Эта функция периодически вызывается для дополнительных отрисовок виртуального граффити. В G1 эта функция отсутствует и скорее всего не нужна, но наличие пустой функции необходимо. Я подпатчил библиотеку G1, добавил в нее отсутствующую функцию. Исправленную версию можно взять здесь: http://yahm.palmoid.com/G14OS54.zip .