Prekid podrške za xneur prouzročio mi je određene patnje u posljednjih šest mjeseci (s dolaskom OpenSUSE 15.1 na mojim desktopima: kada je uključen xneur, prozori gube fokus i zabavno trepere u ritmu tipkanja na tipkovnici).
„Ah, prokletstvo, opet nisam počeo tipkati u pravom rasporedu“ — u mom radu to se događa neprimjereno često. I ne dodaje pozitivnost.

Istovremeno, ja (kao inženjer dizajner) mogu prilično jasno formulirati što želim. A želio sam (prvo od Punto Switcher, a zatim, hvala Windows Visti, konačno prešao na Linux, od xneur) samo jedno. Shvativši da na ekranu piše glupost u pogrešnom rasporedu (to se obično događa na kraju unosa nove riječi), pritisnuti „Pause/Break“. I dobiti ono što sam tipkao.
Trenutno, proizvod ima optimalan (s mog stajališta) odnos funkcionalnosti/složenosti. Vrijeme je da podijelim.
TL.DR
Dalje će doći razne tehničke pojedinosti, stoga prvo — za nestrpljive.
Trenutno je zakodirano sljedeće ponašanje:
- „Pause/Break”: briše (Backspace) posljednju riječ, prebacuje raspored u aktivnom prozoru (između 0 i 1) i tipka ponovno.
- „Lijevi Ctrl bez ničega”: prebacuje raspored u aktivnom prozoru (između 0 i 1).
- „Lijevi Shift bez ničega”: uključuje u aktivnom prozoru raspored br. 0.
- „Desni Shift bez ničega”: uključuje u aktivnom prozoru raspored br. 1.
Od ovog trenutka planiram prilagoditi ponašanje. Bez povratnih informacija — nije zanimljivo (mene to već zadovoljava). Smatram da će na Habr-u biti dovoljno posto publike s sličnim problemima.
Napomena. Budući da je u trenutnoj verziji keylogger priključen na " /dev/input/ ", xswitcher treba pokretati s root pravima:
chown root:root xswitcher
chmod +xs xswitcherImajte na umu: vlasnik datoteke s suid mora biti root, jer tko je vlasnik — taj će suid postati pri pokretanju.
Paranoici (ja nisam iznimka) mogu klonirati iz i sastaviti na licu mjesta. Otprilike ovako:
go get "github.com/micmonay/keybd_event"
go get "github.com/gvalkov/golang-evdev"
### X11 zaglavlja za 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
Automatsko pokretanje dodavati prema ukusu (ovisno o DE).
Radi, „ne traži kašu“ (≈30 sekundi CPU dnevno, ≈12 MB u RSS).
Detalji
Sada — detalji.
Cijeli repozitorij prvotno je bio posvećen mom pet-projektu, a nije mi se svidjela ideja o stvaranju novog. Sve je stoga nagurano u jednu hrpu (samo po mapama) i pokriveno AGPL ("patent obrnuto").
Kod xswitcher napisan je na golangu, s minimalnim dodatkom C-a. Pretpostavlja se da će takav pristup rezultirati najmanjim radnim opterećenjima (za sada tako stoji). Održava mogućnost povezivanja onoga što nedostaje putem cgo.
Uz tekst su dodani komentari iz kojih se može vidjeti odakle je što preuzeto i zašto. Budući da me kod xneur "nije inspirirao", uzmem ga kao polaznu točku. .
Korištenje "\/dev\/input\/" ima svoje prednosti (sve je vidljivo uključujući pritisnutu tipku s auto ponavljanjem), ali i neke nedostatke. Nedostaci su sljedeći:
- Auto ponavljanje (događaji s kodom "2") ne korelira s ponavljanjem s X-a.
- Nije vidljiv unos putem X11 sučelja (na primjer, VNC funkcionira na taj način).
- Potrebna je root privilegija.
S druge strane, mogu se prijaviti na X događaje putem "XSelectExtensionEvent()". Može se vidjeti u . Za go nisam pronašao ništa slično, a skica implementacije dala je odjednom stotinu redaka C koda. Trenutno sam to stavio na stranu.
Ispis "natrag" za sada je napravljen putem virtualne tipkovnice. Hvala autoru keybd_event, ali to je previše visoko razina apstrakcije i morat ćemo to preraditi. Na primjer, moja desna Win tipka treći red odabire. A natrag se samo transponira lijeva Win tipka.
Poznate greške
- Ne znamo ništa o "kompozitnom" unosu (primjer: ½). Trenutno nije potrebno.
- Pogrešno reproduciramo desnu Win. U mom slučaju narušava raspored akcenata.
- Nema jasne analize unosa. Umjesto toga — nekoliko funkcija: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Hvala za pozornost: ispravio sam u kodu i ovdje. S određenom vjerojatnošću možete dobiti greške pri zamjeni.
Na ovom mjestu ne znam "kako bi trebalo" i bit ću zahvalan na bilo kakvim prijedlozima. - (O, užas) konkurentska uporaba kanala (keyboardEvents, miceEvents).
Zaključak
Kod je najjednostavniji proceduralni. I glup kao ja. Tako da se nadam da će gotovo svaka tehnička osoba moći dopisati željeno. A ovo djelo zahvaljujući tome neće propasti bez potpore kao većina just-for-fun.
Srećno!
Izvor: habr.com
