Eine neue Analogie zu Punto Switcher fĂŒr Linux: xswitcher

Die Einstellung der UnterstĂŒtzung fĂŒr xneur hat mir in den letzten sechs Monaten gewisse Schmerzen bereitet. (seit der EinfĂŒhrung von OpenSUSE 15.1 auf meinen Desktops: Bei aktiviertem xneur verlieren Fenster den Fokus und flackern lustig im Takt der Tastatureingaben).

„Ach, Mist, schon wieder in der falschen Tastaturbelegung angefangen zu tippen“ – in meiner Arbeit kommt das ungeheuer hĂ€ufig vor. Und es steigert die Freude nicht.

Eine neue Analogie zu Punto Switcher fĂŒr Linux: xswitcher
Gleichzeitig kann ich (als Maschinenbauingenieur) recht klar formulieren, was ich will. Und ich wollte (zuerst von Punto Switcher, und dann, dank Windows Vista, schließlich endgĂŒltig auf Linux mit xneur umgestiegen) genau eines. Zu erkennen, dass auf dem Bildschirm ein Kauderwelsch in der falschen Layout ist (das passiert normalerweise am Ende der Eingabe eines neuen Wortes), auf „Pause/Break“ zu tippen. Und das machen, was ich eingegeben habe.

Derzeit hat das Produkt aus meiner Sicht das optimale VerhÀltnis von FunktionalitÀt/Zusammensetzung. Es ist an der Zeit, es zu teilen.

TL.DR

Im Folgenden werden verschiedene technische Details behandelt, daher zunĂ€chst – der Link „zum Ausprobieren“ fĂŒr Ungeduldige.

Derzeit ist das folgende Verhalten fest kodiert:

  • „Pause/Break“: löscht (Backspace) das letzte Wort, wechselt die Tastaturbelegung im aktiven Fenster (zwischen 0 und 1) und tippt noch einmal.
  • „Linker Ctrl ohne nichts“: wechselt die Tastaturbelegung im aktiven Fenster (zwischen 0 und 1).
  • „Linker Shift ohne nichts“: aktiviert im aktiven Fenster Layout Nr. 0.
  • „Rechter Shift ohne nichts“: aktiviert im aktiven Fenster Layout Nr. 1.

Von diesem Moment an plane ich, das Verhalten anzupassen. Ohne Feedback – ist uninteressant (ich bin damit zufrieden). Ich glaube, auf Habrahabr wird es genug Publikum geben, das Ă€hnliche Probleme hat.

N.B. Da in der aktuellen Version ein Keylogger an "/dev/input/" angeschlossen wird, muss xswitcher mit Root-Rechten gestartet werden:

chown root:root xswitcher
chmod +xs xswitcher

Bitte beachten Sie: Der EigentĂŒmer der Datei mit suid muss root sein, denn wer der EigentĂŒmer ist, dessen suid wird beim Start aktiviert.

Paranoiker (ich bin da keine Ausnahme) können aus GIT klonen und direkt vor Ort bauen. UngefÀhr so:

go get "github.com/micmonay/keybd_event"
go get "github.com/gvalkov/golang-evdev"

### X11-Headers fĂŒr OpenSUSE/deb-basiert
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

Auto-Start nach Belieben hinzufĂŒgen (je nach DE).

Funktioniert, „stellt keine AnsprĂŒche“ (≈30 Sekunden CPU pro Tag, ≈12 MB in RSS).

Details

Jetzt – Details.

Das gesamte Repository war ursprĂŒnglich meinem Pet-Projekt gewidmet, und ein anderes zu starten — dazu habe ich momentan keine Lust. Also ist alles durcheinander geworfen (einfach in Ordnern) und mit AGPL („Patent umgekehrt“) versehen.

Der Code von xswitcher ist in Golang geschrieben, mit minimalen EinschĂŒben von C. Es wird angenommen, dass dieser Ansatz die geringsten Arbeitskosten verursacht (bis jetzt ist das so). Dabei wird die Möglichkeit beibehalten, Fehlendes ĂŒber cgo anzuschließen.

Im Text sind Kommentare verteilt, woher ich was entlehnt habe und warum. Da mich der Code von xneur „nicht inspiriert“ hat, habe ich als Ausgangspunkt loloswitcher.

Die Nutzung von "/dev/input/" hat sowohl Vor- als auch Nachteile. Die Nachteile sind folgende:

  • Die automatische Wiederholung (Ereignisse mit dem Code „2“) korreliert nicht mit der Wiederholung bei X.
  • Eingaben durch X11-Interfaces sind nicht sichtbar (so funktioniert zum Beispiel VNC).
  • Root-Rechte sind erforderlich.

Andererseits kann man sich ĂŒber „XSelectExtensionEvent()“ auf X-Ereignisse anmelden. Man kann im Code von xinputnachsehen. FĂŒr Go habe ich nichts Ähnliches gefunden, und die ersten Implementierungen ergaben sofort einhundert Zeilen C-Code. Momentan habe ich es beiseite gelegt.

Der „rĂŒckwĂ€rts“ ausgegebene Inhalt erfolgt derzeit durch das Anbringen einer virtuellen Tastatur. Danke an den Autor von keybd_event, aber das ist eine zu hochgradige Abstraktion, und man muss es spĂ€ter umarbeiten. Bei mir beispielsweise wĂ€hlt die rechte Win-Taste die dritte Zeile. Und es wird nur die linke Win-Taste zurĂŒckĂŒbersetzt.

Bekannte Fehler

  • Wir wissen nichts ĂŒber „kompositive“ Eingaben (Beispiel: œ). Gerade jetzt ist es nicht nötig.
  • Rechte Win wird falsch wiedergegeben. In meinem Fall zerbricht es die Platzierung der Akzente.
  • Es gibt keine nachvollziehbare Analyse der Eingaben. Stattdessen gibt es einige Funktionen: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Danke nsmcan fĂŒr die Aufmerksamkeit: Ich habe den Code hier und da korrigiert. Mit einer gewissen Wahrscheinlichkeit kann man Bugs bei den Ersetzungen abbekommen.
    An dieser Stelle weiß ich nicht, „wie es richtig geht“ und bin fĂŒr jeden Vorschlag dankbar.
  • (Oh Schreck) gleichzeitige Nutzung von KanĂ€len (keyboardEvents, miceEvents).

Fazit

Der Code ist sehr einfach und prozedural. Und dumm wie ich. Ich hoffe, dass es fast jeder Techniker schaffen kann, die gewĂŒnschten Funktionen zu implementieren. Und dieses Werk wird dadurch nicht ohne UnterstĂŒtzung untergehen wie die meisten just-for-fun.

Viel GlĂŒck!

Quelle: habr.com

60GB SSD 8Gb DDR4