Novi analog Punto Switchera za linux: xswitcher

Prestanak xneur podrške prouzročio mi je neke patnje u proteklih šest mjeseci. (s pojavom OpenSUSE 15.1 na mojim stolnim računalima: s omogućenim xneurom, prozori gube fokus i čudno trepere u ritmu s unosom s tipkovnice).

"Oh, dovraga, opet sam počeo tipkati u krivom rasporedu" - u mom poslu to se događa nepristojno često. I ne dodaje ništa pozitivno.

Novi analog Punto Switchera za linux: xswitcher
U isto vrijeme, ja (kao projektant) mogu prilično jasno formulirati što želim. Ali htio sam (prvo s Punto Switchera, a zatim, zahvaljujući Windows Visti, konačno prelazak na Linux, s xneura) točno jednu stvar. Nakon što ste shvatili da je smeće na ekranu u pogrešnom rasporedu (to se obično događa na kraju upisivanja nove riječi), pritisnite "Pauza/Prekid". I uzmi ono što si ispisao.

U ovom trenutku proizvod ima optimalan (s moje točke gledišta) omjer funkcionalnosti i složenosti. Vrijeme je za dijeljenje.

TL.DR

Kasnije će biti raznih tehničkih detalja, pa prvo - veza "na dodir" za nestrpljive.

Trenutno je sljedeće ponašanje tvrdo kodirano:

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

Od sada planiram prilagoditi ponašanje. Bez povratne informacije, nije zanimljivo (ionako mi je dobro). Vjerujem da će na Habréu biti dovoljan postotak publike sa sličnim problemima.

NB Jer u trenutnoj verziji, keylogger je priključen na "/dev/input/", xswitcher se mora pokrenuti s root pravima:

chown root:root xswitcher
chmod +xs xswitcher

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

Paranoici (nisam iznimka) mogu klonirati iz GIT i sastaviti na licu mjesta. ovako:

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 želji (ovisno o DE).

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

Detalji

Sada - detalji.

Cijelo spremište je izvorno bilo posvećeno mom projektu ljubimaca, a ja sam previše lijen da započnem još jedan. Dakle, sve je nagomilano (samo u mapama) i pokriveno AGPL-om ("obrnuti patent").

Xswitcher kod je napisan u golangu, s minimalnim uključivanjem C-a. Pretpostavlja se da će ovaj pristup rezultirati najmanjim naporom (do sada jest). Zadržavajući mogućnost povezivanja onoga što nedostaje pomoću cgo.

Tekst sadrži komentare odakle je posuđen i zašto. Jer xneur kod "nije me inspirirao", uzeo sam ga kao polazište loloswitcher.

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

  • Automatsko ponavljanje (događaji s kodom “2”) nije u korelaciji s ponavljanjem s x.
  • Unos preko X11 sučelja nije vidljiv (tako radi npr. VNC).
  • Potreban root.

S druge strane, moguće je pretplatiti se na X događaje putem "XSelectExtensionEvent()". Možete zaviriti xinput kod. Nisam pronašao ništa slično za go, a za grubu implementaciju odmah je bilo potrebno stotinu redaka C koda. Ostavite to sa strane za sada.

"Obrnuti" izlaz se trenutno izvodi zavrtanjem virtualne tipkovnice. Hvala autoru keybd_eventa, ali tamošnja apstrakcija je previsoke razine i morat će se dalje prepravljati. Na primjer, koristim desnu tipku Win za odabir 3. reda. I samo lijevi Win se prenosi natrag.

Poznate greške

  • Ne znamo ništa o "kompozitnom" unosu (primjer: ½). Trenutno nije potrebno.
  • Netočno igramo pravu pobjedu. U mom slučaju razbija naglasak.
  • Ne postoji jasna analiza unosa. Umjesto toga, postoji nekoliko funkcija: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Hvala nsmcan za vašu brigu: ispravljeno u kodu i ovdje. Uz određenu vjerojatnost, možete uhvatiti greške prilikom zamjene.
    U ovom trenutku ne znam "kako" i rado bih pozdravio sve prijedloge.
  • (O Bože) natjecateljsko korištenje kanala (keyboardEvents, miceEvents).

Zaključak

Kod je najjednostavniji proceduralni. I glup poput mene. Dakle, laskam si nadom da će gotovo svaki tehničar moći dovršiti ono što želi. I zahvaljujući tome, ovaj proizvod neće nestati bez podrške, kao većina samo za zabavu.

Sretno!

Izvor: www.habr.com

Dodajte komentar