Тимур Ташпулатов
Создатель первого бесплатного русификатора для
PalmOS
Revision 1.0
Вкратце
дело было так: первый пилот (PPPro) я купил в апреле 1998. Как само
собой разумеющееся, в комплекте с ним продавался русификатор Paragon
PiLoc. В этом русификаторе меня устраивало практически все, за исключением
постоянных проблем с надежностью. В той версии имелась известная
когда-то ошибка, связанная с тем, что при интенсивной работе с клавишами
(например, прокрутка документа) система умирала. Причем, спасти
положение можно было только полной перезагрузкой с потерей информации.
Иными словами, Pilot превращался, как сказал кто-то в калькулятор
ценой в 450 долл. Ответа на многочисленные обращения в поддержку
не было. Затем (весна-лето 1998) появился Palm III.
Примерно в то же время компания "МакЦентр" объявила
конкурс на создание русификатора для этого устройства. Paragon напрягся
и разродился PiLoc для III, который уже нормально работал. Насколько
помню, он был сделан уже не на ассемблере, а на Си, и именно поэтому
они якобы выловили пресловутую ошибку. Попутно шли какие-то занятные
разборки на борде "МакЦентр" (если где-то сохранились
материалы, я бы с удовольствием перечитал), а для Pro русификатор
как был глючным, так и оставался.
К осени 1998 я уже созрел что-нибудь написать для Pilot. Как раз
начитался всякого и про HackMaster и про программирование под PalmOS,
и разборки в конференциях придали энтузиазма. Но CyrHack зародился
как плод коллективного творчества СПб "Клуба Пилотоманов",
его обсуждение и отработка шли в SPB.PALMPILOT. Вообще он многим
обязан пилотерам -- клавиатуру раскрутил Владимир Медейко, с метриками
шрифтов разбирался Тимофей Лянгузов, один из шрифтов для Palm III
(LargeBold) сработал его отец, см. списк благодартностей в дистрибутиве
CyrHack).
Полез в Интернет, как обычно нашел ASDK, независимый SDK, тогда
официальный SDK был только один и шел вместе с CodeWarrior. Нашел
Pila (ассемблер), заказал бесплатную книжку на Мотороле по системе
команд m68k, взял нарытых в интернете же примеров (кажется, самоучитель
по написанию хаков и сорцы LogoHack) и вперед.
Потом, версии развивались, исправлялись ошибки и по просьбам пользователей,
иногда появлялись новые функции. Изначально CyrHack был бесплатным,
поскольку а) рассматривался как "наш ответ Керзону" (сиречь
Paragon Software) и б) все-таки плод коллективного творчества.
Первая версия CyrHack появилась 11 сентября 98 и обеспечивала
просто подмену системного шрифта 0 на шрифт с кириллическими символами.
Затем (прошло несколько дней) появилась версия 0.2, которая работала
и на Palm III, а кроме того, был реализован более элегантный способ
подмены шрифта. Потом (0.3) русификатор стал уже корректно работать
и на PilotPro и Palm III.
Как только вышла первая рабочая версия CyrHack, позволявшая хотя
бы читать, народ сразу затребовал и возможность ввода текста. Верней,
клавиатура экранная тоже обрусела (которая Intl), но в какой-то
эскимосской раскладке. Вытащили мы тогда из PalmOS на свет божий
ресурс TKBD, в котором клавиатура и лежит, и стали его ковырять
то так, то этак. А Владимир Медейко пошел дальше -- расковырял формат
ресурса и написал тулзу, которая позволяла собирать свои собственные
TKBD ресурсы. И тогда у нас не было ни исходных текстов PalmOS (не
считая самостоятельно сделанных :)), ни описания ресурсов.
В версии 0.4 появилось русское Graffiti, переключаться с английского
на русский можно было последовательностями \R и \L. Тут я наконец
разобрался, почему шрифты показываются в SysKeyboardDialog и в AsciiChart
так криво -- потому что вызовы вроде FntCharWidth и прочие не пользуются
вызовом FntGetFontPtr (гады!), а лезут напрямую в память.
Затем появились: нормальная раскладка клавиатуры (0.5, кроме того,
в ней снова изменился метод подстановки шрифтов -- патч таблицы
шрифтов, "неэстетично, зато дешево, надежно и практично"),
нормальные буквы (0.6, "наконец то буквы в шрифте перестали
склеиваться подобно разварившимся пельменям"), полужирные символы
(0.7, кроме того, клавиатура заменена на более пристойную "им.
Медейко". Появилась Control Panel, где можно выбрать кодировку
(1251/koi8r, 866 пока была только для красоты) и как следствие хаки
в HackMaster обзавелись Control Panel точь-в-точь как у CyrHack).
Кодировки появились уже в начале существования программы, поскольку
я увлекся идеей непременно сделать хаку панель управления, а что
туда напихать? Естественно, переключатель кодировок :-)
В версии 0.8 появились символы LargeBold (для PalmOS 3), добавлена
фича, позволяющая выбирать настройку CyrHack по включению питания
(English/Russian/Don't care), поменялись местами большие и маленькие
буквы в кодировке koi8r (очередной баг, такие мелочи преследовали
CyrHack до версии 0.40. В версию 0.9 добавлен Large шрифт (PalmOS
ниже 3.0), исправлена ошибка с падением на символе Graffiti shortcut
и разного рода акцентированных символах, в 0.10 исправили ошибку
с вводом кириллицы даже при выбранной латинской клавиатуре, появлением
у всех хаков контрольной панельки от CyrHack, появилась новая система
подмены клавиатуры и некоторые косметические исправления шрифтов.
15 октября 1998 появилась версия 0.11, в которой уже почти полностью
было сделано русское Graffiti (за исключением букв ЙО в koi8r),
уже 16 октября появилась версия 0.12, в которой исправлена ошибка
с неработающими Shortcuts в русском режиме (тут кстати, у CyrHack
и до сих пор проблемы), в Граффити добавлены символы "Э"
и "Ъ", ("забыл ;)") и "завершена эпопея
по населению шрифтов буквами ЙО". В версии 0.13 особенных новинок
не было (поменялись местами большие/маленькие буквы при вводе koi8r),
но версия 0.15 была во многом новой -- кардинально поменялся перехват
ввода (функция EvtGetEvent вместо EvtEnqueueKey), как следствие,
исчезла ошибка, связанная с крахом системы при интенсивной работе
хардварными клавишами, ускорен вывод на экран (это была проблема
-- CyrHack заметно влиял на скорость работы устройства) и была обеспечена
возможность работы их флэш-ППЗУ.
Кстати, небольшое уточнение, не нашедшее отражения в документации
-- после EvtGetEvent сразу же переключились на SysHandleEvent. Кроме
того, версии до 0.15, кажется, пользовались средствами Data Manager
(DmRead/DmWrite), чтобы не заморачиваться с выделением драгоценной
динамической памяти (мало ее и пальмовские доки однозначно говорт,
что расходовать ее надо как воду в пустыне) для подмены таблицы
шрифтов. То есть программа оказалась по сути самомодифицирующейся.
Панкуха, во флэш-пямяти это работать не будет, очевидно. Старый
HackMaster писАлся в те времена, когда о записи во флэш никто и
не думал. Посему он открывал хаки на RW и обламывался, если хак
сидел во флэше. Умельцы его быстро поправили и появилась версия
HackMaster 0.91, которая работала нормально. Cyrhack пришлось переписать
на Memory Manager.
Версия 0.16 привнесла исправление ошибки с неработающим HotSync
(следствие перехвата EvtGetEvent, потому и перешли к SysHandleEvent
как к более безопасному способу обработать ввод пользователя до
того, как это успеет сделать система) и сортировки, в 0.17 появился
индикатор раскладки, в 0.18 способ переключения раскладок изменен
с комбинаций \L и \R на обычный щелчок по индикатору En/Ru (тут
CyrHack стал первым), в 0.19 исправлена ошибка из-за которой переключение
индикатора не работало на PalmIII, несоответствие раскладки и Power
on mode, вместо прямого считывания координат индикатора применяется
перехват GsiSetLocation (как следствие, переключение щелчком должно
работать на PalmOS 1.0, но этого никто не проверял).
Версия 0.20 стала исправлением ошибок с индикатором и сортировкой
записей в Memo, 0.21 стала версией, в которой были исправлены ошибки
невозможности переключения щелчком по индикатору в диалогах типа
Find (это была ошибка в документации PalmOS, в той версии документации,
что была у меня, в описании координат пера были перепутаны местами
window- и screen-related координаты), добавлена комбинация для циклического
переключения языка \| (Extended shift + штрих снизу вверх). В 0.22
пользователь переключается по щелчку на индикаторе, не теряя фокус
ввода (например, в DateBook, ToDo List), в 0.23 заработали Commands,
исправлены ошибки с вылезанием индикатора там, где он не нужен,
"исправлен (надеюсь, окончательно) глюк с несоответствием раскладки
и индикатора" (ошибка таки живучая, до сих даже в 0.40 она
осталась). В 0.24 исправлена ошибка баг, из-за которой система рушилась,
если перед включением хака поиграть с Control Panel и была добавлена
клавиатура koi8r (и 866, "хотя толку от нее пока мало").
С версии 0.25 работают Shortcuts и перекодировка в 866 (чтение),
в 0.26 было применено циклическое переключение кодировок (koi8r/1251/866)
комбинацией \Y (символ иены), в 0.27 -- поправлена кодировка 866,
изменен способ перекодировки символов налету (как следствие, появились
буквы ЙО в кодировках koi8r и 866), исправлены ошибки "пожирания"
в сокращении последнего символа, отличного от пробела.
С Shortcuts в среде PalmOS постоянно проблемы. Я перехватываю
SysHandleEvent, отлавливаю значок шортката (то есть момент, когда
пользователь начинает вводить шорткат), но как мне узнать, что он
его ввел? Насколько помню, не существует такого символа или события
-- "шорткат отработан". Вот и приходится перехватывать
еще пару граффитевых функций и кое-что мудрить с "развернутым"
шорткатом, то есть со строчкой символов, которая возвращается --
подменять последний на спец. код и тому подобное.
Примерно в этот момент CyrHack становится лауреатом тестирования
систем русификации для суперпоративных ПК, которое организовал журнал
PC Magazine/ RE (статья "Уроки русского") как лучший русификатор
PalmOS.
В версии 0.28 появились кодировка Mac и был исправлена проблема,
связанная с неперерисовкой окна при смене кодировки, например, в
Mail, в 0.29 был ляп с кодировкой Mac, в 0.30 экранная клавиатура
отображается в соответствии с выбранным режимом (русская/английская,
либо цифровая), переключение по щелчку на индикаторе сопровождается
звуковым щелчком. С версии 0.31 по комбинации \Y на экран выводится
список доступных кодировок с подсвеченной активной кодировкой и
немного видоизменен диалог "About". В 0.32 стала первой
попыткой исправления ошибки, связанной с неправильным переопределением
системной информации о шрифте для кодировок, отличных от 1251 и
исправлена ошибка с "падением на шорткате", занесенная
в 0.31. Версия 0.33 не приводила к краху системы в момент изменения
кодировки в пустом Memo, исправлена еще более досадная ошибка с
шорткатами, также занесенная в 0.31... Версия 0.34 стала косметической
правкой -- поменялись (в который раз уже) маленькая и большая буквы
ЙО на клавиатуре KOI8R, в Power on mode установкой по умолчанию
сделана Don't care, в 0.35 символ "/" в меню стал корректно
отрисыовываться на PalmIIIx и PalmV, появилась утилита CyrHelp с
помощью по Graffiti.
Кстати, выяснилось, что есть вещи, пока никак не решающиеся элегантно
-- к примеру, у списков (lists) своя собственная процедура отрисовки
выбранного элемента (инвертированный элемент -- белые буквы на темном
фоне), и она не имеет своего собственного API-вызова, то есть ее
не перехватить. И таких мест ой как много :-(
Версия 0.36 привнесла интересную особенность -- корректно отображаются
русские заголовки форм в кодировках, отличных от 1251 (например,
в русифицированной Lines), это конечно не полная локализация, но
иногда полезно. В 0.37 была исправлена ошибка с клавиатурой под
PalmOS 1.0 (неверная отрисовка клавиатуры в кодировке 1251 и сбой
системы на других кодировках) и косметическая правка: правильно
отрисовывется символ "Сокращение" на устройствах с PalmOS
3.1 и выше. В 0.38 был исправлен баг с невозможностью ввода некоторых
символов в кодировках 866 и Macintosh, переключение кодировок можно
производить двойным щелчком по индикатору En/Ru, в 0.39 исправлен
баг с шорткатами (PalmOS 3.1, 3.3), в шрифты добавлен Numeric space
(PalmOS 3.3). Palm сменил коды некоторых символов -- перетащил-таки
их в младшую четверть таблицы ASCII, там и numeric space, и ellipse,
и много всякого.
В редакции 0.40 заработали Commands при активной русской раскладке
в PalmOS 3.3, кроме того, правильно определяется версия CyrHack
в приложениях вроде Launcher/Applications. В 0.41 окончательно убита
ошибка с мусором в начале строк для кодировок, отличных от 1251,
в 0.42 добавлена возможность временного отключения шрифтов в панели
управления (просили знакомые немцы им с умляутами надо работать
и с русским одновременно, но наши, кстати, тоже порадовались), в
0.43 временно отключать шрифты можно также выбором позиции "None"
в списке кодировок.
Декабрь 2000
Продолжение от 1 февраля
Обстоятельства выхода беты 0.44 довольно занятны. Летом прошлого
года один мой знакомый, "любитель экстремальных технологий"
Theta разжился складной клавиатурой для своего Visor. На очередной
пилотовке клавиатуру потерзали и, в общем, недостатков в ней не
нашли, за исключением одного -- печатать по-русски приходилось в
"птичьей" раскладке.
В итоге, было решено, что возможность работы с клавиатурой в CyrHack
была бы интересна. Однако нужно было разжиться (на время) клавиатурой
и палмом для нее (у меня был TRGpro, разъем которого отличается
от Visor и PalmV/Vx). Тут на помощь пришли московские энтузиасты
"пилотного дела" и нашли возможность передать в Питер
PalmVx и Palm Portable Keyboard (большое спасибо Алексею Ковальчуку)
на время отладки очередной беты с поддержкой этой самой клавиатуры.
В результате, в достаточно короткий срок, дня за три, была в CyrHack
была сделана поддержка клавиатуры, как водится, довольно панковским
способом (о технических деталях меня долго пытал PC Magazine/ RE,
кому интересно -- могут посмотреть там, должно быть в одном из ближайших
номеров).
И тут начинается почти невероятная история. Под влиянием эйфории
от <клавиатурного блицкрига> я поместил анонс о готовой бете
CyrHack 0.44 с поддержкой складной клавиатуры в конференцию www.hpc.ru
еще до того, как выложил бету на публичное растерзание. "Хорошие
новости скачут, как блохи", сказал Гребенщиков, чуть ли не
в тот же день со мной связались какие-то москвичи и, старательно
подбирая слова, сделали интересное предложение: не выкладывать бету
0.44 вообще. Меня это, в общем, развеселило, предложения я не принял.
Анонимные бизнесмены оказались настойчивы и второй заход изобиловал
четырехзначными суммами в долларах США и туманными намеками на серьезность
намерений. Мне посоветовали сразу не отказываться и хорошенько все
обдумать, а тем временем ко мне в Питер подъедет специальный человек
для "решения проблемы" (человек действительно подъехал
и мы провели увлекательные три часа, выясняя разнообразные аспекты
авторского права, человеческих взаимоотношений и мира во всем мире.
Расстались чуть ли не друзьями -- человек поехал обратно, а я пошел
выкладывать бету 0.44). :-))
Вскоре после выхода версии 0.44, в питерской компании "Диалектика"
обнаружилась еще одна клавиатура, на этот раз нескладываемая, но
довольно склАдная -- GoType! производства компании LandWare. Представитель
"Диалектики", Сергей Сафронов, любезно согласился предоставить
ее в мое распоряжение и версия 0.45 уже поддерживала (малой кровью)
и эту клавиатуру.
Бета 0.46 своим появлением обязана выходом m100 от Palm Computing.
Помимо разных вкусностей, в m100 появилась дивная программа-часики,
которая конфликтовала с CyrHack (от некорректной отрисовки до краха
устройства). Причина оказалась простой -- m100, в отличие от своих
собратьев, имел не восемь, а девять системных шрифтов (девятый как
раз и использовался для отрисовки циферблата часов). В этой же бете
номер версии добавлен в название хака, просто для пущего удобства.
Бета 0.47 -- багфикс чистейшей воды -- исправлял занесенную в
0.46 ляпу с неперерисовкой индикатора Graffiti. Торопился я и забыл
в одном месте исправить исходники, помня, что шрифтов теперь не
8, а 9. :)
Наконец, в бете 0.48 был исправлен баг, на который жаловались
пользователи PalmOS 3.5, которые работали с KOI8-r. В PalmOS, наряду
с вызовом WinDrawChars, присутствовал и вызов WinDrawChar. В каких-то
ранних бетах я его перехватывал, но бросил, так как он не использовался
в PalmOS до 3.5, а в этой версии его снова задействовали и стали
проявляться проблемы.
Несколько позже появилась версия 0.48lite. Многие пользователи
негодовали по поводу снижения скорости работы при активном CyrHack
(по причине перехвата функций семейств Fntxxx и Winxxx, что необходимо
для отображения разных кодировок). И проблема была решена методом
вырезания функций, которые позволяли работать с кодировками, что
несколько ускорило русификатор.
Последняя, на данный момент, бета, 0.49, немного улучшила положение
с перерисовкой экрана при переключении кодировок. При необходимости
перерисовать экран, используется функция FrmUpdateForm с соответствующим
параметром, однако, существуют программы, которые не обрабатывают
событие update. Причем, даже такие популярные, как AvantGo, CspotRun
или Launcher III. В итоге, в код перерисовки экрана, добавлен вызов
FrmUpdateForm с параметром frmRedrawUpdateCode. После этого, Launcher
III и CSpotRun начали перерисовываться нормально, проблема осталась
только с AvantGo, -- надо будет как-нибудь ее распотрошить и посмотреть,
обрабатывает ли она сей сигнал или нет.
1 февраля 2001
|