Ny analog av Punto Switcher for linux: xswitcher

Slutten på xneur-støtte har påført meg en del lidelse de siste seks månedene. (med bruken av OpenSUSE 15.1 på skrivebordene mine: med xneur aktivert, mister vinduer fokus og flimrer morsomt i takt med tastaturinndata).

"Å, for helvete, jeg begynte å skrive i feil layout igjen" - i arbeidet mitt skjer dette uanstendig ofte. Og det tilfører ikke noe positivt.

Ny analog av Punto Switcher for linux: xswitcher
Samtidig kan jeg (som designingeniør) ganske tydelig formulere hva jeg vil. Men jeg ville (først fra Punto Switcher, og så, takket være Windows Vista, til slutt bytte til Linux, fra xneur) nøyaktig én ting. Etter å ha innsett at søppelet på skjermen er i feil layout (dette skjer vanligvis på slutten av å skrive et nytt ord), trampe på "Pause/Break". Og få det du har skrevet ut.

For øyeblikket har produktet det optimale (fra mitt ståsted) forhold mellom funksjonalitet og kompleksitet. Det er på tide å dele.

TL.DR

Det kommer alle slags tekniske detaljer senere, så først - lenke "to touch" for den utålmodige.

For øyeblikket er følgende oppførsel hardkodet:

  • "Pause/Break": går tilbake til siste ord, bytter layout i det aktive vinduet (mellom 0 og 1) og ringer igjen.
  • "Venstre Ctrl uten noe": bytter layout i det aktive vinduet (mellom 0 og 1).
  • "Left Shift uten noe": slår på layout nr. 0 i det aktive vinduet.
  • "Høyre skift uten noe": slår på layout nr. 1 i det aktive vinduet.

Fra nå av planlegger jeg å tilpasse atferden. Uten tilbakemelding er det ikke interessant (jeg har det fint med det uansett). Jeg tror at det på Habré vil være en tilstrekkelig prosentandel av publikum med lignende problemer.

NB Fordi i gjeldende versjon er keyloggeren knyttet til "/dev/input/", xswitcher må startes med rotrettigheter:

chown root:root xswitcher
chmod +xs xswitcher

Vennligst merk: Eieren av filen med suid må være root, fordi den som er eieren vil bli omgjort til suid ved oppstart.

Paranoider (jeg er intet unntak) kan klone fra GIT og monteres på stedet. Slik:

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

Legg til autostart etter smak (avhengig av DE).

Det fungerer, "ber ikke om grøt" (≈30 sekunder CPU per dag, ≈12 MB i RSS).

detaljer

Nå - detaljene.

Hele depotet var opprinnelig dedikert til kjæledyrprosjektet mitt, og jeg er for lat til å starte et nytt. Så alt er stablet opp (bare i mapper) og dekket av AGPL ("omvendt patent").

xswitcher-koden er skrevet i golang, med minimale inkluderinger av C. Det antas at denne tilnærmingen vil resultere i minst mulig innsats (så langt har den gjort det). Samtidig som du opprettholder muligheten til å koble til det som mangler ved hjelp av cgo.

Teksten inneholder kommentarer om hvor den er lånt fra og hvorfor. Fordi xneur-koden «inspirerte meg ikke», tok jeg utgangspunkt i det loloswitcher.

Å bruke "/dev/input/" har både sine fordeler (alt er synlig, inkludert den nedtrykte auto-repeat-tasten) og ulemper. Ulempene er:

  • Auto-repetisjon (hendelser med kode "2") korrelerer ikke med repetisjon med x.
  • Inndata gjennom X11-grensesnitt er ikke synlig (dette er for eksempel hvordan VNC fungerer).
  • Trenger rot.

På den annen side er det mulig å abonnere på X-hendelser via "XSelectExtensionEvent()". Du kan kikke på xinput kode. Jeg fant ikke noe slikt for å gå, og den grove implementeringen tok umiddelbart hundre linjer med C-kode. Legg det til side for nå.

Den "omvendte" utgangen gjøres for øyeblikket ved å skru det virtuelle tastaturet. Takk til forfatteren av keybd_event, men abstraksjonen der er for høyt nivå og må gjøres om ytterligere. For eksempel bruker jeg høyre Win-tast for å velge den tredje raden. Og bare venstre Win sendes tilbake.

Kjente feil

  • Vi vet ikke noe om "sammensatt" input (eksempel: ½). Det er ikke nødvendig akkurat nå.
  • Vi spiller riktig seier feil. I mitt tilfelle bryter det vekten.
  • Det er ingen klar inndataparsing. I stedet er det flere funksjoner: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Takk nsmcan for din omsorg: rettet det i koden og her. Med en viss sannsynlighet kan du fange feil når du bytter ut.
    På dette tidspunktet vet jeg ikke "hvordan" og tar gjerne imot forslag.
  • (Å gud) konkurransedyktig bruk av kanaler (keyboardEvents, miceEvents).

Konklusjon

Koden er den enkleste prosedyren. Og dum som meg. Så jeg smigrer meg selv med håp om at nesten enhver tekniker vil kunne fullføre det han vil. Og takket være dette vil ikke dette produktet gå til grunne uten støtte, som de fleste bare for moro skyld.

Lykke til!

Kilde: www.habr.com

Legg til en kommentar