Neuer Punto Switcher für Linux: xswitcher

Die Beendigung der xneur-Unterstützung hat mir in den letzten sechs Monaten einige Probleme bereitet (mit dem Aufkommen von OpenSUSE 15.1 auf meinen Desktops: Wenn xneur eingeschaltet ist, verlieren Fenster den Fokus und flackern amüsant im Takt der Tastatureingabe) .

"Ah, verdammt, ich habe wieder angefangen, im falschen Layout zu tippen" - das ist in meiner Arbeit oft obszön. Und fügt nicht positiv hinzu.


Gleichzeitig kann ich (als Konstrukteur) ganz klar artikulieren, was ich will. Und ich wollte (zuerst von Punto Switcher und dann dank Windows Vista, das schließlich unter Linux neu gepflanzt wurde, von xneur) genau eines. Wenn Sie feststellen, dass sich der Müll auf dem Bildschirm nicht in diesem Layout befindet (dies geschieht normalerweise am Ende eines neuen Wortsatzes), treten Sie auf „Pause / Pause“. Und hol was ich gedruckt habe.

Im Moment hat das Produkt ein optimales (aus meiner Sicht) Verhältnis von Funktionalität zu Komplexität. Es ist Zeit zu teilen.

TL.DR


Alle möglichen technischen Details werden weitergehen, also zuerst - ein "Touch" -Link für Ungeduldige.

Das folgende Verhalten ist derzeit fest codiert:

  • „Pause / Pause“: Leertaste das letzte Wort zurück, wechselt das Layout im aktiven Fenster (zwischen 0 und 1) und tippt erneut.
  • Linke Strg ohne nichts: Schaltet das Layout im aktiven Fenster um (zwischen 0 und 1).
  • "Linksverschiebung ohne irgendetwas": Aktiviert Layout 0 im aktiven Fenster.
  • „Rechtsverschiebung ohne Nichts“: Aktiviert Layout Nr. 1 im aktiven Fenster.

Von nun an plane ich, das Verhalten anzupassen. Ohne Feedback ist es nicht interessant (damit bin ich sowieso zufrieden). Ich glaube, dass es auf Habré einen ausreichenden Prozentsatz des Publikums mit ähnlichen Problemen geben wird.

NB Seit In der aktuellen Version ist der Keylogger mit "/ dev / input /" verschraubt. Xswitcher sollte mit Root-Rechten ausgeführt werden:

chown root:root xswitcher
chmod +xs xswitcher

Bitte beachten Sie: Der Eigentümer der Datei mit suid muss root sein, as Wer der Besitzer ist, ist suid und schaltet den Start ein.

Paranoide (ich bin keine Ausnahme) können von GIT klonen und sich vor Ort versammeln. Ungefähr so:

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

Autostart nach Geschmack hinzufügen (abhängig von DE).

Es funktioniert, "fragen Sie nicht nach Brei" (30 Sekunden CPU pro Tag, 12 MB in RSS).

Einzelheiten


Nun zu den Details.

Das gesamte Repository war ursprünglich meinem Lieblingsprojekt gewidmet, und das Starten eines anderen ist zu faul. Also wird alles gestapelt (nur in Ordnern) und mit AGPL abgedeckt ("Patent umgekehrt").

Der xswitcher-Code ist in Golang mit einem minimalen Spritzer C geschrieben. Es wird davon ausgegangen, dass dieser Ansatz den geringsten Aufwand verursacht (soweit dies der Fall ist). Unter Beibehaltung der Fähigkeit, die fehlenden über cgo zu verbinden.

Der Text des Kommentars ist so angelegt, wo er ausgeliehen wurde und warum. weil Der Xneur-Code „hat mich nicht inspiriert“, nahm Loloswitcher als Ausgangspunkt .

Die Verwendung von "/ dev / input /" hat seine Vorteile (alles ist zu sehen, einschließlich der gedrückten Taste mit automatischer Wiederholung) und die Minuspunkte. Nachteile sind:

  • Die automatische Wiederholung (Ereignisse mit dem Code „2“) korreliert nicht mit der Wiederholung mit X.
  • Sie können die Eingabe nicht über die X11-Schnittstellen sehen (z. B. funktioniert VNC).
  • Brauche eine Wurzel.

Alternativ können Sie X-Ereignisse über "XSelectExtensionEvent ()" abonnieren. Sie können einen Blick in den xinput-Code werfen . Für unterwegs habe ich so etwas nicht gefunden, und der Entwurf der Implementierung enthielt hundert Zeilen C-Code auf einmal. Bisher beiseite gelegt.

Die Schlussfolgerung "Zurück" wurde bisher durch Schrauben der virtuellen Tastatur gezogen. Dank des Autors keybd_event, aber es gibt zu hohe Abstraktion und muss weiter überarbeitet werden. Zum Beispiel habe ich den richtigen Win-Key, den die 3. Zeile auswählt. Und nur der linke Win wird zurückgesendet.

Bekannte Fehler


  • Wir wissen nichts über die "zusammengesetzte" Eingabe (Beispiel: ½). Es wird momentan nicht benötigt.
  • Wir reproduzieren den richtigen Gewinn falsch. In meinem Fall bricht es die Anordnung der Akzente.
  • Es gibt keine eindeutige Analyse der Eingabe. Stattdessen gibt es mehrere Funktionen: Compare (), CtrlSequence (), RepeatSequence (), SpaceSequence (). Dankensmcanzur Aufmerksamkeit: hier im Code festgelegt. Mit einer bestimmten Wahrscheinlichkeit können Sie beim Ersetzen Fehler erkennen.
    An dieser Stelle weiß ich nicht, wie es geht und freue mich über Vorschläge.
  • (Oh, Horror) wettbewerbsfähige Nutzung von Kanälen (KeyboardEvents, MäuseEvents).

Fazit


Der Code ist das einfachste Verfahren. Und dumm wie ich. Ich tröste mich mit der Hoffnung, dass fast jeder Technikfreak das beenden kann, was er will. Und dieses Produkt wird aus diesem Grund nicht ohne Unterstützung verschwinden, wie die meisten nur zum Spaß.

Viel Glück

All Articles