Собираем
информацию
по крупицам

C / C++

LoLo Switcher. Полное руководство по конфигурированию
07-09-2011
14:53:00

Это полное руководство к переключателю клавиатуры LoLo Switcher для оконной среды X11. Скачать переключатель можно на официальной странице LoLo Switcher.

 

 

Зачем нужен еще один переключатель клавиатуры?

 

Я никогда бы не стал тратить время на написание еще одного переключателя клавиатуры под Linux, если б существущие переключатели имели возможность настройки нужного мне поведения. К сожалению, ни стандартные переключатели в GNOME и KDE, ни продвинутый переключатель XNeur не имеют возможности настроить реакцию на отжатие клавиши (а это иногда бывает необходимо) и не имеют возможности настроиться на экзотические комбинации клавиш так, чтобы не ловить побочные эффекты при использовании клавиш-модификаторов.

 

Исторически так сложилось, что я не люблю "кольцевые" переключатели языка, и когда есть возможность, переключаю язык с помощью левого и правого SHIFT-а. Такое переключение, с помощью соответствующих программ, легко настраивается в DOS и Windows, но только не в Linux.

 

Как работает переключение раскладки по SHIFT? Левый SHIFT отвечает за переключение на английскую раскладку, правый SHIFT переключает на русскую раскладку. А как же тогда печатать большие буквы? А как же использовать другие комбинации, где есть клавиша SHIFT? Тут работают следующие правила. Во-первых, переключение происходит при отжатии клавиши SHIFT. Во-вторых, переключение языка срабатывает только тогда, когда нажатие на клавишу левого или правого SHIFT-а "чистое". То есть, переключатель должен отслеживать, что бы пока нажата клавиша SHIFT, не нажимались другие клавиши. Так же нужно отслеживать, чтобы SHIFT не зажимался с какими-нибудь другими клавишами-модификаторами.

 

Ни один из существующих переключателей X11, в силу многих причин, невозможно настроить на такое поведение. Да и на удовлетворение других экзотических условий тоже. Поэтому я решил написать такой переключатель, который можно было бы настроить на любое устройство ввода, на любую комбинацию действий с любой логикой срабатывания. На текущий момент в качестве устройств ввода поддерживаются клавиатуры и джойстики (на случай, если захочется переключать языки педалью или рычагом).

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

 

 

Запуск и конфигурирование LoLo Switcher

 

LoLo Switcher следует запускать от пользователя, который в данный момент загеристрирован в X-системе. Для запуска используется команда:

 

/usr/sbin/loloswitcher

 

Эту команду нужно прописать в секции автостарта оконной среды (для KDE4 это "Параметры системы" -> "Дополнительные параметры" -> "Автозапуск"). Или можно прописать эту команду в файл ~/.xprofile.

Конфигфайл располагается по следующему пути:

 

~/.config/loloswitcher/config.ini

 

Он автоматически создается при первом запуске. Типичное содержимое конфига следующее:

 

# Input device
InputDevice=/dev/input/event0

# Type of device
# 0 - keyboard
# 1 - joystick
DeviceType=0

# Total number of language layout
NumberOfLayout=2

# Language switch method
# 0 - cyclic switch
# 1 - direct switch
SwitchMethod=1

# Codes for switch language layouts
# If you use cyclic switch method, set variable Sequence0 only.
# If you use direct switch method, set variable SequenceX
# for each layout (numeric from 0).
Sequence0=1,42,1;1,42,0;$
Sequence1=1,54,1;1,54,0;$

# Bash command if language layout switched (optional)
# Set CommandX for each layout (numeric from 0).
Command0=beep -f 440 -l 25
Command1=beep -f 520 -l 25

 

Кратко, что означают опции:

  • InputDevice - имя файла устройства ввода. Клавиатура обычно привязана к файлу /dev/input/event0, джойстик - /dev/input/js0;
  • DeviceType - тип устройства ввода. 
    0 - клавиатура,
    1 - джойстик;
  • NumberOfLayout - количество раскладок клавиатуры. Если у вас два языка (к примеру, английский и русский), то пишем 2. Если больше - пишем соответствующее число;
  • SwitchMethod - метод переключения раскладкок
    0 - циклическое переключение, одной клавишей;
    1 - прямое переключение, одна комбинация клавиш на один язык;
  • SequenceX - регулярное выражение, при срабатывании которого должно произойти переключение раскладки. Если задано циклическое переключение, то нужно задать только Sequence0. Если задано прямое переключение, нужно задать регулярку для каждой раскладки.
  • CommandX - bash-команда, которая должна срабатывать при переключении на раскладку. Команда запускается в отдельном треде, и не блокирует переключатель на время своего выполнения. Следует обратить внимание, что при любом методе переключения раскладок, команды задаются на каждую раскладку (т.е. не так как у Sequence). Если ненужно выполнять никаких команд, просто оставьте эти опции пустыми.

