| Виктор "Витус" Вагнер ( @ 2007-08-20 21:00:00 |
| Current mood: | accomplished |
Переключение раскладок на Bluietooth клавиатуре
По всяческим ресурсам, связанным с maemo бродит устойчивый миф, что переключать раскладки на аппаратной клавиатуре, подключенной к N800 посредством горячей клавиши (комбинации клавиш) невозможно. Так вот, это не так. X-сервер N800 содержит внутри себя полнофункциональное расширение xkb, утилита xkbcomp в умолчательной конфигурации есть. Больше ничего на самом деле не надо. Всё остальное делается при помощи текстовых конфигурационных файлов.
Сначала я попытался тупо перенести на N800 тот способ конфигурирования клавиатуры, который я использую в десктопном линуксе. А у меня это делается из .xsession посредством запуска команды
xkbcomp ${HOME}/.xkbmap ${DISPLAY}
что позволяет для каждого пользователя (меня, жены, сестры etc) иметь собственную раскладку с собственными клавишами переключения.
Файл .xkbmap выглядит примерно так (привожу файл
xkb_keymap "irene_map" {
xkb_keycodes {include "xfree86" };
xkb_types { include "complete"};
xkb_compatibility { include "group_led" };
xkb_symbols {
include "en_US(pc104)"
include "ru(winkeys)"
include "group(ctrl_shift_toggle)"
};
xkb_geometry { include "pc(pc104)" };
};
После некоторых правок, вызыванных отсутствием в комплекте, например файла group_led, раскладка скомпилировалась. Но переключаться на русский отказалось.
Тогда я вспомнил, что xkbcomp умеет не только компилировать, но и декомпилировать раскладки.
Декомпилировал раскладку с десктопа и с N800 и обнаружил, что почему-то на десктопе (XFree86 4.3) включение ru после en приводит к добавлению группы два, а в N800 переопрееделяет группу 1.
Но мы люди не гордые. Берем описания клавиш из десктопной раскладки, которые выглядят примерно так:
key <AB08> {
type[group2]= "ALPHABETIC",
symbols[Group1]= [ comma, less ],
symbols[Group2]= [ Cyrillic_be, Cyrillic_BE ]
};
и копируем вместо родных, которые выглядят как
key <AB08> [ comma, less ];
Компилируем раскладку в X-сервер, декомпилируем. Всё на месте. Значит, xkb в N800 умеет работать с несколькими группами одновременно. Ура!. Пробуем переключиться на русский. Хрен! Вообще ничего кроме знаков препинания не вводится. Переключаемся обратно - латинские буквы вводятся.
Запускаем xev на десктопе, указав ему дисплей N800. Пытаемся ввести буквы. xev показывает что всё в порядке. Прилетает корректный кириллический keysym, XLookupString всё что надо находит.
Значит дело в xlib, причем скорее всего в локали. Смотрим, какая локаль у процесса osso_xterm.
(через proc/<pid>/environ) - LANG=ru_RU. А что у нас думает по поводу ru_RU xlib?
В /usr/share/X11/locale/locale.alias видим строчку
ru_RU ru_RU.ISO8859-5
А надо:
ru_RU ru_RU.UTF-8
потому что во всей остальной системе локаль ru_RU именно UTF-8 локалью и является. Правим эту строчку, перегружаем систему. Заработало.
Осталось понять, куда нужно положить файл .xkm чтобы двуязычная раскладка появилась в списке, который можно выбрать в панели управления.
Эксперименты производились на Genius Mobile Keyboard, которая не HID и поддерживается kbdd.
В этом случае, я, конечно, могу вызов xkbcomp вписать в скрипт btkbd. Чтобы раскладка подгружалась при активации клавиатуры.
Но может быть разработчики обратят внимание на этот пост и в следующем апдейте у нас будет двуязычная раскладка из коробки.
Раскладку клавиатуры, которая у меня в итоге экспериментов получилась, можно взять
здесь.