Novi analog Punto Switcher-a za linux: xswitcher

Prestanak podrške za xneur izazvao mi je određenu patnju u proteklih šest mjeseci. (sa pojavom OpenSUSE 15.1 na mojim desktop računarima: sa omogućenim xneurom, prozori gube fokus i trepere smešno u vremenu sa unosom sa tastature).

“Oh, dođavola, opet sam počeo da kucam u pogrešnom rasporedu” - u mom radu se to dešava nepristojno često. I ne dodaje ništa pozitivno.

Novi analog Punto Switcher-a za linux: xswitcher
U isto vrijeme, ja (kao inženjer dizajna) mogu sasvim jasno formulirati ono što želim. Ali želeo sam (prvo sa Punto Switcher-a, a zatim, zahvaljujući Windows Visti, konačno prelaskom na Linux, sa xneur-a) upravo jednu stvar. Shvativši da je smeće na ekranu u pogrešnom rasporedu (to se obično dešava na kraju kucanja nove riječi), zgazite na “Pauza/Prekid”. I uzmite ono što ste odštampali.

Trenutno proizvod ima optimalan (s moje tačke gledišta) omjer funkcionalnost/složenost. Vrijeme je za dijeljenje.

TL.DR

Kasnije će biti raznih tehničkih detalja, pa prvo - link "dodirnuti" za nestrpljive.

Trenutno je sljedeće ponašanje tvrdo kodirano:

  • “Pauza/prekid”: vraća posljednju riječ unazad, mijenja raspored u aktivnom prozoru (između 0 i 1) i ponovo bira.
  • “Lijevi Ctrl bez ičega”: mijenja izgled u aktivnom prozoru (između 0 i 1).
  • “Lijevi Shift bez ičega”: uključuje izgled br. 0 u aktivnom prozoru.
  • “Desni Shift bez ičega”: uključuje izgled br. 1 u aktivnom prozoru.

Od sada planiram prilagoditi ponašanje. Bez povratnih informacija, nije zanimljivo (ionako se slažem). Vjerujem da će na Habréu biti dovoljan postotak publike sa sličnim problemima.

NB Jer u trenutnoj verziji, keylogger je vezan za "/dev/input/", xswitcher mora biti pokrenut s root pravima:

chown root:root xswitcher
chmod +xs xswitcher

Imajte na umu: Vlasnik fajla sa suidom mora biti root, jer ko god da je vlasnik bit će pretvoren u suid nakon pokretanja.

Paranoidi (nisam izuzetak) mogu da kloniraju GIT i montirati na licu mesta. Kao to:

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

Dodajte autostart po ukusu (ovisno o DE).

Radi, "ne traži kašu" (≈30 sekundi CPU dnevno, ≈12 MB u RSS-u).

Pogledajte detalje

Sada - detalji.

Cijelo spremište je prvobitno bilo posvećeno mom projektu kućnog ljubimca, a ja sam previše lijen da pokrenem još jedan. Dakle, sve je nagomilano (samo u fasciklama) i pokriveno AGPL-om („obrnuti patent“).

Kod xswitcher-a je napisan u golangu, sa minimalnim uključivanjem C. Pretpostavlja se da će ovaj pristup rezultirati najmanjim naporom (do sada). Uz zadržavanje mogućnosti povezivanja onoga što nedostaje pomoću cgo-a.

Tekst sadrži komentare odakle je i zašto posuđen. Jer xneur kod „nije me inspirisao“, uzeo sam ga kao polaznu tačku loloswitcher.

Korištenje "/dev/input/" ima svoje prednosti (sve je vidljivo, uključujući pritisnutu tipku za automatsko ponavljanje) i nedostatke. Nedostaci su:

  • Automatsko ponavljanje (događaji sa kodom “2”) ne korelira sa ponavljanjem sa x.
  • Ulaz preko X11 interfejsa nije vidljiv (ovako VNC radi, na primer).
  • Potreban root.

S druge strane, moguće je pretplatiti se na X događaje putem "XSelectExtensionEvent()". Možete zaviriti xinput code. Nisam našao ništa slično ovome za go, a gruba implementacija je odmah zauzela stotinu linija C koda. Ostavi to sa strane za sada.

"Obrnuti" izlaz se trenutno vrši uvrtanjem virtuelne tastature. Hvala autoru keybd_event, ali apstrakcija je previše visokog nivoa i morat će se dalje raditi. Na primjer, koristim desnu tipku Win za odabir 3. reda. I samo lijevi Win se prenosi nazad.

Poznate greške

  • Ne znamo ništa o "kompozitnom" unosu (primjer: ½). Trenutno nije potrebno.
  • Igramo na pravu Win pogrešno. U mom slučaju, to razbija naglasak.
  • Nema jasne analize ulaza. Umjesto toga, postoji nekoliko funkcija: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Spasibo nsmcan za vašu brigu: ispravio u kodu i ovdje. Sa određenom vjerovatnoćom možete uhvatiti greške prilikom zamjene.
    U ovom trenutku ne znam "kako" i bio bih dobrodošao svaki prijedlog.
  • (Moj bože) konkurentsko korištenje kanala (keyboardEvents, miceEvents).

zaključak

Kod je najjednostavniji proceduralni. I glup kao ja. Dakle, laskam sebi u nadi da će gotovo svaki tehničar uspjeti da završi ono što želi. I zahvaljujući tome, ovaj proizvod neće propasti bez podrške, kao većina samo-zabavnih.

Sretno!

izvor: www.habr.com

Dodajte komentar