A xneur támogatásának megszűnése az utolsó hat hónapban bizonyos szenvedést okozott számomra. (az OpenSUSE 15.1 megjelenésével a desktopjaimon: bekapcsolt xneur mellett az ablakok elveszítik a fókuszt és szórakoztatóan villognak a billentyűzet használatakor).
»A fenébe, megint nem a megfelelő billentyűzetkiosztással kezdtem gépelni« — a munkám során ezt undorító módon gyakran tapasztalom. És nem teszi kedvezzé.

Ugyanakkor mérnökként eléggé világosan meg tudom fogalmazni, hogy mit szeretnék. És én pontosan egy dolgot akartam (először a Punto Switchertől, majd köszönhetően a Windows Vista-nak, végleg átállva Linuxra, az xneur-tól): amikor rájövök, hogy a képernyőn értelmetlen szöveg van a nem megfelelő kiosztással (ez általában új szó beírásának végén szokott előfordulni), taposni a „Pause/Break”-re. És megkapni, amit írtam.
Jelenleg a termék optimális (az én nézőpontomból) funkcionalitás/komplexitás arányt mutat. Ideje megosztani.
TL.DR
Továbbiakban különböző technikai részletek következnek, ezért először — a türelmetleneknek.
Jelenleg a következő viselkedést hardcoded-eljük:
- „Pause/Break”: elnyomja (Backspace) az utolsó szót, vált a kiosztás között az aktív ablakban (0 és 1 között), és újra beírja.
- „Bal Ctrl üresen”: vált a kiosztás között az aktív ablakban (0 és 1 között).
- „Bal Shift üresen”: aktiválja az aktív ablakban a kiosztást #0.
- „Jobb Shift üresen”: aktiválja az aktív ablakban a kiosztást #1.
Ettől a pillanattól fogva tervezem a viselkedés testreszabását. Visszajelzés nélkül — nem érdekes (engem így is kielégít). Úgy gondolom, a Habr-on elegendő közönség található hasonló problémákkal.
Figyelem. Mivel a jelenlegi verzióban a keylogger a "/dev/input/"-ra csatlakozik, az xswitcher-nek root jogosultságokkal kell elindulnia:
chown root:root xswitcher
chmod +xs xswitcherrmem a fájl tulajdonosának root-nak kell lennie, mivel aki a tulajdonos — az suid-ot váltana elindításkor.
A paranoidok (én sem vagyok kivétel) klónozhatják a és helyben összeállíthatják. Nagyjából így:
go get "github.com/micmonay/keybd_event"
go get "github.com/gvalkov/golang-evdev"
### X11 fejléc OpenSUSE/deb-alapú rendszerekhez
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
Autostartot hozzáadni ízlés szerint (a DE-től függően).
Működik, „nem kér sokat” (≈30 másodperc CPU naponta,≈12 MB a RSS-ben).
Részletek
Most — részletek.
A teljes tároló eredetileg a személyes projektemnek volt szentelve, és másikat indítani - eddig lusta voltam. Szóval minden össze van gyűjtve (csak mappákba) és AGPL („fordított szabadalom”) borítja.
A xswitcher kódja golangban készült, minimális C beépítésekkel. Azt feltételezem, hogy ez a megközelítés a lehető legkevesebb munkaidőt biztosítja (eddig így is van). Megőrzi a lehetőséget, hogy szükséges elemeket beillesszünk cgo segítségével.
A szövegben megjegyzések vannak elhelyezve, honnan mit vettem át és miért. Mivel az xneur kódja „nem inspirált”, egy másik kiindulási pontot választottam. .
A "\/dev\/input\/" használatának megvannak az előnyei (mindent látni, beleértve a lenyomott gombot ismétléssel) és hátrányai. A hátrányok a következők:
- Az ismétlés (a "2" kódú események) nem korrelál az X események ismétlésével.
- Nincs látható bemenet az X11 interfészeken keresztül (például a VNC így működik).
- Root jogok szükségesek.
Másrészről, lehet eseményekre feliratkozni az X-en keresztül az „XSelectExtensionEvent()” segítségével. Nézze meg a . A go-hoz hasonlót nem találtam, a piszkozat megvalósítás finoman száz sor C kódot adott. Egyelőre félreraktam.
A kimenet „visszafelé” egy virtuális billentyűzet beépítésével készült. Köszönet a keybd_event szerzőjének, de túl magas absztrakció szinten van, és tovább kell alakítanom. Például nálam a jobb Win kulcs a 3. sort választja ki. Visszafelé csak a bal Win kettesít.
Ismert hibák
- Semmit nem tudunk a „kompozit” bemenetről (például: ½). Jelenleg nincs rá szükség.
- Helytelenül reprodukálom a jobb Win-t. Az én esetemben tönkreteszi a hangsúlyozást.
- Nincs világos elemzés a bemenetről. Ehelyett van több funkció: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Köszönöm figyelmességért: javítottam a kódban és itt. Bizonyos valószínűséggel lehet hibákat szerezni a csere során.
Ebben a helyzetben nem tudom, „hogyan kellene” és örömmel fogadnék bármilyen javaslatot. - (Ó, borzalom) a csatornák párhuzamos használata (keyboardEvents, miceEvents).
Zárás
A kód a legegyszerűbb eljárásos. És buta, mint én. Szóval, remélem, hogy a kívánt dolgokat gyakorlatilag bármely technikus meg tudja írni. Ez a termék ezért nem fog elveszni támogatás nélkül, hasonlóan a legtöbb just-for-fun projekthez.
Sok szerencsét!
Forrás: habr.com
