Editei o mapa do teclado usando xmodmap conformehttps://wiki.archlinux.org/index.php/Xmodmap, e tenho dois problemas: a execução xmodmap ~/.Xmodmap
trava 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 .Xmodmap
arquivo, 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 xmodmap
executado, ele chama XChangeKeyboardMapping
uma vez para cada chave que modifica, o que gera MappingNotify
eventos. 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 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;
}
Ajuntar com gcc -lX11
.