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

Вариант второй - "перекрытия"


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

Эта проблема легко решилась бы, если бы могли свободно добавлять на свою клавиатуру новые кнопки (не символы, а именно - физические кнопки).

Хотя это и звучит как пустые фантазии, но не лишено смысла. Конечно, новую физическую кнопку мы на клавиатуре не сделаем, но вот скан-кодов к существующим кнопкам добавить можем.

Напомню, что если кнопка принадлежит к "группе перекрытия" (overlay), она может эмулировать нажатие другой кнопки (с другим скан-кодом), естественно, эта другая кнопка не обязана физически присутствовать на клавиатуре и може быть вполне "виртуальной". К тому же, та кнопка, которая будет эмулировать "виртуальную" не обязана заниматься этим все время. Для того, чтобы он перешла в такой режим, нужно "поднять" "управляющий флаг" Overlay1 ( или Overlay2), а все остальное время она может ваполнять свои "основные обязанности".

В свою очередь, "управляющий флаг" можно "выставить" с помощью специального "действия" (такого же как SetGroup или SetMods), причем можно сделать так, чтобы этот флаг "держался" только пока нажата соответствующая кнопка.

Итак. Давайте сначала объявим скан-коды "виртуальных" кнопок. Заглянем в файл типа xkb_keycodes (скорее всего у вас это keycodes/xfree86).

Можно заметить, что под реальные кнопки задействованы скан-коды от 9 до 120 (ну, на самом деле - даже меньше, в зависимости от типа клавиатуры).
То есть, мы для своих нужд можем спокойно взять скан-коды, например - 121, 122, 123.

Сочиним файл-"добавку" к описанию keycodes (не забудьте его "приплюсовать" к полной конфигурации в строчку, описывающую xkb_keycodes).

xkb_keycodes { <RUS1> = 121; <RUS2> = 122; <RUS3> = 123; };

(напомню, что "название скан-кода" может быть произвольное, но не длинее 4 символов).


Теперь мы можем наши "действия" убрать с реальных кнопок <FK10> - <FK12>

и "повесить" на наши виртуальные (просто поменяем названия скан-кодов) -

key <RUS1> { radiogroup=2, [NoSymbol], actions[Group1]=[ SetGroup(group=2) ] }; key <RUS2> { radiogroup=2, [NoSymbol], actions[Group1]=[ SetGroup(group=3) ] }; key <RUS3> { radiogroup=2, [NoSymbol], actions[Group1]=[ SetGroup(group=4) ] };

Дальше нам надо решить - на какие реальные кнопки мы возложим задачу эмулировать наши виртуальные клавиши.

Поскольку это никак не "ущемляет" реальную кнопку (ее основные обязанности), выбирать мы можем так - как нам будет удобнее. Можно для этого выбрать "цифровые" кнопки - 1,2,3. А можно - какие-нибудь "буквенные", например - K (koi8), A (alt), W (Windows).
Я остановлюсь на первом варианте.

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

key <AE01> { overlay1 = <RUS1>, [ 1, exclam ], [ exclam, 1 ] };

key <AE02> { overlay1 = <RUS2>, [ 2, at ], [ quotedbl, 2 ] };

key <AE03> { overlay1 = <RUS3>, [ 3, numbersign ], [ apostrophe, 3 ] };

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

Я остановлюсь на той же <MENU>.
Нам нужно "подвесить" на нее "действие" SetControls(controls=overlay1). Напомню, что это "действие" "держит" флаг только пока кнопка нажата. То есть, кнопки 1-2-3 нажатые вместе с Menu (Menu+1, Menu+2, Menu+3) будут действовать как дополнительные переключатели. А если кнопку Menu не трогать, то эти клавиши работают как обычно.

key <MENU> { [NoSymbol], actions[Group1]=[ SetControls(controls=overlay1) ]};

Все. Можно попробовать.
(Если это не будет работать, попробуйте заменить SetControls на LockControls. Естественно, в этом случае клавишу <MENU> не надо удерживать в нажатом состоянии. По первому нажатию она будет "включать" управляющий флаг overlay1

и кнопки 1-2-3 превратятся в переключатели групп, а по повторному нажатию флаг overlay1 будет "сбрасываться" и кнопки 1-2-3 вернутся к своей "основной работе").

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

Но, основные механизмы (и "подводные камни") я описал. Все остальное зависит от вашей фантазии.

Иван Паскаль pascal@tsu.ru


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