xmodmap travando o sistema por 20 segundos e não travando

xmodmap travando o sistema por 20 segundos e não travando

Editei o mapa do teclado usando xmodmap conformehttps://wiki.archlinux.org/index.php/Xmodmap, e tenho dois problemas: a execução xmodmap ~/.Xmodmaptrava completamente o sistema por 15 a 25 segundos, o que parece um pouco estranho, considerando que estou apenas remapeando o teclado, e as alterações não permanecem no logoff e nem mesmo na suspensão.

É um pé no saco que meu tempo de inicialização seja aumentado em 20 segundos ou mais, além de ter que executá-lo toda vez que acordo da suspensão. Isso é normal (acho que não?) E há algo que eu possa fazer, talvez uma forma alternativa de remapear o teclado?

Linux Mint 15 x64 Canela

Responder1

Tive esse problema com o comando xmodmap para congelar o sistema por aproximadamente 20 segundos. Parecia que eu tinha todo o mapa de teclado em meu .Xmodmaparquivo, o que forçou o xmodmap a remapear todas as linhas do arquivo de configuração.

Foi assim que resolvi isso:

Antes de iniciar a configuração personalizada do 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

Responder2

Eu tive o mesmo problema no xubuntu 14.04 (64) e no xmodmap (com exatamente as mesmas chaves) e encontrei uma solução usando xkb em vez de xmodmap: Remapeando chaves no Ubuntu (usando xkb)

A solução xkb requer apenas alterar os códigos-chave em

/usr/share/X11/symbols/pc

e limpe o cache xkb por

rm -rf /var/lib/xkb/*

Não tive atrasos depois. Talvez isso funcione também com o Linux Mint.

Responder3

Quando xmodmapexecutado, ele chama XChangeKeyboardMappinguma vez para cada chave que modifica, o que gera MappingNotifyeventos. Em algumas configurações (incluindo a minha), essa explosão de eventos faz com que o sistema trave por algum tempo.

Eu tive esse problema ao criar um mapa de teclado personalizado, e minha solução (feia) foi escrever um programa que gera o código-fonte C que aplicará todas as modificações chamando XChangeKeyboardMappingapenas uma vez, acionando MappingNotifyapenas uma vez.

Antes de executar este código, você deve aplicar seu mapa, pois ele obterá o mapeamento atual do teclado.

#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;
}

Ajuntar com gcc -lX11.

informação relacionada