OpenWiki

Graffiti Manager

Palm Notes | Recent Changes | Title Index | User Preferences | Random Page | Help
Difference from prior major revision.
minor diff author diff hide diff

Как устроена 
подсистема graffiti 
в palmos?
  
<TableOfContents/>
  
=== Введение ===
Статья 
рассказывает об архитектуре подсистемы граффити в PalmOS.
  
=== 
Архитектура 
PalmOS ===
PalmOS пятой 
версии стала 
модульнее. В 
отличии от 
предыдущих 
версий оси, 
где все 
системные 
библиотеки 
были 
объединены в 
один модуль, 
новая  PalmOS 
аккуратно 
разделена 
между 
отдельными 
модулями.
  
Ядро PalmOS 
состоит из 
следующих 
модулей:
  * boot.prc - базовый 
модуль, 
включающий в 
себя 
аппаратно-независимые библиотеки. Именно в этом модуле нахоится менеджер памяти, менеджер баз итд
  * ui.prc - модуль, 
реализующий 
аппаратно-независимые библиотеки работы с экраном. Код из UI рисует окна, формы и стандартные элементы управления.
  * dal.prc - 
низкоуровневые библиотеки, зависящие от устройства. Этот модуль реализуется на фирме-производителе (PalmOne, Tapwawe итд) и привязан к конкретному устройству. Несмотря на то, что функции пишутся на местах, набор функций модуля задан жестко. Модуль DAL вызывается и из BOOT и из UI.
  
=== Роль 
библиотеки 
граффити ===
  
Библиотека
граффити
также
вынесена в
отдельный
модуль. С
точки зрения
остальной
части PalmOS эта
библиотека
является
черным
ящиком. Как и
любая
библиотека,
модуль
граффити 
предоставляет
набор из 23
функций. Из
них только
три
вызываются
ядром: GrfInit ~GrfInit ( 
инициализация
библиотеки),
GrfProcessStroke (передача
штриха на
обработку) и
SysGraffitiReferenceDialog ~SysGraffitiReferenceDialog
(показ
подсказки по
граффити). Все
остальные
функции
изредка
вызываются
прикладными
программами.
  
===Как ядро 
вызывает 
библиотеку 
граффити===
Ядро PalmOS ( 
модуль BOOT 
)делает 
следующие 
действия:
  1. При старте 
ядро 
загружает 
библиотеку 
граффити. При 
загрузке 
указывается 
не имя 
библиотеки, а 
ее тип (libr) и код 
создателя (grft). 
Имя 
библиотеки 
совершенно 
безразлично.
  2. Вызывается
функция GrfInit. ~GrfInit.
  3. Из 
системных 
ресурсов 
извлекается 
ресурс с 
координатами поля граффити. Если такой ресурс существует, то система запоминает координаты области граффити, вместе с координатами алфавитного и числовых полей.
  4. При
получении
росчерка в
области
граффити
ядро
вызывает GrfProcessStroke,
~GrfProcessStroke,
передавая
координаты.
При этом ядро
совершенно
не заботит
как и что 
распознается
библиотекой.
При
получении
законченных
букв,
библиотека
просто
добавляет
события с 
распознанными
буквами.
  5. При
получении 
вертикального
росчерка
через весь
экран, ядро
может
вызвать SysGraffitiReferenceDialog,
~SysGraffitiReferenceDialog, которая
покажет
диалог
основных
росчерков
библиотеки.
  
=== Что делает 
программа 
GraffitiAnywhere? ===
Еще во 
времена PalmOS 4 
было понятно, 
что 
совершенно 
необязательно вводить граффити именно в поле, предназначенном для ввода. Первой ласточкой полноэкранного граффити была программа NewPen. В настоящее время самой известной программой такого класса является GraffitiAnywhere. На некоторых машинках от PalmOne существует альтернативная реализация, наываемая GoLCD.
  
Как работают 
эти 
программы?
  
Очень просто. 
У программ 
существует 
два режима - 
обычный ввод 
и 
переключени 
граффити на 
полный экран. 
Во втором 
режиме все 
росчерки 
масштабируются в росчерки в области граффити линейным преобразованием и передаются в библиотеку. Понятно, что программам, как и ядру не должно быть никакого дела до версии граффити.
  
  
=== Как 
работает 
подмена 
граффити G2 на G1? 
===
Подмена 
библиотеки 
граффити 
основана 
именно на 
том, что 
  1. Граффити 
вынесено в 
отдельную 
библиотеку
  2. Интерфейс 
библиотеки 
не менялся
  3. Имя 
библиотеки 
неважно, 
важен только 
ее тип и 
создатель, а 
эти два 
параметра у G1 
и G2 совпадают
  4. Алгоритм 
поиска 
библиотеки 
работает так 
как нужно.
  
Остановимся 
на п 4. 
поподробнее. 
Как ядро 
определяет 
какую из двух 
библиотек (G2 в ROM 
и G1 в RAM) нужно 
загружать? 
Ведь обе 
билиотеки 
имеют 
совпадающий 
тип и 
создателя?
  
DataManager!DataManager
(менеджер баз)
поступает
просто - он
ищет базу с 
максимальной
версией.
Версия - это
внутреннее
поле в
заголовке
базы. У
библиотек G1 и G2
это поле
совпадает.
Если версии
сопадают, то
будет
выбрана
библиотека
из RAM. Именно
это и
позволяет
выбирать
версию G1.
  
Если 
посмотреть 
на алгоритм 
использования, то становится ясно, что билиотека выбирается однажды при загрузке. Именно поэтому и требуется ресет.
  
Все проблемы 
с 
инсталляцией библиотеки через хотсинк вызваны простой причиной: протокол хотсинк плохо умеет замещать файлы, одноименные файлом из ROM.
  
=== Что была за 
проблема с PalmOS 5.4? 
===
Старый метод 
подмены 
библиотеки 
перестал 
работать на 
устройствах 
с PalmOS 5.4. В чем 
проблема?
  
Все 
оказалось 
просто: PalmSource 
изменили 
интерфейс 
библиотеки и 
добавили в 
нее еще одну 
функцию GrfHandleEvent. 
Эта функция 
периодически вызывается для дополнительных отрисовок виртуального граффити. В G1 эта функция отсутствует и скорее всего не нужна, но наличие пустой функции необходимо. Я подпатчил библиотеку G1, добавил в нее отсутствующую функцию. Исправленную версию можно взять здесь: http://yahm.palmoid.com/G14OS54.zip . 
  
  

Palm Notes | Recent Changes | Title Index | User Preferences | Random Page | Help
Edit this page | View other revisions
Print this page | View XML
Find page by browsing, searching or an index
Edited February 9, 2006 (hide diff)