A new analog of Punto Switcher for Linux: xswitcher

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

A new analog of Punto Switcher for Linux: xswitcher
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 — link „megfogni” 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 xswitcher

rmem 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 GIT é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. loloswitcher.

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 xinput kódban.. 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 nsmcan 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

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster