xmodmap suspendendo o sistema por 20 segundos e sem grudar

4

Eu editei o mapa do teclado usando o xmodmap de acordo com o link , e tenho dois problemas: executar xmodmap ~/.Xmodmap completamente trava o sistema por 15-25 segundos, o que parece um pouco estranho considerando que eu estou apenas remapeando o teclado, e as mudanças não ficam no logoff, e nem mesmo na suspensão.

É uma dor no rabo para o meu tempo de inicialização para ser aumentado em 20 segundos ou mais, além de ter que executá-lo toda vez que eu acordar da suspensão. Isso é normal (eu realmente não penso assim?) E há algo que eu possa fazer, talvez uma maneira alternativa de remapear o teclado?

Linux Mint 15 x64 Canela

    
por user1350864 10.10.2013 / 00:19

3 respostas

2

Eu tive esse problema com o comando xmodmap para congelar o sistema por ~ 20 segundos. Parece que eu tinha todo o mapa de teclado no meu arquivo .Xmodmap , o que forçou o xmodmap a remapear todas as linhas no 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
    
por 04.09.2017 / 10:24
1

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

A solução xkb requer apenas a alteração dos códigos de teclas em

/usr/share/X11/symbols/pc

e limpar o cache xkb por

rm -rf /var/lib/xkb/*

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

    
por 22.01.2016 / 17:05
0

Quando xmodmap é executado, ele chama XChangeKeyboardMapping uma vez para cada chave que modifica, o que gera MappingNotify events. Em algumas configurações (incluindo a minha), essa explosão de eventos faz com que o sistema fique travado por algum tempo.

Eu tive esse problema ao criar um mapa de teclado personalizado e minha solução (feia) estava gravando um programa que gera o código-fonte C que aplicará todas as modificações chamando XChangeKeyboardMapping apenas uma vez, acionando MappingNotify apenas 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;
}

Compile com gcc -lX11 .

    
por 08.04.2017 / 06:40