Nový analóg Punto Switcher pre linux: xswitcher

Koniec podpory xneur mi za posledných šesť mesiacov spôsobil určité utrpenie. (s príchodom OpenSUSE 15.1 na mojich stolných počítačoch: so zapnutým xneurom strácajú okná zameranie a smiešne blikajú pri vstupe z klávesnice).

„Ach, sakra, opäť som začal písať v nesprávnom rozložení“ - v mojej práci sa to stáva neslušne často. A nepridáva to nič pozitívne.

Nový analóg Punto Switcher pre linux: xswitcher
Zároveň viem (ako konštruktér) celkom jasne sformulovať, čo chcem. Ale chcel som (najskôr z Punto Switcher a potom, vďaka Windows Vista, konečne prejsť na Linux, z xneur) presne jednu vec. Keď si uvedomíte, že odpadky na obrazovke sú v nesprávnom rozložení (zvyčajne sa to stáva na konci písania nového slova), stlačte „Pauza/Prestávka“. A získajte to, čo ste vytlačili.

Produkt má momentálne optimálny (z môjho pohľadu) pomer funkčnosť/zložitosť. Je čas sa podeliť.

TL.DR

Neskôr budú všetky druhy technických detailov, takže najprv - odkaz "dotýkať sa" pre netrpezlivých.

V súčasnosti je pevne zakódované nasledujúce správanie:

  • „Pauza/Prestávka“: vráti späť posledné slovo, prepne rozloženie v aktívnom okne (medzi 0 a 1) a znova vytočí.
  • „Ľavý Ctrl bez ničoho“: prepne rozloženie v aktívnom okne (medzi 0 a 1).
  • „Ľavý Shift bez ničoho“: zapne rozloženie č. 0 v aktívnom okne.
  • „Posun doprava bez ničoho“: zapne rozloženie č. 1 v aktívnom okne.

Odteraz plánujem prispôsobiť správanie. Bez spätnej väzby to nie je zaujímavé (aj tak mi to vyhovuje). Verím, že na Habré bude dostatočné percento divákov s podobnými problémami.

NB Pretože v aktuálnej verzii je keylogger pripojený k "/dev/input/", xswitcher musí byť spustený s právami root:

chown root:root xswitcher
chmod +xs xswitcher

Upozornenie: Vlastníkom súboru suid musí byť root, pretože ten, kto je vlastníkom, sa po spustení zmení na suid.

Paranoici (ja nie som výnimkou) sa môžu klonovať GIT a zostaviť na mieste. Ako 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

Pridajte autostart podľa chuti (v závislosti od DE).

Funguje to, „nepýta si kašu“ (≈30 sekúnd CPU za deň, ≈12 MB v RSS).

Podrobnosti

Teraz - podrobnosti.

Celé úložisko bolo pôvodne venované môjmu domácemu projektu a ja som príliš lenivý začať ďalší. Takže všetko je nahromadené (len v priečinkoch) a pokryté AGPL („reverzný patent“).

Kód xswitcher je napísaný v golangu, s minimálnymi inklúziami C. Predpokladá sa, že tento prístup bude mať za následok najmenšie množstvo úsilia (zatiaľ). Pri zachovaní možnosti pripojiť to, čo chýba pomocou cgo.

Text obsahuje komentáre, odkiaľ bol požičaný a prečo. Pretože kód xneur „mňa nenadchol“, bral som to ako východiskový bod loloswitcher.

Používanie "/dev/input/" má svoje výhody (všetko je viditeľné, vrátane stlačenej klávesy automatického opakovania) aj nevýhody. Nevýhody sú:

  • Automatické opakovanie (udalosti s kódom „2“) nekoreluje s opakovaním s x.
  • Vstup cez rozhrania X11 nie je viditeľný (takto funguje napríklad VNC).
  • Potrebujete root.

Na druhej strane je možné prihlásiť sa na odber X udalostí cez "XSelectExtensionEvent()". Môžete nakuknúť xinput kód. Nič také som nenašiel a hrubá implementácia okamžite zabrala sto riadkov kódu C. Zatiaľ to odložte.

„Reverzný“ výstup sa v súčasnosti vykonáva priskrutkovaním virtuálnej klávesnice. Vďaka autorovi keybd_event, ale abstrakcia tam je príliš vysoká a bude sa musieť ďalej prerábať. Ja napríklad používam pravé tlačidlo Win na výber 3. riadku. A späť sa prenáša iba ľavé Win.

Známe chyby

  • Nevieme nič o „kompozitnom“ vstupe (príklad: ½). Momentálne to nie je potrebné.
  • Nesprávne hráme správnu výhru. V mojom prípade to láme dôraz.
  • Neexistuje žiadna jasná analýza vstupu. Namiesto toho existuje niekoľko funkcií: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Vďaka nsmcan pre vašu starostlivosť: opravené v kóde a tu. S určitou pravdepodobnosťou môžete pri výmene zachytiť chyby.
    V tejto chvíli neviem „ako na to“ a uvítam akékoľvek návrhy.
  • (Ó Bože) konkurenčné využitie kanálov (keyboardEvents, miceEvents).

Záver

Kód je najjednoduchší procedurálny. A hlúpy ako ja. Lichotím si teda s nádejou, že takmer každý technik bude môcť dokončiť to, čo chce. A vďaka tomu tento produkt bez podpory nezahynie, ako väčšina len tak pre zábavu.

Good luck!

Zdroj: hab.com

Pridať komentár