Ny analog af Punto Switcher til linux: xswitcher

Afbrydelsen af xneur har forårsaget mig visse lidelser i de seneste seks måneder. (med introduktionen af OpenSUSE 15.1 på mine desktops: når xneur er tændt, mister vinduerne fokus og blinker sjovt i takt med tastaturindgangen.).

"Åh, pokkers, jeg begyndte igen at skrive i den forkerte layout" - i mit arbejde sker det uhyre ofte. Og det tilføjer ikke noget positivt.

Ny analog af Punto Switcher til linux: xswitcher
Samtidig kan jeg (som ingeniør) formulere klart, hvad jeg ønsker. Og jeg ønskede (først fra Punto Switcher, og derefter, tak til Windows Vista, endelig gået over til Linux, fra xneur) præcist én ting. At indse, at skærmen viser crap i den forkerte layout (det sker normalt til sidst, når man har skrevet et nyt ord), og så trykke på "Pause/Break". Og få det, jeg har skrevet.

I øjeblikket har produktet det optimale (i min optik) forhold mellem funktionalitet og kompleksitet. Det er tid til at dele.

TL.DR

Dernæst kommer der forskellige tekniske detaljer, så først - link "til at prøve" for de utålmodige.

I øjeblikket er det følgende adfærd hardkodet:

  • "Pause/Break": sletter (Backspace) det sidste ord, skifter layout i det aktive vindue (mellem 0 og 1) og skriver det igen.
  • "Venstre Ctrl uden nogen nøgle": skifter layout i det aktive vindue (mellem 0 og 1).
  • "Venstre Shift uden nogen nøgle": aktiverer layout nr. 0 i det aktive vindue.
  • "Højre Shift uden nogen nøgle": aktiverer layout nr. 1 i det aktive vindue.

Fra dette tidspunkt planlægger jeg at tilpasse adfærden. Uden feedback - er det ikke interessant (jeg er allerede tilfreds). Jeg antager, at der på Habr findes en tilstrækkelig procentdel af publikum med lignende problemer.

N.B. Da keyloggeren i den aktuelle version tilsluttes "/dev/input/", skal xswitcher køres med root-rettigheder:

chown root:root xswitcher
chmod +xs xswitcher

Bemærk venligst: ejeren af filen med suid skal være root, da den, der ejer - er den, der kører suid ved opstart.

Paranoide (jeg er ingen undtagelse) kan klone fra GIT og bygge det lokalt. Cirka sådan:

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

### X11 headers for OpenSUSE/deb-baserede
dub 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

Auto-start tilføjes efter smag (afhængig af DE).

Det fungerer, "det kræver ikke meget" (≈30 sekunder CPU om dagen, ≈12 MB i RSS).

Detaljer

Nu - detaljer.

Hele repositoryet var oprindeligt dedikeret til mit pet-projekt, og jeg har ikke lyst til at starte et andet. Så alt er bare blevet smidt sammen (bare i mapper) og dækket af AGPL ("omvendt patent").

Koden til xswitcher er skrevet i golang med minimale indslag af C. Det antages, at denne tilgang vil give de mindste arbejdsindsatser (og indtil videre gør den det). Den giver mulighed for at tilslutte mangler gennem cgo.

I teksten er der kommentarer om, hvor jeg har lånt hvad, og hvorfor. Da koden til xneur ikke "inspirerede" mig, tog jeg udgangspunkt i loloswitcher.

Brugen af "/dev/input/" har både sine fordele (alt er synligt, inklusive en trykket tast med automatisk gentagelse) og ulemper. Ulemperne er:

  • Automatisk gentagelse (begivenheder med koden "2") korrelerer ikke med gentagelse fra xerne.
  • Input gennem X11 interfaces er ikke synligt (for eksempel fungerer VNC).
  • Root-adgang kræves.

På den anden side kan man abonnere på X-begivenheder gennem "XSelectExtensionEvent()". Man kan se det i koden til xinput. Jeg fandt ikke noget lignende for go, og den rå implementering gav straks hundrede linjer C-kode. Jeg har sat det til side for nu.

Output "baglæns" er indtil videre lavet ved at tilføje et virtuelt tastatur. Tak til forfatteren af keybd_event, men der er alt for høj niveau abstraction, og det skal gøres om. For eksempel vælger min højre Win-taste 3. række. Og tilbage oversættes kun venstre Win.

Kendte fejl

  • Vi ved intet om "komposit" input (eksempel: ½). Lige nu er det ikke nødvendigt.
  • Vi gengiver højre Win forkert. I mit tilfælde ødelægger det placeringen af accenter.
  • Der er ikke en klar analyse af input. I stedet er der flere funktioner: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Tak nsmcan for opmærksomhed: jeg rettede det i koden og her. Der er en vis sandsynlighed for at få bugs ved udskiftning.
    På dette punkt ved jeg ikke "hvordan det skal gøres" og vil sætte pris på enhver feedback.
  • (Åh skræk) konkurrencebrug af kanalerne (keyboardEvents, miceEvents).

Konklusion

Koden er den simpleste procedure. Og dum som jeg. Så jeg trøster mig med håbet om, at enhver tekniker praktisk taget kan afslutte det ønskede. Og dette produkt vil takket være det ikke forsvinde uden støtte som de fleste just-for-fun.

Held og lykke!

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster