Nov verzija Punto Switcher za Linux: xswitcher

Prekinitev podpore xneur mi je povzročila določene težave v zadnjih šestih mesecih (ko se je pojavil OpenSUSE 15.1 na mojih namizjih: pri vklopljenem xneur okna izgubljajo fokus in zabavno utripajo v ritmu tipkanja s tipkovnico).

„Ah, spet sem začel tipkati v napačni postavitvi“ — to se v moji službi dogaja do nesramno pogosto. In ne doda pozitivnega občutka.

Nov verzija Punto Switcher za Linux: xswitcher
Hkrati pa (kot inženir) lahko dovolj jasno opredelim, kaj želim. In želel sem (sprva od Punto Switcher, nato pa, hvala Windows Vista, popolnoma prešel na Linux, od xneur) prav to. Ko sem spoznal, da na ekranu vidim neresnične besede v napačni postavitvi (to se običajno zgodi ob zaključku tipkanja nove besede), sem stopil na „Pause/Break“. In prejel tisto, kar sem napisal.

Trenutno ima izdelek optimalno (z vidika mene) razmerje med funkcionalnostjo in zapletenostjo. Čas je, da delim.

TL;DR

Nato bodo sledile različne tehnične podrobnosti, zato najprej — povezava „za preizkus“ za neučakane.

Trenutno je nastavljena naslednja obnašanja:

  • „Pause/Break“: izbriše (Backspace) zadnjo besedo, preklopi postavitev v aktivnem oknu (med 0 in 1) in znova vpisuje.
  • „Levi Ctrl brez ničesar“: preklopi postavitev v aktivnem oknu (med 0 in 1).
  • „Levi Shift brez ničesar“: vklopi v aktivnem oknu postavitev št. 0.
  • „Desni Shift brez ničesar“: vklopi v aktivnem oknu postavitev št. 1.

Od zdaj naprej nameravam prilagajati obnašanje. Brez povratnih informacij — ni zanimivo (mene že tako zadostuje). Menim, da se bo na Habrju našel zadostni odstotek občinstva s podobnimi problemi.

N.B. Ker se v trenutni različici programska oprema za beleženje tipk priključi na "/dev/input/", mora xswitcher delovati z superuporabniškimi pravicami:

chown root:root xswitcher
chmod +xs xswitcher

Upoštevajte: lastnik datoteke s suid mora biti root, ker kdo je lastnik — tisti suid pretvori ob zagonu.

Paranoiki (nisem izjema) lahko klonirajo iz GIT in zgradijo na licu mesta. Približno tako:

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

### X11 glave za OpenSUSE/deb-niti
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

Samodejni zagon dodajte po okusu (odvisno od DE).

Deluje, „ne zahtevajo zvitkov“ (≈30 sekund CPU na dan, ≈12 MB v RSS).

Podrobnosti

Zdaj — podrobnosti.

Celia celoten repozitorij je bil sprva posvečen mojemu petem projektu, a mi je trenutno leno odpreti drugega. Zato je vse zmetano skupaj (samo po mapah) in pokrito z AGPL ("patent v obratni smeri").

Koda xswitcher je napisana v golangu, z minimalnimi vključitvami C. Predvideva se, da bo takšen pristop prinesel najmanjšo delovno obremenitev (kar je trenutno res). Hkrati ohranja možnost povezovanja tistega, kar manjka, preko cgo.

V besedilu so razdeljeni komentarji, od kje sem si kaj sposodil in zakaj. Ker me koda xneur "ni navdihnila", sem kot izhodišče vzel loloswitcher..

Uporaba "\/dev\/input\/" ima svoje prednosti (vse je vidno, vključno z zatirajočo tipko z avto ponavljanjem) in slabosti. Slabosti so naslednje:

  • Avto ponavljanje (dogodki s kodo "2") se ne ujema z ponavljanjem z ix-ih.
  • Vpisa preko X11 vmesnikov ni mogoče videti (tako deluje na primer VNC).
  • Potrebna je root pravica.

Po drugi strani pa se lahko prijavimo na X dogodke preko "XSelectExtensionEvent()". To lahko preverimo v kodi xinput.. Za go nisem našel nič takega, osnutek pa je dal takoj sto vrstic C-kode. Trenutno sem to pustil ob strani.

Izvor "nazaj" je trenutno izveden preko priključitve virtualne tipkovnice. Hvala avtorju keybd_event, vendar je tam preveč visoka abstrakcija in bo potrebno prirediti. Na primer, desna tipka Win izbira 3. vrstico. Medtem se samo leva Win prevaja nazaj.

Znane napake:

  • Nič ne vemo o "kompozitnem" vnosu (primer: ½). Trenutno to ni potrebno.
  • Napačno reproduciram desno Win. V mojem primeru pokvari postavitev akcentov.
  • Nima jasne razlage vnosa. Namesto tega – nekaj funkcij: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Hvala nsmcan za pozornost: popravil sem v kodi in tukaj. Z določeno verjetnostjo lahko naletite na napake pri zamenjavi.
    Na tem mestu ne vem, "kako naj bi bilo" in bom vesel kakršnih koli predlogov.
  • (O zlo) konkurenčna uporaba kanalov (keyboardEvents, miceEvents).

Zaključek

Koda je najpreprostejša proceduralna. In neumna kot sem jaz. Tako da, tolažim se s prepričanjem, da bo praktično vsak tehnik lahko dopisal želene funkcionalnosti. In ta izdelek se zaradi tega ne bo izgubil brez podpore, kot večina samo-za-zabavo.

Srečno!

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster