Настройка и работа в Linux
adb5321d

Вариант первый - "выделенные скан-коды"


Возьмем за основу метод, рассмотренный в предыдущих примерах - две переменные для номера группы.

Пусть у нас дополнительная переменная (например - base group) хранит номер альтернативной группы. Забудем пока про "гнусное поведение" base group (что она хранит значение только пока нажата соответствующая клавиша).

Тогда пусть основной переключатель манипулирует значением в locked group.
Он должен

  • для выбора "одной из рус" просто "обнулить" locked group
  • для "возвращения" в "лат" записать в locked group подходящую "добавку".

Для вычисления "добавки" на время перейдем к "внутренним представлениям номера группы" - 0,1,2...
Тогда

  • группа "лат" - 0
  • первая "рус" - 1
  • вторая "рус" - 2
  • третья "рус" - 3
  • максимальное значение номера группы - 3

"Добавки"

  • если текущая группа - 0, "добавка" - 0
  • если текущая группа - 1, "добавка" - 3
  • если текущая группа - 2, "добавка" - 2
  • если текущая группа - 3, "добавка" - 1

Возвращаясь к обозначениям групп из "конфигов", описание клавиши - основного переключателя получится

key <CAPS> { [NoSymbol], [NoSymbol], [NoSymbol], [NoSymbol], actions[Group1]=[ LockGroup(group=1) ], actions[Group2]=[ LockGroup(group=4) ], actions[Group3]=[ LockGroup(group=3) ], actions[Group4]=[ LockGroup(group=2) ] };

Все хорошо. Но что нам делать с дополнительным переключателем (переключателями)?

Давайте сформулируем - как должны работать наши переключатели.
Итак, у нас три кнопки, каждая включает свою "рус". Поскольку они должны сохранять соответствующие значения в base group, мы должны повесить на них "действия" SetGroup (с подходящим аргументом). Естественно, поскольку base group "держит" значение только пока нажата соответствующая клавиша, наши кнопки должны быть "залипающими". Но при этом...

Если мы нажали кнопку, ответственную за первую "рус", она должна записать свое значение в base group и "залипнуть". Если мы после этого нажмем кнопку, отвечающую за вторую "рус", она должна


  • "отлепить" "залипшую" кнопку
  • выполнить свое "действие"
  • и, в свою очередь, "залипнуть".


Аналогично должна работать и третья кнопка (из дополнительных переключателей).

Но то, что я только что описал, точь в точь описывает поведение кнопок, принадлежащих одной "радио-группе".

Ну и отлично! Объединим наши три дополнительных переключателя в радио-группу, подвесим на них SetGroup с соответствующими аргументами, и... все.

Однако, "засада" в этом решении (как же без "засады"?) в том, что "залипает" именно клавиша (скан-код), а не отдельное ее "действие" (или символ). То есть, нам понадобятся три кнопки, которые будут использоваться только для этих целей и ни для чего больше, поскольку, даже если мы и "подвесим" на них еще какие-нибудь символы (ну, например, на другой shift level), то воспользоваться ими все равно не сможем. Так как -


  • кнопка будет "залипать" в любом случае, независимо от того - какая группа и уровень выбраны;
  • если уж она "залипла", то использовать ее, пока не "отлипнет", невозможно.


Итак. Нам придется выделить на клавиатуре три кнопки, которые будут только переключателями "альтернативных" "русских" групп и ничем больше.
(Не огорчайтесь, потом мы это ограничение снимем :-)

Я предлагаю взять кнопки F10, F11, F12. Они стоят рядом и используются сравнительно редко.

Можно составлять их описание (это скан-коды <FK10>,<FK11>,<FK12>)

key <FK10> { radiogroup=2, [NoSymbol], actions[Group1]=[ SetGroup(group=2) ] }; key <FK11> { radiogroup=2, [NoSymbol], actions[Group1]=[ SetGroup(group=3) ] }; key <FK12> { radiogroup=2, [NoSymbol], actions[Group1]=[ SetGroup(group=4) ] };

Обратите внимание, что номер радио-группы должен быть больше единицы. Вообще-то, это "баг" XKB, тем более неприятный, что xkbcomp не будет "возражать" если вы объявите радио-группу номер 1, а вот X-сервер потом "сдуреет".

Теперь можно пробовать.
Надо заметить, что есть еще одно маленькое неудобство. В самом начале, пока еще не нажата ни одна из кнопок радио-группы, получается, что ни одна из альтернативных "рус" раскладок не выбрана и основной переключатель не будет ничего переключать.

Но после первого же нажатия одного из "дополнительных переключателей" все будет работать как задумано. (Если не считать того, что опять же - менять номер альтернативной группы надо только тогда, когда основной переключатель находится в положении "рус". Иначе результаты получаются не очень приятные).


Содержание раздела