[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: