xmodmapは固定されず、20秒間システムを停止します。

xmodmapは固定されず、20秒間システムを停止します。

xmodmapを使用してキーマップを編集しました。https://wiki.archlinux.org/index.php/Xmodmap、2つの問題があります。xmodmap ~/.Xmodmapこれを実行すると、システムは15〜25秒間完全に停止します。キーボードを再マップし、ログアウトや一時停止中に変更が保持されないことを考慮すると、少し奇妙です。

起動時間が20秒以上長くなり、一時停止中に目が覚めるたびに実行する必要があるのは本当に痛いです。これは正常ですか?(本当にそうではないと思いますか?)私ができることはありますか?キーボードを再マッピングする以外に他の方法がありますか?

Linux Mint 15 x64シナモン

答え1

この問題はxmodmapコマンドを使用してシステムを約20秒間停止させたときに発生しました。私のファイルに完全なキーマップがあるようです.Xmodmap。これにより、xmodmapは設定ファイルのすべての行を再マップします。

これが私がこの問題を解決した方法です。

カスタムxmodmap設定を始める前に:

# 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

答え2

xubuntu 14.04(64)とxmodmap(まったく同じキーを使用)で同じ問題があり、xmodmapの代わりにxkbを使用して解決策を見つけました。 Ubuntuでキーを再マッピングする(xkbを使用)

xkbソリューションでは、キーコードを変更するだけです。

/usr/share/X11/symbols/pc

xkbキャッシュをクリア

rm -rf /var/lib/xkb/*

それではもう遅れていません。おそらくこれはLinux Mintにも当てはまります。

答え3

xmodmap実行されると、XChangeKeyboardMapping変更する各キーに対して1回呼び出され、MappingNotifyイベントが生成されます。一部の構成(私の構成を含む)では、これらの突然のイベントによってシステムが一時的に中断される可能性があります。

カスタムキーマップを生成するときにこの問題に遭遇し、私の(醜い)解決策は、すべての修正を一度だけ呼び出すことで一度だけトリガーするXChangeKeyboardMappingCソースコードを生成するプログラムを書くことでした。MappingNotify

現在のキーマップを取得するため、このコードを実行する前にマッピングを適用する必要があります。

#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;
}

コンパイル用gcc -lX11

関連情報