При запуске LoLo Switcher нет необходимости отключать системный переключатель раскладки. LLS способен работать параллельно с другими переключателями. По-умолчнию LLS настроен на два языка, переключение происходит с помощью левого и правого SHIFT, в момент переключения издается звуковой сигнал разного тона (если в системе есть программа beep).

 

 

Очередь клавиатурных событий в LoLo Switcher

 

Для того, чтобы можно было настроить LoLo Switcher на нужную комбинацию клавиатурных (или других) событий, в первую очередь нужно знать коды этих событий. LoLo Switcher имеет специальный сервисный режим, который показывает коды событий при нажатии клавиш.

Для определения кодов событий, дайте команду:

 

/usr/sbin/loloswitcher -t1

 

Каждое событие кодируется следущим шаблоном: "a,b,c;". Где a - это тип события, b - код клавиши, c - состояние клавиши. На самом деле, нам совершенно не важно, какие числа имеет то или иное событие. Нам важна сама строка "a,b,c;" которую и следует рассматривать как отдельный элемент в очереди событий.

Очередь событий представляет собой строку из 16 таких элементов. Более старые по времени элементы находятся левее, более новые - правее. Текущее событие является самым правым элементом. При получении нового события очередь сдвигается влево, а в самую правую позицию добавляются новые элементы.

 

 

Фильтр событий в LoLo Switcher

 

Любое устройство ввода на низком уровне генерирует множество событий. Например, клавиатура общается с компьютером не только посредством передачи сканкодов. Она способна получать от компьютера команды настройки своего PIC контроллера, отвечать подтверждениями на эти команды, клавиатура выдает пакет данных при включении того или иного светодиода, использует пакеты синхронизации. Чтобы увидеть, какие события возможны у клавиатуры, можно дать команду от рута:

 

# evtest /dev/input/event0

 

Ясно, что нет никакого смысла складывать в нашу очередь событий все события устройства. Касательно клавиатуры, имеет смысл складывать только события нажатия-отжатия-удерживания клавиш. Тогда вычленять нужные последовательности из очереди будет намного легче.

Откроем конфигфайл, найдем переменную EventFilter и сделаем ее пустой или закомментируем, вот так:

 

EventFilter=

 

Удалим процесс программы LoLo Switcher, если он запущен. Запустим тест:

 

/usr/sbin/loloswitcher -t1

 

Нажимая клавиши можно увидеть, что на каждую клавишу генерируется минимум шесть событий. Например, нажав клавишу "a" можно увидеть:

 

...
[4]: 4,4,30;
[5]: 1,30,1;
[6]: 0,0,0;
[7]: 4,4,30;
[8]: 1,30,0;
[9]: 0,0,0;
...

 

Видно, что мы имеем дело с кодами, которые можно назвать "Начало передачи" - 4,4,30; и "Конец передачи (Синхронизация)" - 0,0,0;. Но нас они не интересуют, нам важны только коды нажатия и отжатия клавиши - 1,30,1; и 1,30,0;. Поэкспериментировав с другим клавишами, можно убедиться, что коды нажатия-отжатия-удерживания имеют первое число "1".

Используя регулярное выражение:

 

^1,[0-9]+,[0-9]+;$

 

мы получим только коды, начинающиеся на 1. Эту регулярку и нужно прописать в конфиг-переменную EventFilter.

 

Переменная EventFilter задает фильтрующее регулярное выражение. Она определяет, какие коды будут пропущены в очередь. Все прочие коды будут беспощадно отброшены.

 

 

Последовательности для переключения раскладки

 

Приведем пример, как конструируются регулярные выражения в LoLo Switcher, которые отвечают за переключение раскладки. Эти выражения задаются в конфигфайле, в переменных SequenceX.

 

При составлении регулярных выражений следует учитывать, что используются регулярные выражения Perl в том виде, в котором они поддерживаются библиотекой PCRE (эта же библиотека используется, например, в языке PHP). Регулярное выражение следует писать без начального и конечного слеша "/".

 

Поставим себе задачу: сделать выражение, которое бы срабатывало при "чистом" отжатии правого SHIFT. Чистое - это значит чистый "тык", без дополнительных клавиш, и без удерживания нажимаемой клавиши.

 

Вначале, с помощью опции -t1, нужно исследовать, какие коды генерирует клавиатура при использовании клавиши правого SHIFT-а. (Предполагается, что значение фильтра EventFilter=^1,[0-9]+,[0-9]+;$ ). Можно увидеть следующие коды:

  • 1,54,1; - Нажатие клавиши SHIFT
  • 1,54,0; - Отжатие клавиши SHIFT
  • 1,54,2; - Удерживание клавиши SHIFT

Коль у нас стоит задача срабатывать при отжатии SHIFT, мы могли бы ограничиться таким регулярным выражением:

 

1,54,0;$

 

где "$" - это символ конца строки, то есть данный шаблон будет прижиматься к правому краю очереди, чтобы обработать самый актуальный код.

