Palm (Pilot)
Клуб пользователей, Санкт-Петеpбуpг
 ENLiGHT Project. Новости об информационных технологиях, науке, авиации и космонавтике

ENLiGHT Project

оглавление | новости от ib/news | другие проекты | www.palmgear.com | письмо | win koi lat

Русификация клавиатуры устройств на базе PalmOS

Тимур Ташпулатов

Впервые проблема русификации клавиатуры для Palm возникла еще летом 2000 г., когда в России появились первые модели складной клавиатуры StowAway Keyboard. Эта клавиатура, можно сказать, работала замечательно - складывалась, раскладывалась, а также позволяла вполне сносно работать с латиницей. Однако о кириллице ее создатели, как водится, не позаботились, и клавиатура "не понимала" русского языка. Проблема русификации распадалась на две: нанесение русских букв на клавиатуру и программная ее локализация. Первая проблема решается легко и просто, последняя - несколько сложнее. Дело в том, что существует два подхода: либо разрабатывать собственный клавиатурный драйвер, либо "налаживать" взаимодействие между существующим драйвером (что решает проблемы обработки русских символов, зато ставит проблему совместимости драйвера с любыми клавиатурами) и существующим русификатором (что сложнее в реализации, но не требует переписывания драйвера клавиатуры). Для реализации ввода русских символов с клавиатуры в русификаторе CyrHack было решено использовать последний метод, основываясь на простейшем принципе, когда вводимые с клавиатуры символы латиницы по таблице перекодировки заменяются на символы кириллицы. При этом необходимо соблюдать два условия: драйвер клавиатуры присутствует (и активен), текущий язык в системе - русский.

Обращения к разработчикам фирм - изготовителей клавиатур (Palm Computing и LandWare) с просьбой пролить свет на возможность организации взаимодействия стороннего программного обеспечения с драйверами соответствующих устройств остались без ответа. Пришлось ступить на тропу экспериментальных изысканий. Определить наличие драйвера Palm Portable Keyboard достаточно легко. Сразу после активизации драйвер определяет системную функцию (feature, здесь и далее используется терминология PalmOS, дополнительную информацию о программировании для PalmOS можно найти на www.palmos.com) с идентификатором (ID) 'KO01' и номером 39 (для версии драйвера 1.1). Return-значение, равное 1, соответствует активному состоянию клавиатуры, 0 - клавиатура не используется.

...
KbdDriverID equ 'KO01'
GoTypeDriverID equ 'dwKB'
...

; проверяем наличие драйвера Palm Portable Keyboard

Palm
; вызов функции FtrGet PalmOS, в скобках перечислены аргументы,
; идентификатор GoTypeDriverID описан выше (creator ID, номер
; системной функции, определяемой драйвером клавиатуры, третий
; параметр - 32 - двоичный адрес локальной (относительно регистра
; a6) переменной kbddriver

systrap FtrGet(#KbdDriverID.l, #39.w, &kbddriver(a6).l)
tst.l d0
bne GoType
; проверяем состояние переключателя "Enable Keyboard"
move.l kbddriver(a6), d0
beq.s NoKeyboard
bra.s Keyboard

Ситуация с GoType! немного проще. Драйвер для клавиатуры GoType! доступен как в форме программы-расширения для пакета HackMaster, так и в виде обычной программы. И в том, и в другом случае перехват стандартных системных функций PalmOS выполняется вполне обычным для Palm OS образом, что позволяет обойтись одним вызовом Feature Manager:

; проверяем наличие драйвера GoType! Keyboard
GoType
systrap FtrGet(#GoTypeDriverID.l, #1000.w, &kbddriver(a6).l)
tst.l d0
bne NoKeyboard
; считаем, что драйвер клавиатуры присутствует и активен
Keyboard
...

Перекодирование ввода - обычная таблица подстановки; метод, особенного интереса не представляющий. Перекодируются символы a...z, A...Z, а также цифры 2, 5, 6, 7, 8 (поддержка знаков пунктуации).

Остаются семь особых случаев - символы [, {, ] и } в верхнем алфавитном ряду клавиатуры, которым соответствуют буквы х, Х, ъ, Ъ, символы ;, :, ', ", в среднем ряду (буквы ж, Ж, э, Э) и символы ,, <, ., >, в нижнем ряду (буквы б, Б, ю, Ю), а также символы ` и ~ (буквы ё и Ё). Таблица перекодировки тут не поможет, так как их коды не соответствуют буквам латиницы и функция GrfGetState работает одинаково, независимо от состояния CapsLock. Для этих семи символов было решено воспользоваться неизящной, но действенной цепочкой условных операторов:

...
; функция GrfGetState возвращает статусную
; информацию системы ввода Graffiti
systrap GrfGetState (&capsLock(a6).l, &numLock(a6).l, &tempShift(a6).l,
&autoShifted(a6).l)

tst.b capsLock(a6)
beq.s Exit
Key0
cmp.w #'[', d3
bne.s Key1
moveq #'{', d3
bra.s Exit

Key1
cmp.w #']', d3
bne.s Key2
moveq #'}', d3
bra.s Exit

Key3
...

Key6
cmp.w #'`', d3
bne.s Exit
moveq #'~', d3
Exit
...

Кроме того, чтобы пользователь мог работать одновременно и с клавиатуры, и с Graffiti перехватывается код символа функцией GrfProcessStroke; по результатам анализа return-значения в русификаторе устанавливается некоторый флаг. В дальнейшем этот флаг анализируется при обработке события keyDownEvent и при необходимости символ латиницы, передаваемый драйвером, заменяется символом кириллицы.

systrap FtrGet(#CyrCreatorID.l,
#GrfProcessStrokeID.w, 
&pfnOldProc(a6).l)
move.w p3(a6),-(a7)
move.l p2(a6),-(a7)
move.l p1(a6),-(a7)
move.l pfnOldProc(a6),a0
jsr (a0)

move.w p3(a6),d0
andi.w #$ff00,d0
bne.s Done

move.l d0,-(a7)
systrap FtrGet(#CyrCreatorID.l, #777.w, &ftr(a6).l)
move.l ftr(a6),a0
move.l #1,Features.isstroke(a0)
move.l (a7)+,d0

--

Если вы хотите дополнить FAQ - пожалуйста пишите. Ваши вопросы и ответы по e-mail могут быть помещены в форум или опубликованы в FAQ.

design/collection/some content by Frog,
PALM FAQ (C) Frog 2000-2003,
"PALM FAQ, http://www.enlight.ru/pilot/".