Ich mag es nicht, zwischen der Haupttastatur und den Bewegungstasten zu springen, deshalb habe ich meiner xkb-Layoutdatei Folgendes hinzugefügt.
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 zu einem späteren Zeitpunkt in die Datei ein. Jetzt sollte ich die Cursortasten über AltGr + j, k, l, i (oder h, t, n, c, wie ich dvorak verwende) usw. haben. Dies funktioniert in vielen Fällen (wie Firefox, urxvt, Eclipse, the Haupttextbereich von LyX), aber einige Programme tun nichts, wenn ich beispielsweise versuche, den Cursor mit diesen "Verknüpfungen" zu bewegen (wie NetBeans- und LyX-Dialoge).
Gibt es eine Möglichkeit, diese anderen Programme dazu zu bringen, auch meine Wünsche zu respektieren? Und warum arbeiten sie überhaupt nicht? Ich benutze kein DE; nur die Awesome WM.
Bearbeiten:
- Hier ist eine vollständige, aber vereinfachte Tastaturlayoutdatei. Ich habe das als
/usr/share/X11/xkb/symbols/nonpop
und lade es mitsetxkbmap nonpop
. - Mir ist aufgefallen, dass in MonoDevelop das Bewegen funktioniert, das Auswählen jedoch nicht. Das heißt, wenn ich Umschalt + Rechts drücke, wird der Text wie gewohnt ausgewählt, aber wenn ich AltGr + Umschalt + n drücke, bewegt sich der Cursor nur ohne Auswahl. In Firefox können beispielsweise beide Möglichkeiten zur Auswahl verwendet werden.
- Hier sprechen sie am Ende über Overlays, die wie eine Lösung aussehen könnten, aber ich habe nicht herausgefunden, wie man sie verwendet.
quelle
Antworten:
Warum funktionieren sie nicht?
Laut dem von Ihnen erwähnten Artikel im ArchWiki :
Der X-Server erhält Schlüsselcodes vom Eingabegerät und konvertiert sie in den Status und das Keysym .
state ist die Bitmaske der X-Modifikatoren (Strg / Umschalt / etc).
Keysym ist (nach
/usr/include/X11/keysymdef.h
) der ganzen Zahl, dieJedes druckbare Zeichen hat seine eigene keysym, wie
plus
,a
,A
oderCyrillic_a
, aber auch andere Schlüssel erzeugen auch ihre Keysyms, wieShift_L
,Left
oderF1
.Die Anwendung in den wichtigsten Presse- / Release-Ereignissen erhält alle diese Informationen.
Einige Anwendungen verfolgen Keysyms wie
Control_L
von 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 dem Keysym 0xfe03 (ISO_Level3_Shift
). Der Status ist 0.Sie drücken j(was in dvorak ohne Modifikatoren „h“ zugeordnet ist). Die Anwendung erhält das KeyPressed-Ereignis mit dem Schlüsselcode 44 (
<AC07>
), dem Keysym 0xff51 (Left
) und dem Status 0x80 (Modifikator Mod5 ist aktiviert).Sie freigeben j. Die Anwendung erhält das KeyRelease-Ereignis für den Schlüssel
<AC07>
/Left
mit denselben Parametern.Dann Release AltGr- KeyRelease-Ereignis für AltGr. (Übrigens ist der Zustand hier immer noch 0x80, aber das spielt keine Rolle.)
Dies wird angezeigt, wenn Sie das
xev
Dienstprogramm ausführen .Das alles bedeutet also, dass die Anwendung zwar denselben Keysym-Code (
Left
) wie der normale Schlüssel<LEFT>
erhält, aber auch den Keysym-Code und den Modifikatorstatus von AltGr. Höchstwahrscheinlich beobachten Programme, die nicht funktionieren, die Modifikatoren und möchten nicht funktionieren, wenn einige aktiv sind.Wie man sie zum Laufen bringt
Anscheinend können wir nicht jedes Programm so ändern, dass es nicht nach Modifikatoren sucht. Die einzige Möglichkeit, dieser Situation zu entkommen, besteht darin, keine Schlüsselsymbole und Statusbits der Modifikatoren zu generieren.
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 definieren , bevor die Schlüssel zu drücken j, k, l, i(
h
,t
,n
,c
) (Gruppe Rast ist die bevorzugte Methode für einen einmaligen Gruppenwechsel, wie ich verstehe).Beispielsweise:
Wenn Sie jetzt zuerst AltGrund dann (separat) eine der Bewegungstasten drücken , sollte dies funktionieren.
Dies ist jedoch nicht sehr nützlich. Besser wäre es,
LockGroup
vor und nach dem Gruppenwechsel anstelle von Latch AltGr zu drücken und zu drücken. Auch kann besser sein,SetGroup
- dann AltGr diese Gruppe wählen würde nur während gedrückt wird, aber das ist bekannt , auf die Anwendungen AltGr des keysym (ISO_Group_Shift
/ISO_Group_Latch
/ was auch immer definiert ist) (aber Modifikator Zustand bleibt sauber).Aber ... es besteht auch die Möglichkeit, dass die Anwendung auch Schlüsselcodes (die Codes der realen Schlüssel) liest. Dann werden die "falschen" Cursortasten bemerkt.
2. Überlagerung
Die "Low-Level" -Lösung wäre das Overlay (wie im selben Artikel beschrieben).
Überlagerung bedeutet einfach, dass eine (echte Tastatur-) Taste den Schlüsselcode einer anderen Taste zurückgibt. Der X-Server ändert den Schlüsselcode eines Schlüssels und berechnet den Modifikatorstatus und das Schlüsselsymbol für diesen neuen Schlüsselcode, sodass die Anwendung die Änderung nicht bemerken sollte.
Überlagerungen sind jedoch sehr begrenzt:
Im Übrigen ähnelt die Implementierung der Methode mit einer separaten Gruppe:
SetControls
bedeutet, das Steuerbit zu ändern, während die Taste gedrückt wird, und es bei der Tastenfreigabe wiederherzustellen. Es sollte eine ähnliche Funktion gebenLatchControls
,xkbcomp
gibt mir aberauf Keymap-Kompilierung.
(Übrigens verwende ich auch dvorak und habe einige Bewegungstasten auf hohe Ebenen alphabetischer Tasten neu zugeordnet. Außerdem bin ich auf einige Funktionsstörungen gestoßen (Auswahl in Xfce-Notizen und Desktop-Schalter durch Strg-Alt-Links / Rechts). Dank deine Frage und diese Antwort, jetzt weiß ich was ein Overlay ist :).)
quelle
Overlay1_Enable
. Ich habe das gleiche Symptom wie hier: github.com/GalliumOS/galliumos-distro/issues/362Ich habe das gleiche Problem. Es ist so schmerzhaft.
Der Titel lautet also „Wie können alle Anwendungen mein geändertes xkb-Layout respektieren?“. Nun, ich denke, der einzige Weg ist, alle Programme zu reparieren, die es falsch machen. Lass uns das tun!
Nachdem ich diesen Fehler in NetBeans gemeldet hatte ( Update: Ich habe die neueste Version ausprobiert und sie 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, dass das Problem in Qt5 gelöst ist .
Wenn Sie sich jedoch die Kommentare ansehen, gibt es eine Problemumgehung! So funktioniert es. Wenn Sie dies taten:
Dann können Sie es folgendermaßen ändern:
Und es wird tatsächlich das Problem für einige der Anwendungen lösen! Zum Beispiel funktioniert Speedcrunch jetzt für mich! Yay!
Zusammenfassung
Im Moment sollte jede Anwendung korrekt funktionieren. Wenn nicht, 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 (23.09.2017)
Ab heute respektieren alle Anwendungen mein Tastaturlayout. Alle bis auf einen.
Im Ernst, die Handhabung der Tastatur in Chrom ist Müll . Es gibt mehrere Probleme damit:
foo
,bar
und einige Schlüssel tun Rück infoo
, dann wird es halten , wie Rück arbeitet in ,bar
auch wenn es dort neu definiert wird.Ich habe diese Probleme jahrelang ignoriert, indem ich einfach kein Chrom verwendet habe. Heutzutage tendieren die Dinge jedoch dazu, Electron zu verwenden , das leider auf Chrom aufgebaut ist.
Der richtige Weg, dies zu beheben, wäre, einen Fehlerbericht in Chromium einzureichen und auf das Beste zu hoffen. Ich weiß nicht, wie lange sie brauchen werden, 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 tatsächlich gut mit dem
neo(de)
Layout funktioniert . Das Neo-Layout verfügt über Pfeiltasten auf Ebene 5, aber ich kann es in meinem benutzerdefinierten Layout nicht zum Laufen bringen.Noch offene Fehlerberichte:
quelle
So funktionieren sie - Lösung 3
Verwenden zusätzlicher Ebenen und Aktion RedirectKey
Die folgende Lösung verwendet die linke Alt-Taste, um Cursortasten auf jkli, Home / End / PageUp / PageDown auf uopö und Löschen auf der Rücktaste bereitzustellen.
Die linke Alt-Taste kann für alle anderen Tasten (wie für das Anwendungsmenü) für andere Zwecke verwendet werden. Das linke Alt (Mod1) wird aus dem Modifikatorstatus entfernt, wenn der Cursorblock verwendet wird, sodass Anwendungen ihn nicht sehen können.
quelle