Если запустить LoLo Switcher с таким шаблоном, то увидим, что переключение раскладки действительно срабатывает при отжатии правого SHIFT. Но нам нужно срабатывание на отжатие при "чистом" тыке по клавише. А если мы нажмем и станем удерживать SHIFT, то при такой регулярке срабатывание произойдет независимо от того, был ли чистый "тык", или клавиша долго удерживалась.

Рассмотрим подробнее. При простом "чистом" тыке по правому SHIFT, клавиатуда даст такие коды:

 

1,54,1;

1,54,0;

 

А при нажатии и удерживании клавиши правого SHIFT-а, клавиатура даст такие коды:

 

1,54,1;

1,54,2;

...

1,54,2;

1,54,0;

 

Очевидно, что коль нам нужно настроить срабатывание на "чистый" тык, то регулярка должна выглядеть так:

 

1,54,1;1,54,0;$

 

Но и это еще не всё. Часто бывает так, что нажатию на клавишу SHIFT предшествует нажатие клавиши-модификатора CTRL или ALT. Вышеуказанная регулярка сработает тупо в тот момент, когда будет сделан тык по правому SHIFT, независимо от того, зажат при этом какой-то модификатор или нет.

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

Для написания условия "не (код или код или код ...)", можно воспользоваться хитрой возможностью в регурярках, которая называется "негативная ретроспективная проверка" или, в другой терминологии "отрицательный (негативный) просмотр назад". Например, в Perl-регулярках, чтобы обозначить строки, не соответствующие "A", "BC", "DEF", можно применить такое выражение:

 

(?<!A|BC|DEF)

 

Зная это, вначале нужно выяснить коды нажатия и удерживания правых и левых CTRL и ALT, и записать их соответствующим образом. В результате получится такая регулярка:

 

(?<!1,29,1;|1,29,2;|1,97,1;|1,97,2;|1,56,1;|1,56,2;|1,100,1;|1,100,2;)1,54,1;1,54,0;$

 

Эту регулярку можно вписать в опцию Sequence0, и если настроено циклическое (т.е. по кругу) переключение раскладок, то переключение будет происходить при отжатии правого SHIFT-а. Причем, если SHIFT был нажат с предварительным удерживанием CTRL или ALT, переключение раскладки срабатывать не будет.

Можно и дальше усложнять регулярку, но для практических целей вполне достаточно и такого выражения.

 

UPD: Для примера приведу готовую регулярку для переключения по Ctrl+Shift.


Данная регулярка работает при отпускании клавиш. Реагирует как на Ctrl+Shift, так и на Shift+Ctrl, с любым отпусканием - хоть Ctrl вначале отпускай, хоть Shift.

 

(?<!1,29,1;|1,29,2;|1,97,1;|1,97,2;|1,56,1;|1,56,2;|1,100,1;|1,100,2;)(1,29,1;(1,29,2;)*1,42,1;(1,42,2;)*|1,42,1;(1,42,2;)*1,29,1;(1,29,2;)*)(1,42,0;(1,29,2;)*1,29,0;|1,29,0;(1,42,2;)*1,42,0;)$

 

Кстати, нужно не забывать отключать системную переключалку, если она на Ctrl+Shift повешена, или переконфигурировать ее на другое сочетание, чтобы небыло конфликта с LoLo Switcher.

 

 

Заключение

 

Переключатель LoLo Switcher способен работать как с клавиатурой, так и с джойстиком. В комплекте с программой есть пример конфигфайла, который позволяет переключать раскладку с помощью рычага. Практического смысла в таком переключении немного, это просто демонстрация возможностей программы, которая может быть настроена на разные устройства ввода.

 

 


К списку проектов

Интересное на сайте


KDE 4 » Классическая тема оформления Redmond 125% для KDE 4

Мне часто приходится работать как в Linux, так и в Microsoft Windows. Моторные навыки наработаны годами, и для быстрой и точной работы необходимо имет...


Система контроля версий GIT » Как перенести локальный GIT-репозитарий на сервер вместе со всей историей

Разработка с применением GIT обычно начинается с того, что вначале программист держит локальный GIT репозитарий на своей рабочей машине, и ежедневно к...


Юмор » ЛОР. Призрак в опере? Нет проблем, обеспечим!

Да! ЛОР снова торт. Если кто еще не знает, 9 октября 2011 года усилиями однозвёздного пользователя bk_ стартовала Гитарная Битва Луноходов.   На...

RSS подписка

Подпишитесь на новости сайта по RSS


http://www.alsena.ru/service/moving/ грузвоз заказать офисный переезд.

Внимание!

На этом сайте разрабатывается программа MyTetra и её родственные проекты.

Доступны к просмотру следующие базы знаний:

База Xintrea (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18)

База Rarrugas (1, 2)

База Balas

База YellowRaven

База Yurons

База Lesnik757

База Shandor

База Sirrichar

 

Подробности на странице MyTetra Share.

 WebHamster.Ru
 Домик любопытного хомячка
Яндекс индекс цитирования
Почтовый ящик