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.
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.