Ny analog af Punto Switcher til linux: xswitcher

Slutningen af ​​xneur-support har forårsaget mig nogle lidelser i løbet af de sidste seks måneder. (med fremkomsten af ​​OpenSUSE 15.1 på mine desktops: med xneur aktiveret mister vinduer fokus og flimrer sjovt i takt med tastaturinput).

"Åh, for fanden, jeg begyndte at skrive i det forkerte layout igen" - i mit arbejde sker det uanstændigt ofte. Og det tilføjer ikke noget positivt.

Ny analog af Punto Switcher til linux: xswitcher
Samtidig kan jeg (som designingeniør) ret klart formulere, hvad jeg vil. Men jeg ville (først fra Punto Switcher, og så, takket være Windows Vista, endelig skifte til Linux, fra xneur) præcis én ting. Efter at have indset, at affaldet på skærmen er i det forkerte layout (dette sker normalt i slutningen af ​​at skrive et nyt ord), skal du trampe på "Pause/Break". Og få det du har printet.

I øjeblikket har produktet det optimale (fra mit synspunkt) forhold mellem funktionalitet og kompleksitet. Det er tid til at dele.

TL.DR

Der kommer alle mulige tekniske detaljer senere, så først - link "to touch" for den utålmodige.

I øjeblikket er følgende adfærd hardkodet:

  • "Pause/Break": går tilbage til det sidste ord, skifter layout i det aktive vindue (mellem 0 og 1) og ringer igen.
  • "Venstre Ctrl uden noget": skifter layout i det aktive vindue (mellem 0 og 1).
  • "Venstre skift uden noget": slår layout nr. 0 til i det aktive vindue.
  • "Højre skift uden noget": slår layout nr. 1 til i det aktive vindue.

Fra nu af planlægger jeg at tilpasse adfærden. Uden feedback er det ikke interessant (jeg har det alligevel fint med det). Jeg tror, ​​at der på Habré vil være en tilstrækkelig procentdel af publikum med lignende problemer.

NB Fordi i den aktuelle version er keyloggeren knyttet til "/dev/input/", xswitcher skal startes med root-rettigheder:

chown root:root xswitcher
chmod +xs xswitcher

Vær opmærksom: Ejeren af ​​filen med suid skal være root, fordi hvem der end er ejeren vil blive forvandlet til suid ved opstart.

Paranoider (jeg er ingen undtagelse) kan klone fra GIT og samles på stedet. Sådan:

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

Tilføj autostart efter smag (afhængig af DE).

Det virker, "beder ikke om grød" (≈30 sekunder CPU pr. dag, ≈12 MB i RSS).

Detaljer

Nu - detaljerne.

Hele depotet var oprindeligt dedikeret til mit kæledyrsprojekt, og jeg er for doven til at starte endnu et. Så alt er stablet op (bare i mapper) og dækket af AGPL ("omvendt patent").

xswitcher-koden er skrevet i golang med minimale inklusioner af C. Det antages, at denne tilgang vil resultere i den mindste indsats (indtil videre har den gjort det). Samtidig med at man bevarer muligheden for at forbinde det, der mangler ved hjælp af cgo.

Teksten indeholder kommentarer til, hvor den er lånt fra og hvorfor. Fordi xneur-koden "inspirerede mig ikke", tog jeg udgangspunkt i det loloswitcher.

Brug af "/dev/input/" har både sine fordele (alt er synligt, inklusive den nedtrykte auto-repeat-tast) og ulemper. Ulemperne er:

  • Auto-repeat (hændelser med kode "2") korrelerer ikke med gentagelse med x.
  • Input gennem X11-grænseflader er ikke synlige (sådan fungerer VNC f.eks.).
  • Har brug for rod.

På den anden side er det muligt at abonnere på X begivenheder via "XSelectExtensionEvent()". Du kan kigge på xinput kode. Jeg fandt ikke noget lignende til at gå, og den grove implementering tog straks hundrede linjer C-kode. Læg det til side for nu.

Det "omvendte" output er i øjeblikket lavet ved at skrue det virtuelle tastatur. Tak til forfatteren af ​​keybd_event, men abstraktionen der er for højt niveau og skal laves om yderligere. For eksempel bruger jeg den højre Win-tast til at vælge 3. række. Og kun den venstre Win sendes tilbage.

Kendte Bugs

  • Vi ved ikke noget om "sammensat" input (eksempel: ½). Det er ikke nødvendigt lige nu.
  • Vi spiller den rigtige gevinst forkert. I mit tilfælde bryder det vægten.
  • Der er ingen klar input-parsing. I stedet er der flere funktioner: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Tak nsmcan til din pleje: rettede det i koden og her. Med en vis sandsynlighed kan du fange fejl, når du udskifter.
    På dette tidspunkt ved jeg ikke "hvordan" og vil gerne modtage forslag.
  • (Åh gud) konkurrencedygtig brug af kanaler (keyboardEvents, miceEvents).

Konklusion

Koden er den enkleste procedure. Og dum som mig. Så jeg smigrer mig selv med håbet om, at næsten enhver tekniker vil være i stand til at fuldføre, hvad han vil. Og takket være dette vil dette produkt ikke gå til grunde uden støtte, som de fleste bare for sjov.

Held og lykke!

Kilde: www.habr.com

Tilføj en kommentar