xmodmap подвешивает систему на 20 секунд и не зависает

xmodmap подвешивает систему на 20 секунд и не зависает

Я отредактировал раскладку клавиатуры с помощью xmodmap, как указано ниже.https://wiki.archlinux.org/index.php/Xmodmap, и у меня возникли две проблемы: выполнение xmodmap ~/.Xmodmapполностью зависает на 15-25 секунд, что кажется немного странным, учитывая, что я просто переназначаю клавиатуру, а изменения не сохраняются при выходе из системы и даже при переходе в режим ожидания.

Это просто геморрой, когда время загрузки увеличивается на 20 секунд или больше, плюс приходится запускать его каждый раз, когда я просыпаюсь из спящего режима. Нормально ли это (я так не думаю?) и можно ли что-то сделать, возможно, альтернативный способ переназначить клавиатуру?

Linux Mint 15 x64 Cinnamon

решение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 (с точно такими же ключами), и я нашел решение, используя xkb вместо xmodmap: Переназначение клавиш в Ubuntu (используя xkb)

Решение xkb требует только изменения кодов клавиш в

/usr/share/X11/symbols/pc

и очистить кэш xkb с помощью

rm -rf /var/lib/xkb/*

У меня не было никаких задержек после этого. Возможно, это работает и с Linux Mint.

решение3

При xmodmapзапуске он вызывает XChangeKeyboardMappingодин раз для каждого измененного ключа, что генерирует MappingNotifyсобытия. В некоторых конфигурациях (включая мою) этот всплеск событий приводит к зависанию системы на некоторое время.

У меня возникла эта проблема при создании индивидуальной раскладки клавиатуры, и моим (ужасным) решением стало написание программы, которая генерирует исходный код на языке C, который применяет все изменения, вызывая их XChangeKeyboardMappingтолько один раз и, таким образом, срабатывая 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.

Связанный контент