Neue Alternative zu Punto Switcher für Linux: xswitcher

Die Einstellung der Unterstützung für xneur hat mir in den letzten sechs Monaten große Mühe bereitet. (Seit der Einführung von OpenSUSE 15.1 auf meinen Desktops: Wenn xneur aktiv ist, verlieren Fenster den Fokus und blitzen unterhaltsam im Takt der Tastatureingaben.).

„Ach, verdammte Axt, schon wieder im falschen Layout angefangen zu tippen“ – das kommt in meiner Arbeit viel zu oft vor. Und das macht es nicht besser.

Neue Alternative zu Punto Switcher für Linux: xswitcher
Gleichzeitig kann ich (als Ingenieur) ziemlich klar formulieren, was ich will. Und ich wollte (anfangs von Punto Switcher, und dann, dank Windows Vista, endgültig auf Linux umgestiegen, von xneur) genau das eine. Ich wollte merken, dass auf dem Bildschirm ein Durcheinander im falschen Layout erscheint (das passiert normalerweise am Ende der Eingabe eines neuen Wortes), dann auf „Pause/Brechen“ drücken. Und bekommen, was ich getippt habe.

Derzeit hat das Produkt ein optimales (von meiner Sichtweise aus) Verhältnis von Funktionalität zu Komplexität. Es ist Zeit, das zu teilen.

TL.DR

Nun folgen verschiedene technische Details, daher zuerst – Link zum Ausprobieren für Ungeduldige.

Derzeit ist das folgende Verhalten fest codiert:

  • „Pause/Break“: löscht das letzte Wort (Backspace), wechselt die Eingabesprache im aktiven Fenster (zwischen 0 und 1) und gibt es erneut ein.
  • „Linker Ctrl ohne nichts“: wechselt die Eingabesprache im aktiven Fenster (zwischen 0 und 1).
  • „Linker Shift ohne nichts“: aktiviert im aktiven Fenster die Eingabesprache Nr. 0.
  • „Rechter Shift ohne nichts“: aktiviert im aktiven Fenster die Eingabesprache Nr. 1.

Ab diesem Zeitpunkt plane ich, das Verhalten anzupassen. Ohne Feedback macht es keinen Spaß (ich bin damit bereits zufrieden). Ich denke, es wird auf Habr einen ausreichenden Prozentsatz von Nutzern geben, die ähnliche Probleme haben.

N.B. Da der aktuelle Keylogger an „/dev/input/“ angeschlossen ist, muss xswitcher mit Root-Rechten gestartet werden:

chown root:root xswitcher
chmod +xs xswitcher

Bitte beachten: Der Besitzer der Datei mit suid muss root sein, da der Besitzer bei der Ausführung zu suid wird.

Paranoide (ich bin keine Ausnahme) können von GIT klonen und lokal bauen. Etwa so:

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

### X11-Header für OpenSUSE/Debian-basierte Systeme
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

Autostart nach Belieben hinzufügen (je nach Desktop-Umgebung).

Funktioniert, „fordert keine großen Ressourcen“ (≈30 Sekunden CPU pro Tag, ≈12 MB im RSS).

Details

Jetzt — Details.

Das gesamte Repository war ursprünglich meinem Hobbyprojekt gewidmet, und einen anderen zu starten, ist mir momentan zu mühsam. Daher ist alles in eine Sammlung geworfen (einfach nach Ordnern) und unter AGPL („Patent umkehren“) gestellt.

Der xswitcher-Code ist in Golang geschrieben, mit minimalen Einsprengseln in C. Dieser Ansatz soll den geringsten Arbeitsaufwand ermöglichen (bisher funktioniert es so). Gleichzeitig bleibt die Möglichkeit, fehlende Teile über cgo anzuschließen.

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

Die Verwendung von "/dev/input/" hat sowohl Vorteile (man sieht alles, einschließlich der gedrückten Taste mit automatischer Wiederholung) als auch Nachteile. Die Nachteile sind:

  • Die automatische Wiederholung (Ereignisse mit dem Code „2“) korreliert nicht mit der Wiederholung über X.
  • Eingaben über die X11-Schnittstellen sind nicht sichtbar (zum Beispiel funktioniert VNC nicht so).
  • Root-Rechte notwendig.

Andererseits kann man sich über „XSelectExtensionEvent()“ auf X-Ereignisse abonnieren. Das kann man im xinput-Codenachsehen. Für Go habe ich nichts Vergleichbares gefunden, und der Entwurf brachte sofort hundert Zeilen C-Code. Bis jetzt habe ich es beiseite gelegt.

Die Rückgabe erfolgt momentan über die Anbindung einer virtuellen Tastatur. Danke an den Autor keybd_event, aber das ist eine zu hochstufige Abstraktion und muss weiter bearbeitet werden. Bei mir wählt die rechte Win-Taste die 3. Reihe. Und nur die linke Win-Taste wird zurückübersetzt.

Bekannte Fehler

  • Wir wissen nichts über die Eingabe von «Kompound» (Beispiel: ½). Im Moment wird es nicht benötigt.
  • Die rechte Win-Taste wird falsch wiedergegeben. In meinem Fall beeinflusst es die Anordnung der Akzente.
  • Es gibt keine klare Analyse der Eingabe. Stattdessen gibt es mehrere Funktionen: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Danke nsmcan Für die Aufmerksamkeit: ich habe den Code hier angepasst. Mit einer gewissen Wahrscheinlichkeit kann man Bugs bei der Ersetzung erhalten.
    An dieser Stelle weiß ich nicht, wie es sein sollte, und ich würde mich über alle Vorschläge freuen.
  • (Oh Schreck) Konkurrentenutzung von Kanälen (keyboardEvents, miceEvents).

Fazit

Der Code ist das einfachste prozedurale. Und so dumm wie ich. Ich gebe mir also die Hoffnung, dass fast jeder Techniker das Gewünschte hinzufügen kann. Und dieses Produkt wird dadurch nicht ohne Unterstützung verschwinden, wie die meisten just-for-fun.

Viel Erfolg!

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster