Nový analog Punto Switcher pro linux: xswitcher

Konec podpory xneur mi za posledních šest měsíců způsobil určité utrpení. (s příchodem OpenSUSE 15.1 na mé stolní počítače: se zapnutým xneurem okna ztrácejí pozornost a vtipně blikají v závislosti na vstupu z klávesnice).

"Ach, sakra, zase jsem začal psát ve špatném rozložení" - v mé práci se to stává neslušně často. A nepřidává to nic pozitivního.

Nový analog Punto Switcher pro linux: xswitcher
Přitom já (jako konstruktér) umím celkem jasně formulovat, co chci. Ale chtěl jsem (nejprve z Punto Switcher a pak díky Windows Vista konečně přejít na Linux, z xneur) přesně jednu věc. Když si uvědomíte, že odpadky na obrazovce jsou ve špatném rozložení (to se obvykle stává na konci psaní nového slova), dupněte na „Pauza/Přestávka“. A získejte, co jste vytiskli.

Produkt má v tuto chvíli optimální (z mého pohledu) poměr funkčnost/složitost. Je čas se podělit.

TL.DR

Dále zde budou nejrůznější technické detaily, takže nejprve - odkaz "dotknout se" pro netrpělivé.

V současné době je pevně zakódováno následující chování:

  • „Pauza/Přestávka“: vrátí zpět poslední slovo, přepne rozložení v aktivním okně (mezi 0 a 1) a znovu vytočí.
  • „Levý Ctrl bez čehokoliv“: přepne rozložení v aktivním okně (mezi 0 a 1).
  • „Levý Shift bez čehokoliv“: zapne rozložení č. 0 v aktivním okně.
  • „Posun vpravo bez čehokoliv“: zapne rozložení č. 1 v aktivním okně.

Od této chvíle plánuji chování přizpůsobit. Bez zpětné vazby to není zajímavé (stejně mi to vyhovuje). Věřím, že na Habré bude dostatečné procento publika s podobnými problémy.

NB Protože v aktuální verzi je keylogger připojen k "/dev/input/", xswitcher musí být spuštěn s právy root:

chown root:root xswitcher
chmod +xs xswitcher

Vezměte prosím na vědomí: Vlastníkem souboru s suid musí být root, protože kdokoli je vlastníkem, bude po spuštění proměněn v suid.

Paranoidové (nejsem výjimka) se mohou klonovat GIT a sestavit na místě. Takhle:

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

Přidejte autostart podle chuti (v závislosti na DE).

Funguje to, „nežádá o kaši“ (≈30 sekund CPU za den, ≈12 MB v RSS).

podrobnosti

Nyní - podrobnosti.

Celý repozitář byl zpočátku věnován mému pet projektu a já jsem příliš líný začít další. Vše je tedy nahromaděno (pouze ve složkách) a chráněno AGPL („reverzní patent“).

Kód xswitcher je napsán v golangu, s minimálními inkluzemi C. Předpokládá se, že tento přístup bude mít za následek nejmenší úsilí (zatím). Při zachování možnosti propojit to, co chybí pomocí cgo.

Text obsahuje komentáře, odkud byl vypůjčen a proč. Protože kód xneur „neinspiroval“, vzal jsem to jako výchozí bod loloswitcher.

Použití "/dev/input/" má jak své výhody (vše je vidět, včetně stisknuté klávesy auto-repeat), tak nevýhody. Nevýhody jsou:

  • Automatické opakování (události s kódem „2“) nekoreluje s opakováním s x.
  • Vstup přes rozhraní X11 není vidět (takto funguje například VNC).
  • Potřebujete root.

Na druhou stranu je možné se přihlásit k odběru X událostí přes "XSelectExtensionEvent()". Můžete nahlédnout xinput kód. Nic takového jsem nenašel a hrubá implementace okamžitě zabrala sto řádků kódu C. Dejte to zatím stranou.

„Reverzní“ výstup se aktuálně provádí přišroubováním virtuální klávesnice. Díky autorovi keybd_event, ale tamní abstrakce je příliš vysoká a bude se muset dále předělávat. Já například používám pravou klávesu Win pro výběr 3. řádku. A zpět se přenáší pouze levé Win.

Známí Bugs

  • Nevíme nic o „složeném“ vstupu (příklad: ½). Teď to není potřeba.
  • Nesprávně hrajeme správnou výhru. V mém případě to porušuje důraz.
  • Neexistuje žádná jasná vstupní analýza. Místo toho existuje několik funkcí: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Díky nsmcan pro vaši péči: opraveno v kódu a zde. S určitou pravděpodobností můžete při výměně zachytit chyby.
    V tuto chvíli nevím „jak na to“ a uvítám jakékoli návrhy.
  • (Pane Bože) konkurenční využití kanálů (keyboardEvents, miceEvents).

Závěr

Kód je nejjednodušší procedurální. A hloupý jako já. Lichotím si tedy s nadějí, že téměř každý technik bude schopen dokončit, co chce. A díky tomu tento produkt bez podpory nezahyne, jako většina jen tak pro zábavu.

Good luck!

Zdroj: www.habr.com

Přidat komentář