Новы аналаг Punto Switcher для linux: xswitcher

Спыненне падтрымкі xneur выклікала ў мяне пэўныя пакуты ў апошнія паўгода (са з'яўленнем OpenSUSE 15.1 на маіх дэсктопах: пры ўключаным xneur вокны губляюць фокус і пацешна мігацяць у такт уводу з клавіятуры).

"А, блін, зноў не ў той раскладцы пачаў набіраць" - у маёй працы сустракаецца да непрыстойнасці часта. І пазітыву не дадае.

Новы аналаг Punto Switcher для linux: xswitcher
У той жа час, я (як інжынер-канструктар) магу дастаткова ясна сфармуляваць чаго хачу. А жадаў я (спачатку ад 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.

Ўдачы!

Крыніца: habr.com

Дадаць каментар