Ny analog av Punto Switcher for linux: xswitcher

Slutten på støtten for xneur har forårsaket meg litt smerte de siste seks månedene. (med fremveksten av OpenSUSE 15.1 på skrivebordene mine: med xneur aktivert mister vinduer fokus og flimrer komisk i takt med tastaturinndata).

«Å, for pokker, jeg begynte å skrive med feil oppsett igjen» – dette skjer uanstendig ofte i jobben min. Og det tilfører ikke noe positivt.

Ny analog av Punto Switcher for linux: xswitcher
Samtidig kan jeg (som designingeniør) formulere ganske tydelig hva jeg vil. Og jeg ville (først fra Punto Switcher, og deretter, takket være Windows Vista, etter endelig å ha byttet til Linux, fra xneur) akkurat én ting. Etter å ha innsett at det er uorden på skjermen i feil layout (dette skjer vanligvis på slutten av å skrive et nytt ord), trykke på "Pause/Break". Og få det jeg skrev.

For øyeblikket har produktet et optimalt (fra mitt synspunkt) forhold mellom funksjonalitet og kompleksitet. Det er på tide å dele.

TL;DR

Det kommer noen tekniske detaljer senere, så først - "berør og føl"-lenke for de utålmodige.

Følgende oppførsel er for øyeblikket hardkodet:

  • «Pause/Bryt»: Går tilbake til det siste ordet, bytter layout i det aktive vinduet (mellom 0 og 1), og skriver på nytt.
  • "Venstre Ctrl uten noe": bytter layout i det aktive vinduet (mellom 0 og 1).
  • "Venstre Shift uten noe": slår på layout #0 i det aktive vinduet.
  • "Høyre Shift uten noe": slår på layout nr. 1 i det aktive vinduet.

Fra nå av planlegger jeg å tilpasse oppførselen. Uten tilbakemeldinger er det ikke interessant (jeg er fornøyd med det). Jeg tror det er en tilstrekkelig andel av publikummet på Habr med lignende problemer.

NB Siden den nåværende versjonen kobler keyloggeren til "/dev/input/", må xswitcher startes med root-rettigheter:

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 konvertert til suid når den startes.

Paranoide (jeg er intet unntak) kan klone fra GIT og montere på stedet. Noe sånt som dette:

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

Tilsett autostart etter smak (avhengig av DE).

Det fungerer uten problemer (≈30 CPU-sekunder per dag, ≈12 MB i RSS).

detaljer

Nå til detaljene.

Hele arkivet var opprinnelig dedikert til mitt favorittprosjekt, og jeg er for lat til å lage et nytt. Så alt er dumpet i en haug (bare i mapper) og dekket av AGPL ("patent in reverse").

Xswitcher-koden er skrevet i golang, med minimale C-dryss. Denne tilnærmingen skal visstnok være den minst arbeidskrevende (og så langt så bra). Samtidig som den fortsatt kan koble til det som mangler via cgo.

Teksten er lagt opp med kommentarer, hvor jeg lånte hva fra og hvorfor. Siden xneur-koden «ikke inspirerte» meg, tok jeg utgangspunkt i loloswitcher.

Å bruke «/dev/input/» har sine fordeler (alt er synlig, inkludert den trykkede tasten med automatisk repetisjon), og ulemper. Ulempene er som følger:

  • Autorepetisjon (hendelser med koden «2») korrelerer ikke med repetisjon med X.
  • Inndata via X11-grensesnitt er ikke synlig (for eksempel, slik fungerer VNC).
  • Root kreves.

På den annen side kan du abonnere på X-arrangementer via «XSelectExtensionEvent()». Du kan ta en titt på xinput-kodeJeg fant ikke noe lignende for go, og den grove implementeringen ga meg umiddelbart hundre linjer med C-kode. Jeg la det til side for nå.

"Tilbake"-utdataene gjøres for øyeblikket ved å skru på et virtuelt tastatur. Takk til forfatteren av keybd_event, men det er for mye abstraksjon der, og det må gjøres på nytt senere. For eksempel, i mitt tilfelle velger den høyre Win-tasten den tredje raden. Og bare den venstre Win-tasten sendes tilbake.

Kjente problemer

  • Vi vet ingenting om «sammensatt» input (eksempel: ½). Det er ikke nødvendig akkurat nå.
  • Gjengir feilaktig den riktige Win. I mitt tilfelle ødelegger det plasseringen av aksenter.
  • Det er ingen tydelig input-parsing. I stedet finnes det flere funksjoner: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Takk nsmcan Til din oppmerksomhet: Jeg rettet det i koden og her. Det er en viss sannsynlighet for at du kan oppdage feil når du bytter ut.
    På dette tidspunktet vet jeg ikke «hvordan det burde være», og tar gjerne imot forslag.
  • (Å, skrekken) samtidig bruk av kanaler (keyboardEvents, miceEvents).

Konklusjon

Koden er den enkleste prosedyremessige. Og like dum som meg. Så trøster jeg meg med håpet om at nesten enhver tekniker vil kunne skrive ferdig det de vil. Og takket være dette vil ikke dette produktet gå til grunne uten støtte slik som de fleste bare-for-moro-programmer.

Lykke til!

Kilde: www.habr.com