xmodmap зависание системы для 20 secs и не липкий

В дополнение к ответу vonbrand, и по-видимому не, что Вы испытали, но конечно что я испытал, собственные драйверы NVIDIA до выпуска 310.40 (и бета драйверы 313.09 и ранее) были трудно кодированы для проверки на версии ядра и только работали на ядра до 3.7.6.

Для использования собственных драйверов с ядром 3.7.6 или позже, даже с восстанавливанием, одно, любой должен был изменить источник к драйверу (не трудный) или использовать более новый драйвер (310,40 работ).

6
10.10.2013, 01:19
3 ответа

У меня была такая же проблема на xubuntu 14.04 (64) и xmodmap (с точно такими же ключами) и я нашел решение, используя xkb вместо xmodmap: Remapping Keys in Ubuntu (using xkb)

Решение xkb требует только изменить ключевые коды в

/usr/share/X11/symbols/pc

и очистить кэш xkb на

rm -rf /var/lib/xkb/*

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

1
27.01.2020, 20:28

При запуске 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.

0
27.01.2020, 20:28

У меня была проблема с командой 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
7
27.01.2020, 20:28

Теги

Похожие вопросы