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.

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 â 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 xswitcherBitte 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 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 .
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 nachsehen. 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 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
