Nový ekvivalent Punto Switcher pro linux: xswitcher

Zrušení podpory xneur mi v posledních šesti měsících způsobilo určité utrpení. (s příchodem OpenSUSE 15.1 na mých desktopových počítačích: při zapnutém xneur okna ztrácejí fokus a zábavně blikají v rytmu psaní na klávesnici).

„Ach, sakra, zase jsem začal psát ve špatné rozložení“ — v mé práci se to objevuje až neúměrně často. A to nepřidává na pozitivu.

Nový ekvivalent Punto Switcher pro linux: xswitcher
Zároveň mohu (jako inženýr) poměrně jasně vyjádřit, co chci. A chtěl jsem (nejprve od Punto Switcher, a pak, díky Windows Vista, konečně přešel na Linux, od xneur) právě to jedno. Uvědomit si, že na obrazovce je blábol ve špatném rozložení (to se obvykle stává na konci psaní nového slova), šlápnout na „Pause/Break“. A získat to, co jsem psal.

V tuto chvíli má produkt optimální (z mého pohledu) poměr funkčnosti a složitosti. Je čas se podělit.

TL;DR

Následují různé technické podrobnosti, takže nejprve — odkaz „na osahání“ pro netrpělivé.

V tuto chvíli je zafixováno následující chování:

  • „Pause/Break“: smaže (Backspace) poslední slovo, přepíná rozložení v aktivním okně (mezi 0 a 1) a znovu píše.
  • „Levý Ctrl bez ničeho“: přepíná rozložení v aktivním okně (mezi 0 a 1).
  • „Levý Shift bez ničeho“: zapíná v aktivním okně rozložení č. 0.
  • „Pravý Shift bez ničeho“: zapíná v aktivním okně rozložení č. 1.

Od tohoto okamžiku plánuji přizpůsobit chování. Bez zpětné vazby — mě to nezajímá (mě to tak vyhovuje). Předpokládám, že na Habr bude dostatek publika se stejnými problémy.

N.B. Jelikož v aktuální verzi se keylogger připojuje k "/dev/input/", xswitcher by měl být spuštěn s rootovskými právy:

chown root:root xswitcher
chmod +xs xswitcher

Všimněte si: majitelem souboru s suid by měl být root, protože kdo je majitel, ten se při spuštění změní na suid.

Paranoici (já nevyjímaje) mohou klonovat z GIT a sestavit na místě. Přibližně takto:

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

### X11 hlavičky pro 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

Automatické spuštění přidávat podle chuti (v závislosti na DE).

Funguje, „nevyžaduje kaši“ (≈30 sekund CPU denně, ≈12 MB v RSS).

Detaily

Teď — podrobnosti.

Celý repozitář byl původně věnován mému pet projektu, a zakládat další se mi zatím nechce. Takže je to všechno naházeno dohromady (jenom podle složek) a pokryto AGPL ("patent naopak").

Kód xswitcher je napsán v golangu, s minimálními vkládáními C. Předpokládá se, že takový přístup přinese nejmenší náklady na práci (zatím to tak je). Zachovává možnosti připojení chybějícího prostřednictvím cgo.

V textu jsou rozloženy komentáře, odkud co bylo převezměno a proč. Protože mě kód xneur "neinspiroval", vzal jsem jako výchozí bod loloswitcher.

Použití "\/dev\/input\/" má své výhody (všechno je vidět včetně stisknuté klávesy s opakovaným stiskem), tak i nevýhody. Nevýhody jsou následující:

  • Opakování (události s kódem "2") nekorelovalo s opakovaným stiskem na X.
  • Není vidět vstup přes rozhraní X11 (například takto funguje VNC).
  • Je potřeba root.

Na druhou stranu, lze se přihlásit k událostem X přes "XSelectExtensionEvent()". Můžete se podívat do kódu xinput. Pro Go nic podobného jsem nenašel, a provizorní implementace dala na začátku sto řádků C kódu. Zatím jsem to odložil stranou.

Výstup "zpět" zatím realizován prostřednictvím připojení virtuální klávesnice. Děkuji autorovi keybd_event, ale tam je to příliš vysoceúrovňová abstrakce a dál to bude třeba přepracovat. U mě například pravý klíč Win 3. řady vybírá. A zpět se překládá pouze levý Win.

Známe chyby

  • Něco nevíme o "kompozitním" vstupu (příklad: ½). Přímo teď to není potřeba.
  • Nesprávně reprodukujeme pravý Win. V mém případě to narušuje rozložení akcentů.
  • Chybí srozumitelný rozbor vstupu. Místo toho — několik funkcí: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Děkuji nsmcan za pozornost: opravil jsem v kódu a tady. S určitou pravděpodobností lze získat chyby při výměně.
    V tomto místě nevím "jak na to" a budu rád za jakékoliv návrhy.
  • (Ach bože) konkurenční používání kanálů (keyboardEvents, miceEvents).

Závěr

Kód — nejjednodušší procedurální. A tupý jako já. Takže, těším se nadějí, že to, co chci napsat, dokáže prakticky každý technik. A tento výrobek díky tomu nezmizí bez podpory jako většina just-for-fun.

Hodně štěstí!

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster