Wie lassen sich alle Anwendungen auf mein modifiziertes Xkb-Layout anwenden?

1766
nonpop

Ich mag es nicht, zwischen der Haupttastatur und den Bewegungstasten zu springen. Daher fügte ich meiner Xkb-Layoutdatei Folgendes hinzu.

hidden partial xkb_symbols "movement" { key <AD08> { [ NoSymbol, NoSymbol, Up, Up ] }; key <AC08> { [ NoSymbol, NoSymbol, Down, Down ] }; key <AC07> { [ NoSymbol, NoSymbol, Left, Left ] }; key <AC09> { [ NoSymbol, NoSymbol, Right, Right ] }; key <AD09> { [ NoSymbol, NoSymbol, Prior, Prior ] }; key <AB09> { [ NoSymbol, NoSymbol, Next, Next ] }; key <AB07> { [ NoSymbol, NoSymbol, Home, Home ] }; key <AB08> { [ NoSymbol, NoSymbol, End, End ] }; key <AC06> { [ NoSymbol, NoSymbol, Delete, Delete ] }; } 

Dann füge ich diese dem Layout zu einem späteren Zeitpunkt in die Datei ein. Jetzt sollten die Cursortasten über AltGr + j, k, l, i (oder h, t, n, c, da ich dvorak verwende) erreichbar sein. Dies funktioniert in vielen Fällen (wie Firefox, urxvt, Eclipse, the Haupttextbereich von LyX), aber einige Programme tun nichts, wenn ich versuche, den Cursor mit diesen "Shortcuts" (wie NetBeans- und LyX-Dialogfeldern) zu bewegen.

Gibt es eine Möglichkeit, dass diese anderen Programme auch meine Wünsche berücksichtigen? Und warum arbeiten sie überhaupt nicht? Ich benutze keine DE; nur das Awesome WM.

Bearbeiten:

  • Hier ist eine vollständige, aber vereinfachte Tastaturlayoutdatei. Ich habe das als /usr/share/X11/xkb/symbols/nonpopund ich lade es mit setxkbmap nonpop.
  • Mir ist aufgefallen, dass sich in MonoDevelop die Arbeit bewegt, die Auswahl jedoch nicht. Das heißt, wenn ich die Umschalttaste + Rechts drücke, wird der Text wie gewohnt ausgewählt, aber wenn ich die Tastenkombination AltGr + Umschalttaste + n drücke, bewegt sich der Cursor ohne Auswahl. In Firefox können zum Beispiel beide Möglichkeiten zum Auswählen verwendet werden.
  • Am Ende sprechen sie hier von Overlays, die wie eine Lösung aussehen, aber ich habe nicht herausgefunden, wie man sie benutzt.
11
Ich habe keine Lösung, aber wenn Sie trotz der Kopfprämie, die Sie einsetzen, keine Antwort bekommen, könnten Sie versuchen, an [unix.SE] (https://unix.stackexchange.com/) zu fragen Unix / Linux-zentrierte Stackexchange-Site. Glutanimate vor 10 Jahren 1

2 Antworten auf die Frage

9
Chel

Warum arbeiten sie nicht?

Gemäß dem Artikel von ArchWiki, den Sie erwähnt haben:

  • Der X-Server erhält die Schlüsselcodes vom Eingabegerät und konvertiert sie in den Zustand und das Schlüsselwort .

    • state ist die Bitmaske der X-Modifikatoren (Ctrl / Shift / etc).

    • keysym ist (entsprechend /usr/include/X11/keysymdef.h) die ganze Zahl

      Zeichen oder Funktionen identifizieren, die jeder Taste zugeordnet sind (z. B. über die sichtbare Gravur) eines Tastaturlayouts.

      Jedes druckbare Zeichen hat seine eigene keysym, wie plus, a, Aoder Cyrillic_aaber andere Tasten auch ihre Keysyms erzeugen, wie Shift_L, Leftoder F1.

  • Die Anwendung in den Tastendruck- / Veröffentlichungsereignissen erhält alle diese Informationen.

    Einige Anwendungen verfolgen Keysyms wie Control_Lvon selbst, andere suchen nur nach den Modifikatorbits im Status .

Was passiert also, wenn Sie AltGr+ drücken j:

  • Sie drücken AltGr. Die Anwendung erhält das KeyPressed-Ereignis mit dem Schlüsselcode 108 ( <RALT>) und keysym 0xfe03 ( ISO_Level3_Shift). Der Status ist 0.

  • Sie drücken j(was in dvorak ohne Modifikatoren auf "h" kartiert). Die Anwendung erhält ein KeyPressed-Ereignis mit dem Schlüsselcode 44 ( <AC07>), keysym 0xff51 ( Left) und dem Status 0x80 (Modifier Mod5 ist aktiviert).

  • Sie lassen los j. Die Anwendung erhält das KeyRelease-Ereignis für den Schlüssel <AC07>/ Leftmit den gleichen Parametern.

  • Dann geben Sie das AltGrKeyRelease-Ereignis für AltGr frei. (Übrigens ist der Zustand hier immer noch 0x80, aber das spielt keine Rolle.)

Dies ist sichtbar, wenn Sie das xevDienstprogramm ausführen .

Das bedeutet also, dass die Anwendung zwar den gleichen keysym-Code ( Left) erhält wie der normale Schlüssel <LEFT>, aber auch den keysym-Code und den Status des Modifizierers von der AltGr. Höchstwahrscheinlich beobachten die Programme, die nicht funktionieren, die Modifikatoren und möchten nicht funktionieren, wenn einige aktiv sind.

Wie können sie funktionieren?

Anscheinend können wir nicht jedes Programm ändern, um nicht nach Modifikatoren zu suchen. Die einzige Möglichkeit, dieser Situation zu entgehen, besteht darin, die Keysyms und Statusbits der Modifikatoren nicht zu erzeugen.

1. Separate Gruppe

Die einzige Methode, die mir einfällt, ist: Cursor - Bewegungstasten in einer separaten Gruppe und Schalter, mit einer separaten Taste drücken, um die Gruppe zu den Tasten vor definieren j, k, l, i( h, t, n, c) (Gruppe Verrastung ist die bevorzugte Methode für eine Zeit Gruppenwechsel, wie ich es verstehe).

Zum Beispiel:

xkb_keymap { xkb_keycodes { include "evdev+aliases(qwerty)" }; xkb_types { include "complete" }; xkb_compatibility { include "complete"  interpret ISO_Group_Latch { action = LatchGroup(group=2); }; }; xkb_symbols { include "pc+us(dvorak)+inet(evdev)"  key <RALT> { [ ISO_Group_Latch ] };  key <AC07> { type[Group2] = "ONE_LEVEL", symbols[Group2] = [ Left ] }; key <AC08> { type[Group2] = "ONE_LEVEL", symbols[Group2] = [ Down ] }; key <AC09> { type[Group2] = "ONE_LEVEL", symbols[Group2] = [ Right ] }; key <AD08> { type[Group2] = "ONE_LEVEL", symbols[Group2] = [ Up ] }; }; xkb_geometry { include "pc(pc104)" }; }; 

Wenn Sie jetzt zuerst AltGrund dann (separat) eine der Bewegungstasten drücken, sollte dies funktionieren.

Dies ist jedoch nicht sehr nützlich. Es wäre sinnvoller, LockGroup anstelle von Latch und AltGr vor und nach dem Gruppenwechsel zu drücken. Vielleicht noch besser SetGroup- dann würde AltGr diese Gruppe nur auswählen, wenn sie gedrückt wird, aber dies zeigt den Anwendungen AltGrs keysym ( ISO_Group_Shift/ ISO_Group_Latch/ was auch immer definiert ist) (aber der Status des Modifizierers bleibt sauber).

Es gibt aber auch die Möglichkeit, dass die Anwendung auch Keycodes (die Codes der echten Schlüssel) liest. Dann werden die "falschen" Cursortasten angezeigt.

2. Überlagerung

Die eher "Low-Level" -Lösung wäre die Überlagerung (wie im selben Artikel beschrieben).

Überlagerung bedeutet einfach, dass einige Tasten (echte Tastatur) den Keycode einer anderen Taste zurückgeben. Der X-Server ändert den Schlüsselcode eines Schlüssels und berechnet den Status des Modifizierers und das Schlüsselsymbol für diesen neuen Schlüsselcode, sodass die Anwendung die Änderung nicht bemerken sollte.

Overlays sind jedoch sehr begrenzt:

  • Es gibt nur 2 Overlay-Steuerbits im X-Server (dh es können maximal 2 Overlays vorhanden sein).
  • Jeder Schlüssel kann nur einen alternativen Schlüsselcode haben.

Im übrigen ist die Implementierung der Methode mit einer separaten Gruppe sehr ähnlich:

xkb_keymap { xkb_keycodes { include "evdev+aliases(qwerty)" }; xkb_types { include "complete" }; xkb_compatibility { include "complete"  interpret Overlay1_Enable { action = SetControls(controls=overlay1); }; }; xkb_symbols { include "pc+us(dvorak)+inet(evdev)"  key <RALT> { type[Group1] = "ONE_LEVEL", symbols[Group1] = [ Overlay1_Enable ] }; key <AC07> { overlay1 = <LEFT> }; key <AC08> { overlay1 = <DOWN> }; key <AC09> { overlay1 = <RGHT> }; key <AD08> { overlay1 = <UP> }; }; xkb_geometry { include "pc(pc104)" }; }; 

SetControlsbedeutet, das Steuerbit bei gedrückter Taste zu ändern und bei der Tastenfreigabe wieder herzustellen. Es sollte eine ähnliche Funktion geben LatchControls, xkbcompgibt mir aber

Error: Unknown action LatchControls 

auf der Keymap-Kompilierung.

(Übrigens benutze ich auch Dvorak und habe einige Bewegungs-Keysymptome auf hohe alphabetische Tastenbelegungen umgestellt. Außerdem sind einige fehlerhafte Funktionen aufgetreten (Auswahl in Xfce-Notizen und Desktop-Schalter durch Strg-Alt-Links / Rechts) deine Frage und diese Antwort, jetzt weiß ich, was eine Überlagerung ist :).)

