xmodmap hängt das System für 20 Sekunden und bleibt nicht hängen

xmodmap hängt das System für 20 Sekunden und bleibt nicht hängen

Ich habe die Tastaturbelegung mit xmodmap bearbeitet, wiehttps://wiki.archlinux.org/index.php/Xmodmap, und ich habe zwei Probleme: Bei der Ausführung xmodmap ~/.Xmodmaphä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 .XmodmapDatei, 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 xmodmapes ausgeführt wird, wird es XChangeKeyboardMappingeinmal für jeden geänderten Schlüssel aufgerufen, wodurch MappingNotifyEreignisse 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 XChangeKeyboardMappingauslö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.

verwandte Informationen