xmodmap은 고착되지 않고 20초 동안 시스템을 정지시킵니다.

xmodmap은 고착되지 않고 20초 동안 시스템을 정지시킵니다.

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

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

리눅스 민트 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수정하는 각 키에 대해 한 번씩 호출 되어 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.

관련 정보