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
イベントが生成されます。一部の構成(私の構成を含む)では、これらの突然のイベントによってシステムが一時的に中断される可能性があります。
カスタムキーマップを生成するときにこの問題に遭遇し、私の(醜い)解決策は、すべての修正を一度だけ呼び出すことで一度だけトリガーするXChangeKeyboardMapping
Cソースコードを生成するプログラムを書くことでした。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
。