NedstÀngningen av stödet för xneur har orsakat mig viss plÄga de senaste sex mÄnaderna (med OpenSUSE 15.1 pÄ mina datorer: nÀr xneur Àr aktiverat förlorar fönstren fokus och blinkar roligt i takt med tangentbordsinmatningen).
«à h, fan, började skriva pĂ„ fel layout igen» â det hĂ€nder alldeles för ofta i mitt arbete. Och det ger ingen positiv kĂ€nsla.

Samtidigt kan jag (som konstruktör) ganska tydligt formulera vad jag vill ha. Och jag ville (först frÄn Punto Switcher, och sedan, tack vare Windows Vista, som jag definitivt bytte till Linux frÄn xneur) i princip bara en sak. NÀr jag inser att det pÄ skÀrmen Àr en soppa av bokstÀver pÄ fel layout (detta brukar hÀnda i slutet av inmatningen av ett nytt ord), vill jag bara trycka pÄ «Pause/Break». Och fÄ det jag skrev.
För nÀrvarande har produkten en optimal (enligt mig) balans mellan funktionalitet och komplexitet. Dags att dela med sig.
TL.DR
HĂ€r kommer alla tekniska detaljer, sĂ„ först â för de otĂ„liga.
För nÀrvarande har följande beteende hÄrdkodats:
- «Pause/Break»: tar bort (Backspace) det senaste ordet, vÀxlar layout i det aktiva fönstret (mellan 0 och 1) och skriver om det.
- «VÀnster Ctrl utan nÄgot»: vÀxlar layout i det aktiva fönstret (mellan 0 och 1).
- «VÀnster Shift utan nÄgot»: aktiverar layout nr 0 i det aktiva fönstret.
- «Höger Shift utan nÄgot»: aktiverar layout nr 1 i det aktiva fönstret.
FrÄn och med nu planerar jag att anpassa beteendet. Utan feedback Àr det inte intressant (jag Àr redan nöjd). Jag tror att det finns en tillrÀcklig procent av publiken pÄ Habr med liknande problem.
N.B. Eftersom i den aktuella versionen kopplas keyloggern till "/dev/input/", mÄste xswitcher köras med root-rÀttigheter:
chown root:root xswitcher
chmod +xs xswitcherObservera: Àgaren av filen med suid mÄste vara root, eftersom den Àrver suid av Àgaren vid körning.
Paranoiker (jag Àr inget undantag) kan klona frÄn och bygga pÄ plats. UngefÀr sÄ hÀr:
go get "github.com/micmonay/keybd_event"
go get "github.com/gvalkov/golang-evdev"
### X11 headers för OpenSUSE/deb-baserade
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
Autostart kan lÀggas till efter smak (beroende pÄ DE).
Fungerar, "krĂ€ver ingen extra resurser" (â30 sekunder CPU per dag, â12 MB i RSS).
Detaljer
Nu â detaljer.
Hela arkivet var ursprungligen dedikerat till mitt pet-projekt, och att starta ett annat â det kĂ€nns för jobbigt just nu. SĂ„ allt Ă€r samlat i en enda hög (bara i mappar) och tĂ€ckt av AGPL ("motsatt patent").
Koden för xswitcher Àr skriven i golang, med minimala inslag av C. Tanken Àr att denna metod ska ge lÀgsta arbetsinsatsen (och hittills stÀmmer det). Med bibehÄllen möjlighet att koppla in det som saknas via cgo.
I texten finns kommentarer om varifrÄn jag har lÄnat saker och varför. Eftersom koden för xneur inte "inspirerade mig", tog jag som utgÄngspunkt .
AnvÀndningen av "\/dev\/input\/" har bÄde sina fördelar (allt syns, inklusive nedtryckt tangent med upprepning) och nackdelar. Nackdelarna Àr:
- Upprepning (hÀndelser med kod "2") korrelerar inte med upprepningar frÄn x:arna.
- Ingen inmatning syns via X11-grÀnssnitt (till exempel fungerar VNC sÄ).
- Root-Ätkomst krÀvs.
à andra sidan kan man prenumerera pÄ X-hÀndelser via "XSelectExtensionEvent()". Man kan kika i . För go har jag inte hittat nÄgot liknande, och en grov implementering gav direkt hundra rader C-kod. Jag har lagt det Ät sidan för nu.
Utdata "bakÄt" Àr för tillfÀllet skapad genom att koppla en virtuell tangentbord. Tack till författaren av keybd_event, men dÀr Àr abstraheringen för hög och jag kommer att behöva göra om det. Till exempel vÀljer min högra Win-tangent rad 3. Och tillbaka översÀtts bara den vÀnstra Win-tangenten.
KĂ€nda buggar
- Vi vet inget om "komposit" inmatning (exempel: œ). Just nu Ă€r det inte nödvĂ€ndigt.
- Vi Äterger den högra Win-tangenten felaktigt. I mitt fall förvrÀnger den betoningen.
- Det finns ingen tydlig analys av inmatningen. IstÀllet finns det flera funktioner: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Tack för uppmÀrksamheten: jag har korrigerat i koden och hÀr. Med viss sannolikhet kan jag fÄ buggar vid byte.
PÄ denna plats vet jag inte "hur det ska göras" och jag skulle vara glad för alla förslag. - (Oh skrÀck) konkurrerande anvÀndning av kanaler (keyboardEvents, miceEvents).
Slutsats
Koden Àr den enklaste procedurala. Och lika dum som jag. SÄ jag tröstar mig med att förhoppningsvis kan nÀstan vilken tekniker som helst skriva det önskade. Och detta verk borde inte försvinna utan stöd som de flesta just-for-fun.
Lycka till!
KĂ€lla: habr.com
