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 преобразует его в строку сообразно текущей локали. -- Современной называется технология, которую пытаются совать во все дырки независимо от того, заточена она под них или нет. Д. Белявский -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/21012...@tigger.lan.cryptocom.ru