xneur'i toe lõppemine on viimase kuue kuu jooksul mulle teatavaid raskusi valmistanud (OpenSUSE 15.1 ilmumisega minu desktop'idel: xneur'i seessejätmisel kaotavad aknad fookuse ja vilguvad lõbusalt sisestamise taktis).
«Ah, kurat, jälle vale paigutusega hakkasin kirjutama» — see kordub minu töös üleliia sagedasti. Ja see ei lisa positiivsust.

Samas suudan ma (insenerina) üsna selgelt väljendada, mida tahan. Ja ma tahtsin (esialgu Punto Switcher'i, hiljem, tänu Windows Vista'le, lõpuks Linux'ile üleminekul xneur'i) täpselt üht. Teades, et ekraanil on jura vale paigutuses (see juhtub tavaliselt uue sõna lõpuks), vajutada «Pause/Break». Ja saada see, mida kirjutasin.
Praeguseks on toode omandanud optimaalset (minu silmis) funktsionaalsuse/keerukuse suhet. On aeg jagada.
TL.DR
Edasi tulevad igasugused tehnilised detailid, seega kõigepealt — kärsitutele.
Praeguseks on kinnitatud järgmine käitumine:
- «Pause/Break»: kustutab (Backspace) viimase sõna, vahetab aktiivse akna paigutuse (vahepeal 0 ja 1) ja kirjutab uuesti.
- «Vasak Ctrl ilma midagi»: vahetab aktiivses aknas klaviatuuri paigutust (vahel 0 ja 1).
- «Vasak Shift ilma midagi»: aktiveerib aktiivses aknas paigutuse nr 0.
- «Parem Shift ilma midagi»: aktiveerib aktiivses aknas paigutuse nr 1.
Alates sellest hetkest plaanin kohandada käitumist. Ilma tagasisideta — ei ole huvitav (mind rahuldab niigi). Arvan, et Habr's on piisavalt palju publikust, kellel on sarnased probleemid.
N.B. Kuna praeguses versioonis on klaviatuurivaba võtta "/dev/input/", peab xswitcher olema käivitatud juurõigustega:
chown root:root xswitcher
chmod +xs xswitcherPalun pange tähele: Faili, millel on suid, omanik peab olema root, kuna kes on omanik — selleks suid ja muutub käivitamisel.
Paranoikud (ma ei ole erand) saavad kloonida ja koguda kohapeal. Umbes nii:
go get "github.com/micmonay/keybd_event"
go get "github.com/gvalkov/golang-evdev"
### X11 päised OpenSUSE/deb-põhiste jaoks
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
Automaats käivitamine lisada maitse järgi (sõltuvalt DE-st).
Töötab, «kala ei küsi» (≈30 sekundit CPU päevas, ≈12 MB RSS-s).
Üksikasjad
Nüüd — üksikasjad.
Kogu hoidla oli algselt pühendatud minu isiklikule projektile, ja uue loomine tundub hetkel tülikas. Seega on kõik kokku kuhjatud (lihtsalt kaustadesse) ja kaetud AGPL-iga ("patent tagurpidi").
Kood xswitcher on kirjutatud golangis, minimaalsete C-koodide lisadega. Eeldatakse, et selline lähenemine toob kaasa madalamad tööjõukulud (hetkel on see nii). Samuti säilib võimalus lisade ühendamiseks cgo kaudu.
Teksti sees on kommentaarid, kust on midagi laenatud ja miks. Kuna xneur'i kood mind "ei inspireerinud", võtsin aluseks .
Kasutades "/dev/input/", on oma plussid (näiteks on kõik nähtav, sealhulgas allavajutatud nupp koos automaatse kordusega) ja miinused. Miinused on järgmised:
- Automaatne kordus (üritus koodiga "2") ei kattu kordustega X-is.
- Sisendi nägemine X11 liideste kaudu on võimatu (näiteks töötab VNC nii).
- Nõutav on root-õigus.
Teiselt poolt on võimalik tellida X sündmusi läbi "XSelectExtensionEvent()". Seda saab vaadata . Go jaoks ei leidnud ma midagi sarnast ning esialgne teostus andis kohe sada rida C-koodi. Hetkel lükkan selle kõrvale.
Tagasiside "tagasi" on hetkel tehtud virtuaalse klaviatuuri kaudu. Aitäh autorile keybd_event, kuid see on liiga kõrgetasemeline abstraktsioon ja edaspidi tuleb seda ümber teha. Näiteks minu parempoolne Win-klahv valib 3. rea. Ja tagasi edastatakse ainult vasak Win.
Tuntud vead
- Meil ei ole infot "komposiit" sisendi kohta (näide: ½). Praegu ei ole see vajalik.
- Vale parema Win-i taasesitus. Minu puhul rikub see rõhkude paigutust.
- Sisendi kohta pole selget analüüsi. Selle asemel on mitmeid funktsioone: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Aitäh tähelepanu eest: parandas koodis ja siin. Teatud tõenäosusega võib vahetamisel saada vigu.
Selles osas ei tea ma, kuidas peaks olema, ja olen avatud igasugustele ettepanekutele. - (Oh hirmsust) konkurentsivõimeline kanalite kasutamine (keyboardEvents, miceEvents).
Kokkuvõte
Kood on lihtsaim protseduuriline. Ja rumal nagu mina. Seega lohutangi end lootusega, et soovitud funktsioonide lisamine suudab peaaegu iga tehnik teha. Ja see toode ei kao selle tõttu toetuse puudumise tõttu nagu enamik just lõbu pärast loodud tooteid.
Edu!
Allikas: habr.com