Vielen Dank! Ich erhielt tatsächlich eine weitere Antwort auf [unix.se] (http://unix.stackexchange.com/questions/153841/how-to-make-altgri-jkl-work-properly-as-cursor-keys), die auf den ersten Blick wie es schien um perfekt zu sein, stellte sich jedoch heraus, dass sich einige Anwendungen immer noch schlecht benommen haben. Diese Lösung (Overlays) funktioniert auch in diesen Fällen. nonpop vor 9 Jahren 0
Mir ist gerade aufgefallen, dass google chrom [e | ium] sich auch nicht darum kümmert! :( Zum Glück benutze ich sie nicht viel. nonpop vor 9 Jahren 0
@nonpop gottverdammtes Chrom… Ich habe meiner Antwort https://superuser.com/a/1000320/521612 ein Update hinzugefügt Aleks-Daniel Jakimenko vor 7 Jahren 0
Tolle! Ich habe seit Jahren danach gesucht! Es gibt immer noch ein kleines Problem mit Chromium, bei dem ein Tastendruck von `Overlay1_Enable` interpretiert wird. Ich habe das gleiche Symptom wie hier: https://github.com/GalliumOS/galliumos-distro/issues/362 Tarrasch vor 6 Jahren 0
Ich habe gerade das obige Problem behoben. Die Pfeiltasten meiner Home-Reihe funktionieren jetzt auch in Chromium! Ich brauchte die folgende Änderung an dieser Antwort. https://gist.github.com/Tarrasch/1293692/revisions?diff=unified#diff-170987db8deaa0865033ae2715f45dce Tarrasch vor 6 Jahren 0
3
Aleks-Daniel Jakimenko

Ich habe das gleiche Problem. Es ist so schmerzhaft.

Der Titel lautet also "Wie kann man machen, dass alle Anwendungen mein modifiziertes Xkb-Layout berücksichtigen?". Nun, ich denke, die einzige Möglichkeit besteht darin, alle Programme zu reparieren, die es falsch machen. Lass uns das tun!

Nun, nachdem ich diesen Fehler in NetBeans gemeldet habe ( Update: Ich habe die neueste Version ausprobiert und funktioniert jetzt! ), Dachte ich, dass ich diesen Fehler weiterhin für jede Anwendung melden werde. Die nächste Anwendung auf der Liste war Speedcrunch .

Nachdem ich nach ähnlichen Fehlerberichten gesucht hatte, fand ich dieses Problem . Jemand anderes hat das gleiche Problem, großartig!

Nachdem Sie die Kommentare gelesen haben, werden Sie verstehen, dass dieser Fehler in allen QT-Apps vorhanden sein sollte. Hier ist ein QT-Fehlerbericht . Nicht gelöst, aber es scheint, als wäre das Problem in Qt5 gelöst .

Wenn Sie sich jedoch die Kommentare ansehen, gibt es eine Problemumgehung! So funktioniert es. Wenn du das machst:

key <SPCE> { [ ISO_Level3_Shift ] }; 

Dann kannst du es ändern:

key <SPCE> { type[Group1]="ONE_LEVEL", symbols[Group1] = [ ISO_Level3_Shift ] }; 

Und es wird tatsächlich das Problem für einige Anwendungen lösen! Zum Beispiel funktioniert Speedcrunch jetzt für mich! Yay!

Zusammenfassung

Im Moment sollte jede Anwendung korrekt funktionieren. Wenn dies nicht der Fall ist, müssen Sie verwenden type[Group1]="ONE_LEVEL". Wenn Sie es bereits haben, müssen Sie Ihre Software aktualisieren. Wenn es immer noch nicht funktioniert, ist es app-spezifisch und Sie müssen einen Fehlerbericht einreichen.

UPDATE (2017-09-23)

Bis heute respektieren alle Anwendungen mein Tastaturlayout. Alle bis auf einen.

Im Ernst, die Handhabung von Tastaturen in Chrom ist Müll . Es gibt mehrere Probleme damit:

  • Die Umschaltauswahl funktioniert nicht mit benutzerdefinierten Pfeiltasten (die Pfeiltasten funktionieren jedoch in Ordnung)
  • Wenn Sie über mehrere Layouts verfügen und in einem der Layouts einige Tasten speziell sind (z. B. Pfeile, Rücktaste usw.), wird dieser bei einem anderen Layout auf das fixiert, was Sie in Ihrem ersten Layout haben. Zum Beispiel, wenn Sie zwei Layouts: foo, barund einige Schlüssel tun Rück in foo, dann wird es halten, wie Rück arbeitet in, barauch wenn es dort neu definiert wird.

Ich habe diese Probleme jahrelang ignoriert, indem ich einfach kein Chrom verwendet habe. Heutzutage wird jedoch meistens Electron verwendet, das leider auf Chrom aufgebaut ist.

Der richtige Weg, dieses Problem zu lösen, wäre, einen Fehlerbericht in Chromium einzureichen und auf das Beste zu hoffen. Ich weiß nicht, wie lange es dauern wird, um ein Problem zu lösen, das nur einige Benutzer betrifft… aber das scheint der einzige Ausweg zu sein. Das Problem dabei ist, dass Chrom mit dem neo(de)Layout gut funktioniert . Neo-Layout hat auf Level5 Pfeiltasten, aber ich kann es nicht in meinem benutzerdefinierten Layout schaffen.

Noch offene Fehlerberichte:

Danke für die Information! Die Problemumgehung hilft mir nicht, also muss ich einfach Fehler melden und auf Qt5-Konvertierungen warten. nonpop vor 9 Jahren 0