xmodmap cuelga el sistema durante 20 segundos y no se pega

xmodmap cuelga el sistema durante 20 segundos y no se pega

Edité el mapa del teclado usando xmodmap segúnhttps://wiki.archlinux.org/index.php/Xmodmap, y tengo dos problemas: la ejecución xmodmap ~/.Xmodmapbloquea 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 .Xmodmaparchivo, 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 xmodmapse ejecuta, llama XChangeKeyboardMappinguna vez por cada tecla que modifica, lo que genera MappingNotifyeventos. 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 XChangeKeyboardMappingsolo una vez, activando así MappingNotifysolo 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.

información relacionada