Edité el mapa del teclado usando xmodmap segúnhttps://wiki.archlinux.org/index.php/Xmodmap, y tengo dos problemas: la ejecución xmodmap ~/.Xmodmap
bloquea completamente el sistema durante 15 a 25 segundos, lo que parece un poco extraño considerando que solo estoy reasignando el teclado y los cambios no se mantienen al cerrar sesión, y ni siquiera al suspender.
Es un dolor de cabeza que mi tiempo de arranque aumente en 20 segundos o más, además de tener que ejecutarlo cada vez que me despierto de la suspensión. ¿Es esto normal (realmente no lo creo?) y ¿hay algo que pueda hacer, tal vez una forma alternativa de reasignar el teclado?
Linux Mint 15 x64 Canela
Respuesta1
Tuve este problema con el comando xmodmap para congelar el sistema durante ~20 segundos. Parecía que tenía todo el mapa de teclas en mi .Xmodmap
archivo, lo que obligó a xmodmap a reasignar cada fila en el archivo de configuración.
Así resolví eso:
Antes de iniciar la configuración personalizada de 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
Respuesta2
Tuve el mismo problema en xubuntu 14.04 (64) y xmodmap (con exactamente las mismas claves) y encontré una solución usando xkb en lugar de xmodmap: Reasignación de claves en Ubuntu (usando xkb)
La solución xkb solo requiere cambiar los códigos clave en
/usr/share/X11/symbols/pc
y borre el caché xkb mediante
rm -rf /var/lib/xkb/*
Después no tuve ningún retraso. Quizás esto también funcione con Linux Mint.
Respuesta3
Cuando xmodmap
se ejecuta, llama XChangeKeyboardMapping
una vez por cada tecla que modifica, lo que genera MappingNotify
eventos. En algunas configuraciones (incluida la mía), esta ráfaga de eventos hace que el sistema se cuelgue durante algún tiempo.
Tuve este problema al crear un mapa de teclado personalizado, y mi (fea) solución fue escribir un programa que genere el código fuente C que aplicará todas las modificaciones llamando XChangeKeyboardMapping
solo una vez, activando así MappingNotify
solo una vez.
Antes de ejecutar este código, debe aplicar su mapa, ya que obtendrá la asignación de teclado actual.
#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;
}
Compilar con gcc -lX11
.