Re: русификация и переключение раскладок
George Shuklin -> Debian-russian List @ Tue, 16 Feb 2010 19:21:16 +0300:
GS> А как в X'ах работает русификация (и, вообще, любая i18n) ввода и
GS> переключение раскладок? (интересует теория процесса)
Через ж. Я, наверное, сейчас уже не найду ту статью Вани Паскаля, где
это было более-менее внятно написано.
Общая идея примерно следующая. Существует подсистема (расширение
исходного X-протокола) XKB - X keyboard extension. В принципе, она
умеет рулить настройкой не только интернационализации, но и
интерпретации клавиш - отображением скан-кода в код клавиши.
Применительно к i18n она подразумевает, что у дисплея (кажется, именно у
дисплея, а не какой-либо другой сущности) есть состояние интерпретации
нажатий на клавиши - одно из четырех, помимо привычных модификаторов
Shift, Control, Meta (на привычных нам клавиатурах обычно висит на Alt)
и т.п. Они называются группами. Нажатие на клавишу интерпретируется в
зависимости от текущей группы (и прижатых модификаторов).
Есть интерпретации "переключить на следующую группу", "переключить на
предыдущую группу", и более экзотические - я, например, для реализации
немодального переключения пользуюсь "на первую" и "на последнюю".
SwitchGroup тоже есть - относится к LockGroup так же, как Shift к
CapsLock, но если шифтом пользуются часто, то SwitchGroup - редко. Эти
интерпретации, как и любые другие, можно вешать на разные клавиши в
разных сочетаниях с модификаторами.
Дальше проще не объяснять теорию, тем более что я в ней "плаваю", а
предложить тебе запустить xev и понажимать клавиши в разных раскладках и
клавиши переключения. И посмотреть, что творится.
Ну а дальше - просто. Есть (в /etc/X11/xkb/symbols) файлы, описывающие
интерпретации по группам. Файл ru укладывает во вторую группу
кириллицу. Файл group, указывающий, на какую комбинацию клавиш повесить
переключение групп. В каждом файле предусмотрено несколько разных
вариантов (так, в ru предусмотрена раскладка "по пишмашинкам" (оно же
клавиатуры времен DOS) и winkeys - соответственно виндовой раскладке.
Пунктуация в русской раскладке расположена по-разному. В group есть
несколько вариантов развески событий переключения групп, из которых
обычно выбирают один по вкусу).
Дальше берем setxkbmap и комбинируем...
Если хочется иметь свою раскладку в каждом окне, то для этого существует
несколько инструментов, которые все действуют, насколько я знаю, по
единой схеме: они вешаются на события типа map/unmap/enter/leave,
запоминают текущую группу при потере фокуса окном и восстанавливают ее
при получении фокуса. Может быть, некоторые при этом еще меняют
содержимое группы (т.е. не просто шлют событие смены группы, а еще и
меняют ее содержимое - это позволяет превысить предел в 4 группы, хотя я
не знаю живых людей, пользующихся более чем тремя). Они различаются
набором функциональности, вокруг этого наверченной. Сам я пользуюсь
xxkb, и типа являюсь его дебиановским мейнтейнером.
Ах, да. XKB дает на выходе т.н. symbol. Cyrillic_ge или что-то в этом
роде. Это, если я правильно ошибаюсь, int. Ну, или long, короче, 4
байта. Xlib преобразует его в строку сообразно текущей локали.
--
Современной называется технология, которую пытаются совать во все дырки
независимо от того, заточена она под них или нет.
Д. Белявский
Reply to: