О чем речь.
Как известно, есть множество способов настроить переключение раскладки
клавиатуры. На разном уровне. Мне был нужен способ, использующий xkb
(та штука, которая настраивается в XF86Config).
Кто не помнит/не знает, способ заключается в следующем:
В файле /etc/X11/XF86Config (или XF86Config-4 для четвертой версии
иксов) пишем
Section "InputDevice"
[skip]
Option "XkbRules" "xfree86"
Option "XkbModel" "pc105"
Option "XkbLayout" "ru(winkeys)"
Option "XkbOptions" "grp:ctrl_shift_toggle"
EndSection
Строчка "XkbOptions" "grp:ctrl_shift_toggle" задает клавиши для
переключения (в данном случае Control+Shift).
Метод совершенно "железный", но.. настоящий Граблеискатель всегда
найдет грабли :)
Проблема номер раз.
При использовании в качестве window system KDE этот метод почему то не
срабатывает.
Чтобы он заработал, нужно в Control Center KDE включить графический
переключатель раскладок - kxkb и хотя бы один раз переключиться на
русский язык и набрать хотя бы одну букву. После этого начинает
работать и метод через xkb. Переключалка через kxkb тоже не перестает
работать, т.е. имеем одновременно два метода переключения, хотя
индикатор в трее показывает состояние только kxkb (что раздражает :).
Почему бы в таком странном случае не использовать метод kxkb ? Да
тормозит он.. После нажатия сочетания клавиш реально другие буквы
начинают набираться только через пару-тройку секунд, что очень мешает.
Кроме того, на него нельзя назначить такие сочетания, как
Control+Shift или просто Control или что то подобное. Только с какой
то буквой (по умолчанию Control+Alt+K).
Проблема номер два.
После того, как мы решаем проблему номер раз, вылезает еще одна
(возможно, только на Mandrake дистрибутивах)
Клавиша с флажком на клавиатуре начинает работать, как в Windows, т.е.
раскрывает меню Пуск. В то время как мне, например, удобнее
использовать ее как еще один Modifier key, аналогичный Conrol, Shift и
Alt.
Т.е. что-то переназначает ее код с META_L на F13.
Проблема номер три.
Честно говоря, не люблю я вообще индикаторы текущей раскладки. Просто
не люблю, без комментариев. Мне (подчеркиваю - _мне_) удобнее другой
вариант - когда у меня для переключения в конкретную раскладку
назначено отдельное сочетание клавиш. Как в DOS. Левый Control+Shift -
английские буквы, правый - русские буквы. В этом случае мне не надо
думать, какая у меня раскладка текущая - я нажимаю тот ключ, который
нужен и получаю требуемую раскладку независимо от того, что было
текущим.
Решение.
Решения для этих проблем были найдены с помощью Ивана Паскаля, на чьем
сайте можно найти очень подробную информацию о работе xkb и вообще об
особенностях национальных настроек юниксов :)
http://pascal.tsu.ru/
http://old-www.tsu.ru/~pascal/
(BTW, перед тем, как всерьез бодаться с локализацией в любом ее
проявлении, _очень_ рекомендую на этот сайт заглянуть и хотя бы по
диагонали просмотреть, возможно часть проблем уже будет решена.)
Проблема номер раз.
Не вдаваясь в подробности, _как_ было найдено решение, рассказываю, в
чем "корень зла".
KDE - штука достаточно умная. Если ее запустить, пока никаких настроек
по части локализации на уровне иксов сделано не было, она по умолчанию
активизирует свой метод, т.е. загружает kxkb и создает для него файл
конфигурации по умолчанию. Поскольку она не может знать, какой именно
еще язык, кроме английского, может понадобится, в kxkb активизируется
только английская раскладка. Поскольку раскладка только одна, то
индикатор в трее не показывается (чего там индицировать, если и так
выбор однозначный). Естественно, что по этой же причине не срабатывает
и переключение раскладки, т.е. оно срабатывает, но в списке раскладок
только одна и она все время и становится текущей. Почему в этом случае
не срабатывает переключение через xkb - другой вопрос, но он нас не
интересует в данном случае.
В данной ситуации нам интересно, как же сделать все таки переключение
раскладок. И у нас есть два пути - донастроить kxkb (т.е. добавить
туда нужную нам альтернативную раскладку через KDE Control Center) или
наоборот отключить его совсем, чтобы заработал xkb переключатель.
Если мы попытаемся через KDE Conrol Center просто отключить kxkb, то
он вернется в состояние "одна раскладка, индикатор отсутствует". Чтобы
все таки _отключить_ его по настоящему надо стереть (или
переименовать) файл конфигурации kxkb:
~/.kde/share/config/kxkbrc
Перегружаем KDE и теперь переключение через xkb работает.
В том случае, когда мы запустили для пользователя KDE первый раз при
уже настроенном xkb этого глюка просто не возникнет и метод через xkb
будет работать сразу.
Проблема номер два.
Чтобы найти, кто делает переназначение с META_L на F13 был написан
такой скрипт:
#!/bin/sh
ps -ef >> /tmp/spy
echo "===============" >> /tmp/spy
echo $* >> /tmp/spy
echo "---------------" >> /tmp/spy
cat - >> /tmp/spy
И все это чудо под именем xmodmap было подсунуто в систему вместо
настоящего xmodmap.
Потом, после перезапуска KDE, виновник был найден :)
Из скрипта /usr/bin/startkde вот таким образом
[skip]
# Dadou - 2.1.1-4mdk - To be able to use the Windows key to open the K menu
# laurent kde 2.2-22mdk test windows-key
/usr/bin/test-windows-key
[skip]
вызывается скрипт такого вида:
/usr/bin/test-windows-key
#!/bin/sh
if [ -e /etc/sysconfig/keyboard ]; then
export toto=$(grep "DISABLE_WINDOWS_KEY=yes" /etc/sysconfig/keyboard)
if [ -z $toto ]; then
xmodmap -e `keycode 115=F13`
xmodmap -e `keycode 117=Menu`
fi
fi
А в файле /etc/sysconfig/keyboard этот ключ само собой установлен в NO
(ведь мы же хотим, чтобы эти клавиши _работали_, не так ли ? :)
Что делать дальше - понятно (вариантов несколько, на выбор :)
Ну и наконец решение проблемы номер три.
Подробности о том, почему оно так работает, лучше почитать на сайте
Ивана Паскаля, более подробно это рассказать сложно :)
Решение же заключается в том, что в файле описания ключей переключения
мы меняем тип смены раскладки с типа "предыдущая/следующая" на тип
"первая/последняя". Естественно, что этот метод применим только если у
нас только две рараскладкиесли больше - то он не позволит выбирать
"средние" между первой и последней.
Итак. В файле /usr/X11R6/lib/X11/xkb/symbols/group ищем наш
переключатель (у меня это ctrl_shift_toggle) и меняем все
ISO_Next_Group на ISO_Last_Group, а ISO_Prev_Group на ISO_First_Group.
Сохраняем файл, рестартуем иксы и теперь мы можем переключиться на
английскую раскладку левым сочетанием клавиш, а на русскую - правым. И
никак иначе :)
(c) White Unicorn
Любая часть этого документа может быть скопирована любым из
существующих способов :)
(Но если вы оставите в форуме (http://whiteunicorn.dax.ru/cgi-bin/forum.pl?act=view)
свои замечания по поводу успешного / неуспешного применения солюшена,
то это будет совсем хорошо :)