Спыненне падтрымкі xneur выклікала ў мяне пэўныя пакуты ў апошнія паўгода (са з'яўленнем OpenSUSE 15.1 на маіх дэсктопах: пры ўключаным xneur вокны губляюць фокус і пацешна мігацяць у такт уводу з клавіятуры).
"А, блін, зноў не ў той раскладцы пачаў набіраць" - у маёй працы сустракаецца да непрыстойнасці часта. І пазітыву не дадае.
У той жа час, я (як інжынер-канструктар) магу дастаткова ясна сфармуляваць чаго хачу. А жадаў я (спачатку ад Punto Switcher, а затым, дзякуй Windows Vista, канчаткова перасеўшы на Linux, ад xneur) роўна аднаго. Усвядоміўшы, што на экране бязглуздзіцы не ў той раскладцы (такое звычайна здараецца ў канцы набору новага слова), тупнуць па "Pause/Break". І атрымаць тое, што друкаваў.
На дадзены момант выраб мае аптымальнае (з пункту гледжання мяне) дачыненне функцыянальнасць/складанасць. Час дзяліцца.
TL.DR
Далей пойдуць усякія тэхнічныя падрабязнасці, таму спачатку - спасылка «на пакратаць» для нецярплівых.
На дадзены момант захардскурана наступныя паводзіны:
"Pause/Break": забівае (Backspace) апошняе слова, перамыкае раскладку ў актыўным акне (паміж 0 і 1) і набірае яшчэ раз.
"Левы Ctrl без нічога": перамыкае раскладку ў актыўным акне (паміж 0 і 1).
"Левы Shift без нічога": уключае ў актыўным акне раскладку №0.
"Правы Shift без нічога": уключае ў актыўным акне раскладку №1.
З гэтага моманту я планую кастамізаваць паводзіны. Без зваротнай сувязі - не цікава (мяне і так задавальняе). Мяркую, на Хабры знойдзецца дастатковы працэнт аўдыторыі з аналагічнымі праблемамі.
NB Т.к. у бягучай версіі кейлоггер прыкручваецца да "/dev/input/", xswitcher павінен запускацца з рутавымі правамі:
chown root:root xswitcher
chmod +xs xswitcher
Звярніце ўвагу: уладальнікам файла з suid павінен быць root, т.я. хто ўладальнік - у таго suid і ператворыць пры запуску.
Параноікі (я не выключэнне) могуць кланаваць з GIT і сабраць на месцы. Прыкладна так:
go get "github.com/micmonay/keybd_event"
go get "github.com/gvalkov/golang-evdev"
### X11 headers for OpenSUSE/deb-based
zypper install libX11-devel libXmu-devel
apt-get install libx11-dev libxmu-dev
cd "x switcher/src/"
go build -o xswitcher -ldflags "-s -w" --tags static_all src/*.go
Аўтазапуск дадаваць па гусце (у залежнасці ад DE).
Працуе, "кашы не просіць" (≈30 секунд CPU у суткі, ≈12 МБ у RSS).
Падрабязнасці
Цяпер - падрабязнасці.
Увесь рэпазітар першапачаткова быў прысвечаны майму пет-праекту, а іншы заводзіць - пакуль лянота. Так што, усё звалена ў кучу (проста па тэчках) і накрыта AGPL ("патэнт наадварот").
Код xswitcher напісаны на golang, з мінімальнымі ўкрапінамі C. Мяркуецца, што такі падыход дасць найменшыя працавыдаткі (пакуль так і ёсць). Захоўваючы магчымасць падлучаць недастатковае з дапамогай cgo.
Па тэксце раскладзены каментары, адкуль чаго запазычыў і навошта. Т.к. код xneur мяне «не натхніў», за адпраўную кропку ўзяў loloswitcher.
Выкарыстанне "/dev/input/" мае як свае плюсы (усё відаць у т.л. заціснутую клавішу з аўтапаўторам), так і мінусы. Мінусы такія:
Аўтапаўтор (падзеі з кодам "2") не карэлюе з паўторам з іксах.
Не відаць уводу праз інтэрфейсы X11 (так напрыклад VNC працуе).
Патрэбны рут.
З іншага боку, можна падпісвацца на падзеі X праз "XSelectExtensionEvent()". Падглядзець можна ў кодзе xinput. Для go нічога падобнага не знайшоў, а чарнавая рэалізацыя дала з ходу сотню радкоў C-кода. Пакуль адклаў убок.
Выснова «зваротна» пакуль зроблена праз прыкручванне віртуальнай клавіятуры. Дзякуй аўтару keybd_event, але там занадта высокаўзроўневая абстракцыя і далей давядзецца перарабляць. У мяне, напрыклад, правая Win-клавіша 3-й шэраг выбірае. А зваротна транслюецца толькі левая Win.
Вядомыя памылкі
Нічога не ведаем пра "кампазітны" увод (прыклад: ½). Прама зараз яно не патрэбна.
Няправільна прайграваем правую Win. У маім выпадку ламае расстаноўку акцэнтаў.
Няма выразнага разбору ўводу. Замест гэтага - некалькі функцый: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Дзякуй nsmcan за ўважлівасць: выправіў у кодзе і тут. З пэўнай верагоднасцю можна адхапіць багі пры замене. У гэтым месцы я не ведаю "як трэба" і буду рады любым прапановам.
(Аб жах) канкурэнтнае выкарыстанне каналаў (keyboardEvents, miceEvents).
Заключэнне
Код - найпросты працэдурны. І туп як я. Так што, цешу сябе надзеяй, што дапісаць жаданае зможа практычна любы тэхнар. І дадзены выраб дзякуючы гэтаму не згіне без падтрымкі падобна большасці just-for-fun.