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

RSS подписка

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

Проекты / Код

C, C++, Qt

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 из исходников, необходимо в каталоге с исходниками выполнить действия, описанные в файле readme.txt. Обычно, если все зависимые библиотеки установлены, достаточно следующих команд:

 

cmake .

make

make install (от рута)

 

В результате будет создан файл /usr/sbin/loloswitcher, и ему будут установлены правильные права.

 

Если же установка происходит из архива с предкомпиленным бинарником, надо вручную скопировать бинарник loloswitcher в каталог /usr/sbin, а затем от рута назначить ему следующие права:

 

chown root:root /usr/sbin/loloswitcher

chmod u+s /usr/sbin/loloswitcher

Данные права необходимы для возможности получать прямой доступ к файлу устройства ввода.

 

 

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

 

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

 

/usr/sbin/loloswitcher

 

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

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

 

~/.config/loloswitcher/config.ini

 

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

 

 

# Input device

InputDevice=/dev/input/event0

 

# Allow waiting for device to connect at LoLo Switcher start 

# 0 - no waiting 

# 1 - waiting on (strong recommendet for KVM-switch) 

AllowWaitDeviceConnect=1 

 

# Allow device reconnection 

# 0 - disable 

# 1 - enable (strong recommendet for KVM-switch)

# Note: if you have bad USB cable (or very long nonstandart USB-cable)

# and you see trouble at dmesg, set this option to enable 

AllowDeviceReconnect=1 

 

# Device reconnection time, sec 

# Value from 0 to 10 

# If set 0, there will be high load on the system 

DeviceReconnectTime=3 

 

# 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. Однако, лучше использовать файлы устроств из каталога /dev/input/by-id, так как в этом случае устройство определяется по его идентификатору независимо от того, в какой последовательности и в какой USB-слот устройство было подключено.
  • DeviceType - тип устройства ввода. 
    0 - клавиатура,
    1 - джойстик;
  • NumberOfLayout - количество раскладок клавиатуры. Если у вас два языка (к примеру, английский и русский), то пишем 2. Если больше - пишем соответствующее число;
  • SwitchMethod - метод переключения раскладкок
    0 - циклическое переключение, одной клавишей;
    1 - прямое переключение, одна комбинация клавиш на один язык;
  • SequenceX - регулярное выражение, при срабатывании которого должно произойти переключение раскладки. Если задано циклическое переключение, то нужно задать только Sequence0. Если задано прямое переключение, нужно задать регулярку для каждой раскладки.
  • CommandX - bash-команда, которая должна срабатывать при переключении на раскладку. Команда запускается в отдельном треде, и не блокирует переключатель на время своего выполнения. Следует обратить внимание, что при любом методе переключения раскладок, команды задаются на каждую раскладку (т.е. не так как у Sequence). Если ненужно выполнять никаких команд, просто оставьте эти опции пустыми.
  • AllowWaitDeviceConnect - (начиная с v.0.39) настройка ожидания подключения устройства ввода при запуске LoLoSwitcher. Актуально для пользователей KVM, так как при включении компьютера и инициализации сеанса пользователя, устройство ввода может в системе не существовать.
  • AllowDeviceReconnect - (начиная с v.0.39) настройка возможности автоматического переподключения устройства ввода во время работы. Актуально для пользователей KVM, так как в процессе работы устройство может периодически пропадать при переключении KVM на другой компьютер.
  • DeviceReconnectTime - (начиная с v.0.39) периодичность попыток обнаружения устройства ввода, cек.

 

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

 

 

Опции командной строки

 

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

 

/usr/sbin/loloswitcher --help

 

Для версии 0.39 актуальны следующие опции:

 

-p           - show standart config file with initial settings
-t1          - run event code test
-t2          - run language layout test
-t3          - run read config test
-c fileName  - specifying the required config file

 

 

Опция -p выведет в стандартный поток текст стандартного файла настроек. Это может пригодиться при написании нового конфиг-файла.

 

Опция -t1 запустит тест, который ждет нажатий клавиш, и показывает их скан-коды.

 

Опция -t2 произведет поиск доступных раскладок клавиатуры и выведет их список на экран.

 

Опция -t3 сделает пробное считывание конфиг-файла и выведет на экран ошибки, если таковые будут обнаружены.

 

Опция -c позволяет указать конкретный конфиг-файл вместо того, чтобы LoLo Switcher искал конфигфайл в стандартных местах.

 

 

Очередь клавиатурных событий в 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 способен работать как с клавиатурой, так и с джойстиком. В комплекте с программой есть пример конфигфайла, который позволяет переключать раскладку с помощью рычага. Практического смысла в таком переключении немного, это просто демонстрация возможностей программы, которая может быть настроена на разные устройства ввода.

 

 



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

Поделиться этой страницей



Внимание!


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

 

База Xintrea (стр. 1)

База Rarrugas (стр. 1)

База Balas

База YellowRaven

База Yurons

База Lesnik757

База Shandor

База Sirrichar

База Anatolean (стр. 1)

База Аrmagedec

База SorokinRed

База Deadelf79

База Adgaver (стр. 1)

База Pipitos1983

База Soxsten (стр. 1)

База Silenn (стр. 1)

База Shlyapnikova - херомантия и ригидность

База Svoynickname (стр. 1)

База Larson227 (стр. 1)

База Velonski (стр. 1)

База BrokeRU (стр. 1)

База Mcold (стр. 1)

База Alensav (стр. 1)

База Consp11 (стр. 1)

База Kozlov-AE (стр. 1)

База Wwwlir (стр. 1)

База Duwaz (стр. 1)

 

Требуют доработки:

 

База Tairesh

База Ivnglkv

База Kolyag87

База Andyk101

База Garik456456

База Harpokrat

База SalexIzyh

База RuDennn (Bunny-Hop)

База Manakaden

База Vitvrn

База Fanrok

База Grimar

База_Juryak

База Nicolasomsk

База Azatserikbaev

База Shut913

 

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

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