Виктор "Витус" Вагнер ([info]vitus_wagner) wrote in [info]ru_maemo,
@ 2007-08-20 21:00:00
Previous Entry  Add to memories!  Tell a Friend  Next Entry
Current mood:accomplished

Переключение раскладок на Bluietooth клавиатуре
По всяческим ресурсам, связанным с maemo бродит устойчивый миф, что переключать раскладки на аппаратной клавиатуре, подключенной к N800 посредством горячей клавиши (комбинации клавиш) невозможно. Так вот, это не так. X-сервер N800 содержит внутри себя полнофункциональное расширение xkb, утилита xkbcomp в умолчательной конфигурации есть. Больше ничего на самом деле не надо. Всё остальное делается при помощи текстовых конфигурационных файлов.


Сначала я попытался тупо перенести на N800 тот способ конфигурирования клавиатуры, который я использую в десктопном линуксе. А у меня это делается из .xsession посредством запуска команды

xkbcomp ${HOME}/.xkbmap ${DISPLAY}

что позволяет для каждого пользователя (меня, жены, сестры etc) иметь собственную раскладку с собственными клавишами переключения.

Файл .xkbmap выглядит примерно так (привожу файл [info]irene_dragon, потому что той клавиши, которую использую на десктопе для переключения раскладок я, на Genius Mobile Keyboard просто нет)
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. Чтобы раскладка подгружалась при активации клавиатуры.

Но может быть разработчики обратят внимание на этот пост и в следующем апдейте у нас будет двуязычная раскладка из коробки.

Раскладку клавиатуры, которая у меня в итоге экспериментов получилась, можно взять
здесь.




(20 comments) - (Post a new comment)


[info]mss
2007-08-20 06:13 pm UTC (link)
Спасибо за интересную информацию :) Виктор, а можно тебя попросить зафайлить баг на https://bugs.maemo.org? :)

(Reply to this) (Thread)


[info]vitus_wagner
2007-08-20 06:25 pm UTC (link)
А что именно файлить как баг? Некорректный алиасинг локалей в xlib, неработу родной русской раскладки или отсутствие двуязычной?

(Reply to this) (Parent)(Thread)


[info]lvader
2007-08-20 08:24 pm UTC (link)
xlib locale и отсутсвие двуязычной.

(Reply to this) (Parent)


[info]mss
2007-08-21 10:09 pm UTC (link)
по крайней мере, по поводу содержимого /usr/share/X11/locale/locale.alias (ибо устройство везде использует/пытается использовать utf-8).

(Reply to this) (Parent)(Thread)


[info]vitus_wagner
2007-08-22 06:19 am UTC (link)
Этот - зафайлил #1864.

(Reply to this) (Parent)


[info]duke_igthorn
2007-08-20 08:27 pm UTC (link)
1. Это что - намек, что пора браться за переключалку под маемо?;)
2. Мне кажется, правильнее было бы xkb_symbols { include "pc+us+ru(winkeys):2+group(ctrl_shift_toggle)" }; Не затруднит попробовать?

(Reply to this) (Thread)


[info]vitus_wagner
2007-08-20 10:23 pm UTC (link)
Попробую. Видимо, надо поскать описание синтаксиса входного языка xkbcomp нужной версии. А то я последний раз доку читал во времена Xfree 4.1. С тех пор просто все работало и не отваливалось.

А переключалку? Какую еще переключалку, кроме ctrl+shift надо?
Разве что индикатор в статус-баре, но там и так места мало.

(Reply to this) (Parent)(Thread)


[info]duke_igthorn
2007-08-20 10:50 pm UTC (link)
Если что - обращайтесь с вопросами по XKB, я ж на этом xkbобаку скушал... Входной язык реально не менялся с xfree4.3. Просто в xfree4.3 файл ru включает в себя две группы IIRC, а чуть позже все раскладки стали одногруппными (что был просто прорыв, спасибо Паскалю).

