Nieuwe analoog van Punto Switcher voor Linux: xswitcher

Het einde van de ondersteuning van xneur heeft mij de afgelopen zes maanden wat lijden bezorgd. (met de komst van OpenSUSE 15.1 op mijn desktops: als xneur is ingeschakeld, verliezen vensters de focus en flikkeren ze grappig op de maat met toetsenbordinvoer).

"Oh verdomme, ik begon weer in de verkeerde lay-out te typen" - in mijn werk gebeurt dit onfatsoenlijk vaak. En het voegt niets positiefs toe.

Nieuwe analoog van Punto Switcher voor Linux: xswitcher
Tegelijkertijd kan ik (als constructeur) heel helder formuleren wat ik wil. Maar ik wilde (eerst van Punto Switcher, en daarna, dankzij Windows Vista, eindelijk overstappen naar Linux, van xneur) precies één ding. Nadat je je hebt gerealiseerd dat de rommel op het scherm de verkeerde lay-out heeft (dit gebeurt meestal aan het einde van het typen van een nieuw woord), stamp je op "Pauze/Break". En krijg wat u hebt afgedrukt.

Op dit moment heeft het product de optimale (naar mijn mening) verhouding tussen functionaliteit en complexiteit. Het is tijd om te delen.

TL.DR

Er zullen later allerlei technische details volgen, dus eerst - link "aanraken" voor de ongeduldigen.

Momenteel is het volgende gedrag hardgecodeerd:

  • “Pauze/Break”: gaat terug naar het laatste woord, verandert de lay-out in het actieve venster (tussen 0 en 1) en kiest opnieuw.
  • “Linker Ctrl zonder iets”: wijzigt de lay-out in het actieve venster (tussen 0 en 1).
  • “Linker Shift zonder iets”: schakelt lay-out nr. 0 in het actieve venster in.
  • “Rechts Shift zonder iets”: schakelt lay-out nr. 1 in het actieve venster in.

Vanaf nu ben ik van plan het gedrag aan te passen. Zonder feedback is het niet interessant (ik vind het sowieso prima). Ik geloof dat er op Habré een voldoende percentage van het publiek met soortgelijke problemen zal zijn.

NB Omdat in de huidige versie is de keylogger gekoppeld aan "/dev/input/", xswitcher moet worden gestart met rootrechten:

chown root:root xswitcher
chmod +xs xswitcher

Let op: De eigenaar van het bestand met suid moet root zijn, omdat degene die de eigenaar is, wordt bij het opstarten in suid omgezet.

Paranoïden (ik ben geen uitzondering) kunnen klonen GIT en ter plaatse monteren. Zoals dat:

go get "github.com/micmonay/keybd_event"
go get "github.com/gvalkov/golang-evdev"

### X11 headers for 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

Voeg naar smaak autostart toe (afhankelijk van DE).

Het werkt, "vraagt ​​niet om pap" (≈30 seconden CPU per dag, ≈12 MB in RSS).

gegevens

Nu - de details.

De hele repository was oorspronkelijk gewijd aan mijn huisdierenproject, en ik ben te lui om er nog een te starten. Alles is dus opgestapeld (alleen in mappen) en gedekt door AGPL (“reverse patent”).

De xswitcher-code is geschreven in golang, met minimale insluitsels van C. Er wordt aangenomen dat deze aanpak de minste inspanning zal opleveren (tot nu toe). Met behoud van de mogelijkheid om te verbinden wat ontbreekt met behulp van cgo.

De tekst bevat commentaar over waar de tekst vandaan komt en waarom. Omdat de xneur-code “inspireerde mij niet”, nam ik het als uitgangspunt loloschakelaar.

Het gebruik van "/dev/input/" heeft zowel zijn voordelen (alles is zichtbaar, inclusief de ingedrukte auto-repeat-toets) als nadelen. De nadelen zijn:

  • Automatische herhaling (gebeurtenissen met code “2”) correleert niet met herhaling met x.
  • Invoer via X11-interfaces is niet zichtbaar (zo werkt VNC bijvoorbeeld).
  • Wortel nodig.

Aan de andere kant is het mogelijk om je te abonneren op X-evenementen via "XSelectExtensionEvent()". Je kunt naar kijken xinvoercode. Ik heb zoiets niet gevonden voor go, en de ruwe implementatie kostte onmiddellijk honderd regels C-code. Zet het voorlopig opzij.

De “omgekeerde” uitvoer wordt momenteel gemaakt door het virtuele toetsenbord vast te schroeven. Met dank aan de auteur van keybd_event, maar de abstractie daar is van een te hoog niveau en zal verder opnieuw moeten worden gedaan. Ik gebruik bijvoorbeeld de rechter Win-toets om de 3e rij te selecteren. En alleen de linker Win wordt teruggestuurd.

Bekende bugs

  • We weten niets over “samengestelde” invoer (bijvoorbeeld: ½). Het is nu niet nodig.
  • We spelen de juiste overwinning verkeerd. In mijn geval doorbreekt het de nadruk.
  • Er is geen duidelijke invoerparsering. In plaats daarvan zijn er verschillende functies: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Dank nsmkan voor uw zorg: gecorrigeerd in de code en hier. Met een bepaalde waarschijnlijkheid kun je bugs tegenkomen bij het vervangen.
    Op dit moment weet ik niet “hoe” en zou ik alle suggesties verwelkomen.
  • (Oh God) concurrerend gebruik van kanalen (keyboardEvents, miceEvents).

Conclusie

De code is de eenvoudigste procedurele. En dom zoals ik. Daarom vlei ik mezelf met de hoop dat bijna elke technicus kan voltooien wat hij wil. En dankzij dit zal dit product niet verloren gaan zonder ondersteuning, zoals de meeste gewoon voor de lol.

Good luck!

Bron: www.habr.com

Voeg een reactie