Prekinitev podpore xneur mi je povzročila določene težave v zadnjih šestih mesecih (ko se je pojavil OpenSUSE 15.1 na mojih namizjih: pri vklopljenem xneur okna izgubljajo fokus in zabavno utripajo v ritmu tipkanja s tipkovnico).
„Ah, spet sem začel tipkati v napačni postavitvi“ — to se v moji službi dogaja do nesramno pogosto. In ne doda pozitivnega občutka.

Hkrati pa (kot inženir) lahko dovolj jasno opredelim, kaj želim. In želel sem (sprva od Punto Switcher, nato pa, hvala Windows Vista, popolnoma prešel na Linux, od xneur) prav to. Ko sem spoznal, da na ekranu vidim neresnične besede v napačni postavitvi (to se običajno zgodi ob zaključku tipkanja nove besede), sem stopil na „Pause/Break“. In prejel tisto, kar sem napisal.
Trenutno ima izdelek optimalno (z vidika mene) razmerje med funkcionalnostjo in zapletenostjo. Čas je, da delim.
TL;DR
Nato bodo sledile različne tehnične podrobnosti, zato najprej — za neučakane.
Trenutno je nastavljena naslednja obnašanja:
- „Pause/Break“: izbriše (Backspace) zadnjo besedo, preklopi postavitev v aktivnem oknu (med 0 in 1) in znova vpisuje.
- „Levi Ctrl brez ničesar“: preklopi postavitev v aktivnem oknu (med 0 in 1).
- „Levi Shift brez ničesar“: vklopi v aktivnem oknu postavitev št. 0.
- „Desni Shift brez ničesar“: vklopi v aktivnem oknu postavitev št. 1.
Od zdaj naprej nameravam prilagajati obnašanje. Brez povratnih informacij — ni zanimivo (mene že tako zadostuje). Menim, da se bo na Habrju našel zadostni odstotek občinstva s podobnimi problemi.
N.B. Ker se v trenutni različici programska oprema za beleženje tipk priključi na "/dev/input/", mora xswitcher delovati z superuporabniškimi pravicami:
chown root:root xswitcher
chmod +xs xswitcherUpoštevajte: lastnik datoteke s suid mora biti root, ker kdo je lastnik — tisti suid pretvori ob zagonu.
Paranoiki (nisem izjema) lahko klonirajo iz in zgradijo na licu mesta. Približno tako:
go get "github.com/micmonay/keybd_event"
go get "github.com/gvalkov/golang-evdev"
### X11 glave za OpenSUSE/deb-niti
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
Samodejni zagon dodajte po okusu (odvisno od DE).
Deluje, „ne zahtevajo zvitkov“ (≈30 sekund CPU na dan, ≈12 MB v RSS).
Podrobnosti
Zdaj — podrobnosti.
Celia celoten repozitorij je bil sprva posvečen mojemu petem projektu, a mi je trenutno leno odpreti drugega. Zato je vse zmetano skupaj (samo po mapah) in pokrito z AGPL ("patent v obratni smeri").
Koda xswitcher je napisana v golangu, z minimalnimi vključitvami C. Predvideva se, da bo takšen pristop prinesel najmanjšo delovno obremenitev (kar je trenutno res). Hkrati ohranja možnost povezovanja tistega, kar manjka, preko cgo.
V besedilu so razdeljeni komentarji, od kje sem si kaj sposodil in zakaj. Ker me koda xneur "ni navdihnila", sem kot izhodišče vzel .
Uporaba "\/dev\/input\/" ima svoje prednosti (vse je vidno, vključno z zatirajočo tipko z avto ponavljanjem) in slabosti. Slabosti so naslednje:
- Avto ponavljanje (dogodki s kodo "2") se ne ujema z ponavljanjem z ix-ih.
- Vpisa preko X11 vmesnikov ni mogoče videti (tako deluje na primer VNC).
- Potrebna je root pravica.
Po drugi strani pa se lahko prijavimo na X dogodke preko "XSelectExtensionEvent()". To lahko preverimo v . Za go nisem našel nič takega, osnutek pa je dal takoj sto vrstic C-kode. Trenutno sem to pustil ob strani.
Izvor "nazaj" je trenutno izveden preko priključitve virtualne tipkovnice. Hvala avtorju keybd_event, vendar je tam preveč visoka abstrakcija in bo potrebno prirediti. Na primer, desna tipka Win izbira 3. vrstico. Medtem se samo leva Win prevaja nazaj.
Znane napake:
- Nič ne vemo o "kompozitnem" vnosu (primer: ½). Trenutno to ni potrebno.
- Napačno reproduciram desno Win. V mojem primeru pokvari postavitev akcentov.
- Nima jasne razlage vnosa. Namesto tega – nekaj funkcij: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Hvala za pozornost: popravil sem v kodi in tukaj. Z določeno verjetnostjo lahko naletite na napake pri zamenjavi.
Na tem mestu ne vem, "kako naj bi bilo" in bom vesel kakršnih koli predlogov. - (O zlo) konkurenčna uporaba kanalov (keyboardEvents, miceEvents).
Zaključek
Koda je najpreprostejša proceduralna. In neumna kot sem jaz. Tako da, tolažim se s prepričanjem, da bo praktično vsak tehnik lahko dopisal želene funkcionalnosti. In ta izdelek se zaradi tega ne bo izgubil brez podpore, kot večina samo-za-zabavo.
Srečno!
Izvor: habr.com
