Ich habe die Tastaturbelegung mit xmodmap bearbeitet, wiehttps://wiki.archlinux.org/index.php/Xmodmap, und ich habe zwei Probleme: Bei der Ausführung xmodmap ~/.Xmodmap
hängt sich das System für 15 bis 25 Sekunden komplett auf, was ein bisschen merkwürdig erscheint, wenn man bedenkt, dass ich nur die Tastaturbelegung neu anpasse, und die Änderungen bleiben beim Abmelden nicht erhalten, noch nicht einmal beim Anhalten.
Es ist ein echter Krampf, dass sich meine Startzeit um 20 Sekunden oder mehr verlängert und ich es jedes Mal ausführen muss, wenn ich aus dem Ruhezustand aufwache. Ist das normal (ich glaube nicht wirklich?) und kann ich etwas dagegen tun, vielleicht eine alternative Möglichkeit, die Tastatur neu zu belegen?
Linux Mint 15 x64 Cinnamon
Antwort1
Ich hatte dieses Problem mit dem Befehl xmodmap, das System für ca. 20 Sekunden einzufrieren. Es schien, als hätte ich die gesamte Tastenbelegung in meiner .Xmodmap
Datei, was xmodmap dazu zwang, jede Zeile in der Konfigurationsdatei neu zuzuordnen.
So habe ich das gelöst:
Vor dem Starten der benutzerdefinierten Xmodmap-Konfiguration:
# Store default xmodmap
$ xmodmap -pke > ~/.Xmodmap.default
# Backup your custom xmodmap
$ mv ~/.Xmodmap ~/.Xmodmap.bak
# Make a diff between default and custom xmodmap, and store the diff as .Xmodmap
$ diff ~/.Xmodmap.bak ~/.Xmodmap.default | grep '<' | tr '<' ' ' > ~/.Xmodmap
Antwort2
Ich hatte das gleiche Problem unter xubuntu 14.04 (64) und xmodmap (mit genau denselben Schlüsseln) und habe eine Lösung gefunden, bei der ich xkb statt xmodmap verwendet habe: Tastenzuordnung in Ubuntu (mit xkb)
Die xkb-Lösung erfordert lediglich die Änderung der Schlüsselcodes in
/usr/share/X11/symbols/pc
und leeren Sie den XKB-Cache durch
rm -rf /var/lib/xkb/*
Ich hatte danach keine Verzögerungen. Vielleicht funktioniert das auch mit Linux Mint.
Antwort3
Wenn xmodmap
es ausgeführt wird, wird es XChangeKeyboardMapping
einmal für jeden geänderten Schlüssel aufgerufen, wodurch MappingNotify
Ereignisse generiert werden. In einigen Konfigurationen (einschließlich meiner) führt dieser Ereignisausbruch dazu, dass das System für einige Zeit hängen bleibt.
Ich hatte dieses Problem beim Erstellen einer benutzerdefinierten Tastaturbelegung und meine (hässliche) Problemumgehung bestand darin, ein Programm zu schreiben, das den C-Quellcode generiert, der alle Änderungen durch nur einmaligen Aufruf anwendet und somit nur einmal XChangeKeyboardMapping
auslöst .MappingNotify
Bevor Sie diesen Code ausführen, müssen Sie Ihre Zuordnung anwenden, da diese die aktuelle Tastaturzuordnung erhält.
#include <stdlib.h>
#include <stdio.h>
#include <X11/XKBlib.h>
int main(void) {
Display* display;
int min, max, i, j, k;
int keysyms_per_keycode;
KeySym* keysyms;
display = XOpenDisplay(NULL);
XDisplayKeycodes(display, &min, &max);
keysyms = XGetKeyboardMapping(display, min, max-min, &keysyms_per_keycode);
printf("#include <stdlib.h>\n");
printf("#include <stdio.h>\n");
printf("#include <X11/XKBlib.h>\n\n");
printf("int main(void) {\n");
printf(" int first_keycode = %d;\n", min);
printf(" int keysyms_per_keycode = %d;\n", keysyms_per_keycode);
printf(" int num_of_keycodes = %d;\n", max-min);
printf(" KeySym keysyms[%d] = {", ((max-min) * keysyms_per_keycode) + 1);
for (k = 0, i = 0; i < (max-min); i++) {
for (j = 0; j < keysyms_per_keycode; j++) {
printf("%ld,", keysyms[k++]);
}
}
printf("0};\n");
printf(" Display* display = XOpenDisplay(NULL);\n");
printf(" XChangeKeyboardMapping(display,first_keycode,keysyms_per_keycode,keysyms,num_of_keycodes);\n");
printf(" XCloseDisplay(display);\n");
printf(" return 0;\n");
printf("}\n");
XFree(keysyms);
XCloseDisplay(display);
return 0;
}
Kompilieren mit gcc -lX11
.