Zastavenie podpory xneur mi v posledných šiestich mesiacoch spôsobilo určité utrpenie (s príchodom OpenSUSE 15.1 na mojich desktopoch: pri zapnutom xneur okná strácajú zaostrenie a zábavne blikajú v rytme s vkladom z klávesnice).
„Ach, sakra, zase som začal písať v nesprávnej klávesnici“ — v mojej práci sa to stáva nepríjemne často. A nepridáva to pozitívum.

Zároveň (ako inžinier) som schopný dosť jasne formulovať, čo chcem. A chcel som (najprv od Punto Switcher, a potom, vďaka Windows Vista, definitívne prechod na Linux, od xneur) presne jedno. Uvedomiť si, že na obrazovke je nezmysel v nesprávnej klávesnici (to sa zvyčajne stáva na konci písania nového slova), dupnúť na „Pause/Break“. A dostať to, čo som písal.
Momentálne má produkt optimálny (z môjho pohľadu) pomer funkčnosti/komplexnosti. Je čas zdieľať.
TL.DR
Ďalej prídu rôzne technické podrobnosti, takže najprv — pre netrpezlivých.
Momentálne je zakódované nasledovné správanie:
- „Pause/Break“: vymaže (Backspace) posledné slovo, prepne klávesnicu v aktívnom okne (medzi 0 a 1) a píše znovu.
- „Ľavý Ctrl bez ničoho“: prepne klávesnicu v aktívnom okne (medzi 0 a 1).
- „Ľavý Shift bez ničoho“: zapne v aktívnom okne klávesnicu č. 0.
- „Pravý Shift bez ničoho“: zapne v aktívnom okne klávesnicu č. 1.
Od tohto momentu plánujem prispôsobiť správanie. Bez spätnej väzby — nie je to zaujímavé (mňa to uhrádza). Predpokladám, že na Habré sa nájde dostatočné percento publika s podobnými problémami.
N.B. Keďže v aktuálnej verzii je keylogger pripojený k "dev/input/", xswitcher by mal byť spustený s právami roota:
chown root:root xswitcher
chmod +xs xswitcherVšimnite si: vlastníkom súboru s suid by mal byť root, keďže kto je vlastníkom — toho suid premení pri spustení.
Paranoici (ja nie som výnimkou) môžu klonovať z a zostaviť na mieste. Približne takto:
go get "github.com/micmonay/keybd_event"
go get "github.com/gvalkov/golang-evdev"
### X11 hlavičky pre 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
Autospustenie pridať podľa chuti (v závislosti od DE).
Funguje, „nežerie“ (≈30 sekúnd CPU denne, ≈12 MB v RSS).
Podrobnosti
Teraz — podrobnosti.
Celý repozitár bol pôvodne venovaný môjmu pet-projektu a zakladať ďalší sa mi zatiaľ nechce. Takže všetko je hromadne zhodené (len v priečinkoch) a pokryté AGPL („opatrenie v opačnom prípade“).
Kód xswitcher je napísaný v golangu s minimálnymi vkladmi C. Predpokladá sa, že tento prístup prinesie najmenšie pracovné náklady (doteraz to platí). Zachováva možnosť pripojiť chýbajúce prostredníctvom cgo.
V texte sú rozložené komentáre, odkiaľ čoho som si požičal a prečo. Keďže kód xneur ma „neinšpiroval“, vzal som si za východiskový bod .
Používanie "/dev/input/" má svoje výhody (všetko je viditeľné vrátane stlačenej klávesy s opakovaním), ale aj nevýhody. Nevýhody sú také:
- Opakovanie (udalosti s kódom „2“) nie je korelované s opakovaním v Xoch.
- Nie je viditeľný vstup cez rozhrania X11 (tak napríklad VNC funguje).
- Potrebujete root.
Na druhej strane, je možné sa prihlásiť na udalosti X cez „XSelectExtensionEvent()“. Môžete sa pozrieť do Pre go som nič podobné nenašiel a predbežná implementácia dala hneď sto riadkov C-kódu. Zatiaľ som to odložil nabok.
Výstup „späť“ je zatiaľ uskutočnený prostredníctvom pripojenia virtuálnej klávesnice. Ďakujem autorovi keybd_event, ale tam je to príliš vysokoúrovňová abstrakcia a bude potrebné to prepracovať. U mňa napríklad pravá klávesa Win v 3. rade vyberá. A späť sa transmituje len ľavá Win.
Známé chyby
- Nič nevieme o „kompozitnom“ vstupe (príklad: ½). Práve teraz to nie je potrebné.
- Nesprávne reprodukuje pravú Win. V mojom prípade narušuje usporiadanie akcentov.
- Nie je jasné rozobranie vstupu. Namiesto toho sú tam niektoré funkcie: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Ďakujem za pozornosť: opravil som v kóde a tu. S určitou pravdepodobnosťou sa môžu objaviť chyby pri výmene.
Na tomto mieste neviem „ako to má byť“ a budem rád za akékoľvek návrhy. - (Ó hrôza) konkurentné používanie kanálov (keyboardEvents, miceEvents).
Záver
Kód je najjednoduchší procedurálny. A hlúpy ako ja. Takže sa teším nádejou, že napísať žiaduce bude schopný prakticky každý technik. A tento produkt vďaka tomu nezanikne bez podpory podobne ako väčšina just-for-fun.
Veľa šťastia!
Zdroj: habr.com
