xmodmap이 시스템을 20초 동안 정지시키고 고착되지 않음

xmodmap이 시스템을 20초 동안 정지시키고 고착되지 않음

xmodmap을 사용하여 키보드 맵을 편집했습니다.https://wiki.archlinux.org/index.php/Xmodmap, 그리고 두 가지 문제가 있습니다. 실행하면 xmodmap ~/.Xmodmap15-25초 동안 시스템이 완전히 중단됩니다. 키보드를 다시 매핑하고 있으며 변경 사항이 로그오프 시에도 적용되지 않고 일시 중지 시에도 변경 사항이 적용되지 않는다는 점을 고려하면 약간 이상해 보입니다.

부팅 시간이 20초 이상 늘어나고 일시정지 상태에서 깨어날 때마다 이를 실행해야 하는 것은 정말 골치 아픈 일입니다. 이것이 정상입니까(정말 그렇게 생각하지 않습니까?) 제가 할 수 있는 일이 있습니까? 키보드를 다시 매핑하는 다른 방법이 있을까요?

리눅스 민트 15 x64 시나몬

답변1

~20초 동안 시스템을 정지시키는 xmodmap 명령에 이 문제가 있었습니다. 내 파일에 전체 키맵이 있는 것으로 나타났으며 .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생성합니다 MappingNotify. 일부 구성(내 구성 포함)에서는 이러한 이벤트 급증으로 인해 시스템이 한동안 중단됩니다.

XChangeKeyboardMapping사용자 정의 키보드 맵을 생성하는 동안 이 문제가 발생했으며, 내 (추악한) 해결 방법은 한 번만 호출하여 모든 수정 사항을 적용하여 MappingNotify한 번만 트리거 하는 C 소스 코드를 생성하는 프로그램을 작성하는 것이었습니다 .

이 코드를 실행하기 전에 현재 키보드 매핑을 가져오므로 맵을 적용해야 합니다.

#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

관련 정보