Ny analog till Punto Switcher för linux: xswitcher

Slutet på xneurstöd har orsakat mig en del lidande under de senaste sex månaderna. (med tillkomsten av OpenSUSE 15.1 på mina stationära datorer: med xneur aktiverat tappar fönster fokus och flimrar roligt i takt med tangentbordsinmatning).

"Åh, för helvete, jag började skriva i fel layout igen" - i mitt arbete händer detta oanständigt ofta. Och det tillför inget positivt.

Ny analog till Punto Switcher för linux: xswitcher
Samtidigt kan jag (som konstruktionsingenjör) ganska tydligt formulera vad jag vill. Men jag ville (först från Punto Switcher, och sedan, tack vare Windows Vista, äntligen byta till Linux, från xneur) exakt en sak. Efter att ha insett att skräpet på skärmen är i fel layout (detta händer vanligtvis i slutet av att skriva ett nytt ord), trampa på "Paus/bryt". Och få det du skrivit ut.

För tillfället har produkten det optimala (ur min synvinkel) förhållande mellan funktionalitet och komplexitet. Det är dags att dela.

TL.DR

Det kommer alla möjliga tekniska detaljer senare, så först - länk "to touch" för den otåliga.

För närvarande är följande beteende hårdkodat:

  • "Paus/bryt": backar det sista ordet, byter layout i det aktiva fönstret (mellan 0 och 1) och slår igen.
  • "Vänster Ctrl utan någonting": växlar layouten i det aktiva fönstret (mellan 0 och 1).
  • "Vänster Shift utan någonting": aktiverar layout nr 0 i det aktiva fönstret.
  • "Högerväxling utan någonting": aktiverar layout nr 1 i det aktiva fönstret.

Från och med nu planerar jag att anpassa beteendet. Utan feedback är det inte intressant (jag har det bra i alla fall). Jag tror att det på Habré kommer att finnas en tillräcklig andel av publiken med liknande problem.

NB Därför att i den aktuella versionen är keyloggern kopplad till "/dev/input/", xswitcher måste startas med roträttigheter:

chown root:root xswitcher
chmod +xs xswitcher

Var uppmärksam: Ägaren till filen med suid måste vara root, eftersom den som är ägaren kommer att förvandlas till suid vid uppstart.

Paranoider (jag är inget undantag) kan klona från JÄVEL och montera på plats. Sådär:

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

Lägg till autostart efter smak (beroende på DE).

Det fungerar, "ber inte om gröt" (≈30 sekunder CPU per dag, ≈12 MB i RSS).

detaljer

Nu - detaljerna.

Hela förvaret var ursprungligen dedikerat till mitt husdjursprojekt, och jag är för lat för att starta ett nytt. Så allt är staplat (bara i mappar) och täckt av AGPL ("omvänt patent").

xswitcher-koden är skriven i golang, med minimal inkludering av C. Det antas att detta tillvägagångssätt kommer att resultera i minsta ansträngning (hittills). Samtidigt som man behåller möjligheten att ansluta det som saknas med hjälp av cgo.

Texten innehåller kommentarer om var den lånades ifrån och varför. Därför att xneur-koden "inspirerade mig inte", jag tog det som utgångspunkt loloswitcher.

Att använda "/dev/input/" har både sina fördelar (allt är synligt, inklusive den nedtryckta auto-repeat-tangenten) och nackdelar. Nackdelarna är:

  • Automatisk upprepning (händelser med kod "2") korrelerar inte med upprepning med x.
  • Indata via X11-gränssnitt är inte synligt (så här fungerar till exempel VNC).
  • Behöver rot.

Å andra sidan är det möjligt att prenumerera på X-evenemang via "XSelectExtensionEvent()". Du kan kika på xinmatningskod. Jag hittade inte något liknande för att gå, och den grova implementeringen tog omedelbart hundra rader C-kod. Lägg det åt sidan för nu.

Den "omvända" utgången görs för närvarande genom att skruva på det virtuella tangentbordet. Tack vare författaren till keybd_event, men abstraktionen där är på för hög nivå och kommer att behöva göras om ytterligare. Till exempel använder jag den högra Win-tangenten för att välja den tredje raden. Och bara den vänstra Win sänds tillbaka.

Kända buggar

  • Vi vet ingenting om "sammansatt" inmatning (exempel: ½). Det behövs inte just nu.
  • Vi spelar rätt vinst felaktigt. I mitt fall bryter det betoningen.
  • Det finns ingen tydlig ingångsanalys. Istället finns det flera funktioner: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Tack nsmcan för din vård: korrigerade det i koden och här. Med en viss sannolikhet kan du fånga buggar när du byter ut.
    Just nu vet jag inte "hur man gör" och skulle välkomna alla förslag.
  • (Herregud) konkurrenskraftig användning av kanaler (keyboardEvents, miceEvents).

Slutsats

Koden är den enklaste proceduren. Och dum som jag. Så jag smickrar mig själv med hopp om att nästan vilken tekniker som helst ska kunna slutföra vad han vill. Och tack vare detta kommer denna produkt inte att gå under utan stöd, som de flesta bara för skojs skull.

Lycka till!

Källa: will.com

Lägg en kommentar