Переключалку - именно как индикатор, да. Заняться чоль на досуге?...

(Reply to this) (Parent)(Thread)


[info]_arty
2008-04-07 09:52 pm UTC (link)
ммм, а можно тогда офтопный вопрос по xkb?

получится ли в нем сделать включение одного языка левым шифтом, а другого правым, чтобы при этом шифты можно было использовать обычным образом для заглавных букв и пр.?

(Reply to this) (Parent)(Thread)


[info]duke_igthorn
2008-04-07 10:04 pm UTC (link)
Нет, боюсь, это невозможно. Если клавиша обозначена как переключатель - она теряет остальные функции, соотв. для заглавных букв придется использовать другие клавиши. Извините за плохие новости;)

(Reply to this) (Parent)(Thread)


[info]_arty
2008-04-07 10:08 pm UTC (link)
спасибо за ответ : )
я на самом деле давно пришел к такому же выводу после многих часов за мануалами, но хотел уточнить у специалиста

(Reply to this) (Parent)


[info]besm6
2007-08-21 05:10 pm UTC (link)
include "ru(winkeys)"

Декомпилировал раскладку с десктопа и с N800 и обнаружил, что почему-то на десктопе (XFree86 4.3) включение ru после en приводит к добавлению группы два, а в N800 переопрееделяет группу 1.


Патамушта у тебя на десктопе sarge, и иксы сильно предыдущей версии. Для xorg отквоченная строка должна выглядеть как

include "ru(winkeys):2"

(Reply to this) (Thread)


[info]vitus_wagner
2007-08-22 06:20 am UTC (link)
На ноутбуке у меня etch, и в нем тоже работает.

(Reply to this) (Parent)(Thread)


[info]besm6
2007-08-22 09:04 am UTC (link)
Ищи на нем compatibility-пакет...

(Reply to this) (Parent)


[info]38_s_maker
2007-08-28 11:21 pm UTC (link)
Вам всетаки удалось подружить genius с н800? поделитесь, как. а то лежит дома его клон - луч бт, думаю hId у них одинаков.

(Reply to this) (Thread)


[info]vitus_wagner
2007-08-29 05:56 am UTC (link)
Я об этом писал парой постов ранее. HID у них точно одинаков, в том смысле что у обоих отсутствует нахрен. Протокол работы через SPP может одинаков, а может и нет. Проверяется методом научного тыка - берется kbdd и запускается со всеми возможными названиями типа клавиатуры по очереди.

У меня сработал тип клавиатуры freedom, который был пятым или шестым из опробованных.

(Reply to this) (Parent)


[info]vytvyt
2007-09-18 12:47 pm UTC (link)
У меня заработало без правки /usr/share/X11/locale/locale.alias, там по-прежнему ru_RU.ISO8859-5. Раскладка переключается (только левыми ctrl+shift), русские буквы вводятся в xterm и в "Утилиты/Заметки".

Клавиатура apple wireless keyboard (bt hid). Правда, я недавно обновлял magic:sys - может, где-то уже исправили.

(Reply to this)


[info]tarkhil
2007-09-25 12:31 pm UTC (link)
Класс

а как бы засунуть xkbcomp в стартап?

(Reply to this) (Thread)


[info]acideye
2008-01-04 08:30 pm UTC (link)
мне тоже интересно.
но не всё так просто - маппинг пропадает при переходе клавы в спящий режим, что равносильно отключению устройства в N8x0. приходится ещё раз запускать. по крайней мере с моей stowaway (HID обычный) на OS2008.

так что на самом деле вопрос - как запустить скрипт при появлении устройства?

(Reply to this) (Parent)


[info]phaoost
2008-08-19 07:09 am UTC (link)
спасибо, приведённая раскладка заработала на diablo без проблем на stowaway thinkoutside blackberry. только стрелки почему-то перестали работать. буду разбираться

(Reply to this)


(20 comments) - (Post a new comment)

Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…