Nov analog Punto Switcherja za linux: xswitcher

Konec podpore xneur mi je v zadnjih šestih mesecih povzročil nekaj trpljenja. (s prihodom OpenSUSE 15.1 na mojih namizjih: z omogočenim xneur okna izgubijo fokus in smešno utripajo ob vnosu s tipkovnico).

"Oh, prekleto, spet sem začel tipkati v napačni postavitvi" - pri mojem delu se to zgodi nespodobno pogosto. In ne doda nič pozitivnega.

Nov analog Punto Switcherja za linux: xswitcher
Hkrati lahko (kot projektant) precej jasno formuliram, kaj hočem. Toda želel sem (najprej iz Punto Switcherja, nato pa, zahvaljujoč Windows Vista, končno preklopa na Linux, iz xneurja) točno eno stvar. Ko ugotovite, da so smeti na zaslonu v napačni postavitvi (to se običajno zgodi na koncu vnašanja nove besede), pritisnite »Pause/Break«. In dobite, kar ste natisnili.

Trenutno ima izdelek optimalno (z mojega vidika) razmerje funkcionalnost/kompleksnost. Čas je za delitev.

TL.DR

Kasneje bodo vse vrste tehničnih podrobnosti, zato najprej - povezava "na dotik" za nepotrpežljive.

Trenutno je to vedenje trdo kodirano:

  • “Pause/Break”: pomakne zadnjo besedo nazaj, preklopi postavitev v aktivnem oknu (med 0 in 1) in ponovno kliče.
  • “Levi Ctrl brez ničesar”: preklopi postavitev v aktivnem oknu (med 0 in 1).
  • “Levi premik brez ničesar”: vklopi postavitev št. 0 v aktivnem oknu.
  • “Desni premik brez ničesar”: vklopi postavitev št. 1 v aktivnem oknu.

Od zdaj naprej nameravam prilagoditi vedenje. Brez povratne informacije ni zanimivo (itak mi gre). Verjamem, da bo na Habréju zadosten odstotek občinstva s podobnimi težavami.

Opomba: Ker v trenutni različici je keylogger pritrjen na "/dev/input/", xswitcher je treba zagnati s korenskimi pravicami:

chown root:root xswitcher
chmod +xs xswitcher

Prosimo, upoštevajte: Lastnik datoteke s suid mora biti root, ker kdorkoli je lastnik, bo ob zagonu spremenjen v suid.

Paranoiki (jaz nisem izjema) lahko klonirajo iz GIT in sestavite na mestu. Kot 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 samodejni zagon po okusu (odvisno od DE).

Deluje, "ne zahteva kaše" (≈30 sekund CPU na dan, ≈12 MB v RSS).

Podrobnosti

Zdaj - podrobnosti.

Celotno skladišče je bilo prvotno posvečeno mojemu hišnemu projektu in prelen sem, da bi začel še enega. Torej, vse je nakopičeno (samo v mapah) in pokrito z AGPL (»obrnjeni patent«).

Koda xswitcher je napisana v golangu z minimalnimi vključki C. Predvideva se, da bo ta pristop povzročil najmanj truda (do zdaj je). Ob ohranjanju zmožnosti povezovanja tega, kar manjka, z uporabo cgo.

Besedilo vsebuje komentarje, od kod je bilo izposojeno in zakaj. Ker koda xneur »me ni navdihnila«, sem jo vzel za izhodišče loloswitcher.

Uporaba "/dev/input/" ima svoje prednosti (vse je vidno, vključno s pritisnjeno tipko za samodejno ponavljanje) in slabosti. Slabosti so:

  • Samodejno ponavljanje (dogodki s kodo "2") ni v korelaciji s ponavljanjem z x.
  • Vnos prek vmesnikov X11 ni viden (tako deluje na primer VNC).
  • Potreben root.

Po drugi strani pa se je možno naročiti na dogodke X prek "XSelectExtensionEvent()". Lahko pokukate koda xinput. Za go nisem našel nič takega in groba izvedba je takoj vzela sto vrstic kode C. Za zdaj ga dajte na stran.

"Vzvratni" izhod je trenutno narejen z vijačenjem virtualne tipkovnice. Hvala avtorju keybd_event, vendar je tamkajšnja abstrakcija previsoka in jo bo treba še predelati. Na primer, z desno tipko Win izberem 3. vrstico. In samo levi Win se prenaša nazaj.

Znane napake

  • Ne vemo ničesar o "sestavljenem" vnosu (primer: ½). Trenutno ni potreben.
  • Nepravilno igramo pravo zmago. V mojem primeru razbije poudarek.
  • Ni jasnega razčlenjevanja vnosa. Namesto tega obstaja več funkcij: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Hvala nsmcan za vašo skrb: popravljeno v kodi in tukaj. Z določeno verjetnostjo lahko pri zamenjavi ujamete hrošče.
    Na tej točki ne vem, "kako" in bi bil vesel vseh predlogov.
  • (O bog) konkurenčna uporaba kanalov (keyboardEvents, miceEvents).

Zaključek

Koda je najpreprostejši postopek. In neumen kot jaz. Torej, laskam si z upanjem, da bo skoraj vsak tehnik lahko dokončal, kar želi. In zahvaljujoč temu ta izdelek ne bo propadel brez podpore, kot večina samo za zabavo.

Srečno!

Vir: www.habr.com

Dodaj komentar