Skip to content

Custom keyboard layout (woes)

La idea es modificar algunas teclas o arreglar cosas que no funcionan bien.

Compartí mis penas en reddit: https://www.reddit.com/r/linux/comments/hmnipy/xkb_custom_keyboard_layouts_for_kde_in_arck_linux/

Layouts personalizados

Ver tambien: logitech-mk470

El layout para poner tildes sin AltGr es este:

20191231-120020.png

Para personalizar las teclas recomiendo usar XKB, agregando una variante de teclado al layout.

Configuracion con xmodmap

Para que xmodmap ponga las letritas en las teclas como me gusta:

.xinitrc

if [ -s ~/.Xmodmap_nico ]; then
    xmodmap ~/.Xmodmap_nico
fi

exec startplasma-x11

Use info de acá para saber los nombres y los valores por defecto salieron de xmodmap -pke.

.Xmodmap_nico

keycode  49 = dead_grave dead_tilde degree asciitilde degree asciitilde grave asciitilde dead_grave dead_tilde
keycode  32 = o O Greek_theta Greek_THETA Greek_theta Greek_THETA oacute
keycode  25 = w W Greek_omega Greek_OMEGA Greek_omega Greek_OMEGA
keycode  38 = a A Greek_alpha Greek_ALPHA Greek_alpha Greek_ALPHA
keycode  58 = m M mu mu mu mu
keycode  56 = b B Greek_beta Greek_BETA Greek_beta Greek_BETA
keycode  40 = d D Greek_delta Greek_DELTA Greek_delta Greek_DELTA
keycode  46 = l L Greek_lambda Greek_LAMBDA Greek_lambda Greek_LAMBDA oslash Oslash
keycode  39 = s S Greek_sigma Greek_SIGMA Greek_sigma Greek_SIGMA
keycode  33 = p P Greek_pi Greek_PI Greek_pi Greek_PI
keycode  28 = t T Greek_tau Greek_TAU Greek_tau Greek_TAU thorn THORN dead_ogonek
keycode  17 = 8 asterisk 8 asterisk infinity dead_ogonek threequarters dead_ogonek 8 asterisk threequarters dead_ogonek 8 asterisk threequarters dead_ogonek
keycode  41 = f F Greek_phi Greek_PHI Greek_phi Greek_PHI f F f F f F f F f F
keycode  26 = e E e E Greek_epsilon Greek_EPSILON eacute Eacute e E eacute Eacute e E eacute Eacute
keycode  31 = i I i I includedin includes iacute Iacute i I iacute Iacute i I iacute Iacute
keycode  53 = x X Greek_chi Greek_CHI x X x X x X x X x X x X
keycode  27 = r R r R Greek_rho Greek_RHO registered registered r R registered registered r R registered registered

El problema con esto es que espontáneamente se desconfiguraba, y hacía que abrir terminales fuera lento o me bloqueara KDE.

Configuracion con XKB rústica

Lectura util:

El que quiero modificar es "English (US, intl., with dead keys)", está en /usr/share/X11/xkb/symbols/us.

Para agregar una variante sigo las instrucciones que están acá.

Agregar lo siguiente al final de /usr/share/X11/xkb/symbols/us:

sudo nano /usr/share/X11/xkb/symbols/us

Esta es una variante de ejemplo, mas abajo esta la definicion completa.

// El layout de nico para tener letras grigas en paz sin xmodmap
// Depende de us(intl)
partial alphanumeric_keys
xkb_symbols "intl_nico" {
    include "us(intl)"
    key <TLDE>  { [ grave,     asciitilde,  masculine,    ordfeminine ] };
    key <BKSL>  { [ backslash, bar,         braceright,   dead_breve ]  };
};

Agregar una linea a dos archivos en la sección ! variant:

sudo nano /usr/share/X11/xkb/rules/base.lst
# despues de intl us: English (US, intl., with dead keys)
sudo nano /usr/share/X11/xkb/rules/evdev.lst
# despues de intl us: English (US, intl., with dead keys)

Codigo a agregar:

  intl_nico       us: English (US, new variant)

Resultado:

20230529-125236.png

Y agregar lineas a base.xml y evdev.xml en la misma carpeta:

sudo nano /usr/share/X11/xkb/rules/base.xml
# después del <variant> tag que dice <description>English (US, intl., with dead keys)</description>
sudo nano /usr/share/X11/xkb/rules/evdev.xml
# después del <variant> tag que dice <description>English (US, intl., with dead keys)</description>

Codigo a agregar:

        <variant>
          <configItem>
            <name>intl_nico</name>
            <description>English (US, new variant)</description>
          </configItem>
        </variant>

**Congratulations: You’re done. Now you can (maybe after a logout and a new login) choose the new layout in whatever interface present your distribution/desktop environment. **

20230529-125324.png

Ahora que eso funciona solo falta poner lo que realmente me interesaba cambiar. ¿Cómo es la sintaxis de estos archivos?

  key <AE01> { [ 1, exclam, bar, exclamdown ] };

... as for example the one show there: the key “1” will emit the number “1” when pressed alone, the key “exclam” (!) when pressed with shift, the “bar” (|) when pressed with Alt-Gr, and the reverse exclamation sign “exclamdown” (¡) with shift+AltGr.

Así que, por ejemplo lo siguiente podría funcionar. Editar /usr/share/X11/xkb/symbols/us y reemplazar el snippet anterior con el siguiente:

// El layout de nico para tener letras grigas en paz sin xmodmap
partial alphanumeric_keys
xkb_symbols "intl_nico" {

    include "us(intl)"
    name[Group1]= "English (US, new variant)";

    key <TLDE> {    [     grave,    asciitilde, degree, asciitilde  ]   };
    key <AE08> {    [     8,    asterisk, infinity, dead_ogonek ]   };
    key <AD09> {    [     o,    O, Greek_theta, Greek_THETA     ]   };
    key <AD02> {    [     w,    W, Greek_omega, Greek_OMEGA     ]   };
    key <AC01> {    [     a,    A, Greek_alpha, Greek_ALPHA         ]   };
    key <AB07> {    [     m,    M, Greek_mu, Greek_MU       ]   };
    key <AB05> {    [     b,    B, Greek_beta, Greek_BETA       ]   };
    key <AC03> {    [     d,    D, Greek_delta, Greek_DELTA     ]   };
    key <AC09> {    [     l,    L, Greek_lambda, Greek_LAMBDA       ]   };
    key <AC02> {    [     s,    S, Greek_sigma, Greek_SIGMA     ]   };
    key <AD10> {    [     p,    P, Greek_pi, Greek_PI       ]   };
    key <AD05> {    [     t,    T, Greek_tau, Greek_TAU     ]   };
    key <AC04> {    [     f,    F, Greek_phi, Greek_PHI     ]   };
    key <AD03> {    [     e,    E, Greek_epsilon, Greek_EPSILON     ]   };
    key <AD08> {    [     i,    I, Greek_iota, Greek_IOTA       ]   };
    key <AB02> {    [     x,    X, Greek_chi, Greek_CHI     ]   };
    key <AD04> {    [     r,    R, Greek_rho, Greek_RHO     ]   };
    key <AC05> {    [     g,    G, Greek_gamma, Greek_GAMMA     ]   };
    key <AC08> {    [     k,    K, Greek_kappa, Greek_KAPPA     ]   };

    include "level3(ralt_switch)"
};

Mágicamente los nombres son los mismos que en xmodmap, así que solo tuve que hacer magia con Ctrl+Shift+L en Sublime Text y quedó prolijito (aguante el editor multilínea).

A veces KDE flashea, para cambiar de layout con XKB manualmente se puede hacer:

sudo setxkbmap -query
setxkbmap -print
# setxkbmap [-model xkb_model] [-layout xkb_layout] [-variant xkb_variant] [-option xkb_options]
setxkbmap -model pc102 -layout us,es -variant intl,nodeadkeys

Lamentablemente, intl_nico falla con error:

Error loading new keyboard description

Configuracion persistente con XKB

Es importante basarse en los layouts us_intl y es (en vez de us y latam). Aunque todavía no entiendo bien por que, esos layouts permiten hacer composición de virgulillas, tildes, acentos, dieresis con otras letras directamente presionando una antes que la otra (sin usar AltGr como compose key, que es más molesto).

Todavía no desculé la diferencia entre esos layouts que hace que uno componga solo y el otro no.

US layout con letras giregas

cp /usr/share/X11/xkb/symbols/us /usr/share/X11/xkb/symbols/us_nico
subl /usr/share/X11/xkb/symbols/us_nico
Hacer que aparezca en las opciones de KDE

Archivos lst:

subl /usr/share/X11/xkb/rules/base.lst
subl /usr/share/X11/xkb/rules/evdev.lst

Tienen que quedar asi:

  ! layout
    us_nico         English (US)

  ! variant
    chr             us: Cherokee
    haw             us: Hawaiian
    euro            us: English (US, euro on 5)
    intl            us: English (US, intl., with dead keys)
    intl_nico       us_nico: English (US, intl. greek letters)

Archivos xml:

  subl /usr/share/X11/xkb/rules/base.xml
  subl /usr/share/X11/xkb/rules/evdev.xml

Hay que agregar un <layout> tag apuntando al keymap persomalizado <name>us_nico</name> despues del de us.

Es igual al layout de us pero se llama us_nico (como el archivo que duplique y modifique al principio: /usr/share/X11/xkb/symbols/us_nico).

Tecla LSGT

xev dice que la tecla mayo/menor al lado de la Z es 94:

keycode 94 (keysym 0x5c, backslash), same_screen YES,
    XKeysymToKeycode returns keycode: 51

Los XKB symbols se corresponden con las teclas en este archivo /usr/share/X11/xkb/keycodes/evdev donde dice:

cat /usr/share/X11/xkb/keycodes/evdev | grep LSGT
        <LSGT> = 94;

Confirmando que esa es la tecla que tengo que cambiar para que funcione bien el teclado log de mierda que tengo.

Agregar a qq, bajo xkb_symbols "basic":

  key <LSGT> {  [ less, greater, lessthanequal, greaterthanequal ] };

Eso deberia propagarse a los otros layouts latam.

ES layout con letras giregas y LTGT

Archivos editados: es_nico.zip

Editar /usr/share/X11/xkb/rules/evdev.lst y /usr/share/X11/xkb/rules/base.lst:

! layout
...
  es              Spanish
  es_nico         Spanish2

! variant
...
  ltgt            es_nico: Spanish (LTGT)

Editar /usr/share/X11/xkb/rules/base.xml y /usr/share/X11/xkb/rules/evdev.xml como corresponde, agregando un tag con nombre es_nico. Ver el .zip adjuntado arriba.

Configuración con xorg.conf.d

Esto no es lo que necesito al final.

Your own configurations can go in /etc/X11/xorg.conf.d/

Este tutorial sirve pero para configuraciones que en Arch no son persistentes:

Estre tiene pinta de que si sirve:

Let's say you want to configure a PC-style American keyboard with 104 keys as described in base.lst. This can be done by simply writing several lines from below to a new configuration file in /etc/X11/xorg.conf.d, such as /etc/X11/xorg.conf.d/90-custom-kbd.conf

Pero no, solo elige el layout, no lo define.

Aca hay otro:

https://medium.com/@damko/a-simple-humble-but-comprehensive-guide-to-xkb-for-linux-6f1ad5e13450

Logitech MK470

20200706-214208.png

Especificaciones

https://www.logitech.com/es-es/product/mk470-slim-wireless-combo?crid=1759#specification-tabular

Tiene 102 teclas, con ñ, ç y tecla de mayor/menor <>.

Layout

El layout que elegí es Spanish (no dead keys).

El compose key no parece funcionar, y no esta Multi_key en xmodmap -pke.

Pero con setxkbmap parece que el layout que elegí puede andar:

setxkbmap -option compose:ralt

Esto es un poco molesto tener que usar compose key para poner tildes.

La mejor solucion es la de XKB explicada arriba.

KDE quirks

A veces no me reconoce los layouts disponibles que configuré. Estan en la lista de la GUI, pero al intentar cambiarlo con el atajo, o con el widget graficamente, algunos no se pueden seleccionar.

qdbus org.kde.keyboard /Layouts getCurrentLayout
qdbus org.kde.keyboard /Layouts getLayoutsList

Creo que es un problema de KDE, quizas se lleve mal con localectl y /etc/X11/xorg.conf.d/00-keyboard.conf.

localectl

For convenience, the tool localectl may be used instead of manually editing X configuration files. It will save the configuration in /etc/X11/xorg.conf.d/00-keyboard.conf

El output de localect status al iniciar el sistema es el mismo que en KDE:

System Locale: LANG=en_US.UTF-8
    VC Keymap: n/a
   X11 Layout: n/a

No tengo idea por que ahi dice n/a.

Pero antes de iniciar X corrí sudo localectl set-keymap es y eso ahora hace que no tenga que usar la compose key para poner tildes 🤷 y ademas ahora localectl status devuelve algo más razonable:

$ sudo localectl set-keymap es
$ localectl status
   System Locale: LANG=en_US.UTF-8
     VC Keymap: es
    X11 Layout: es
     X11 Model: pc105
   X11 Options: terminate:ctrl_alt_bksp

El X11 Model: pc105 quizas deberia ser pc102 (?). Ademas, seria mejor poner tambien el toggle para poder usar el teclado logitech y el de la compu en la terminal:

localectl set-keymap us es

Con este comando se crea /etc/X11/xorg.conf.d/00-keyboard.conf que contiene:

# Written by systemd-localed(8), read by systemd-localed and Xorg. It's
# probably wise not to edit this file manually. Use localectl(1) to
# instruct systemd-localed to update it.
Section "InputClass"
        Identifier "system-keyboard"
        MatchIsKeyboard "on"
        Option "XkbLayout" "es"
        Option "XkbModel" "pc102"
        Option "XkbVariant" "nodeadkeys"
EndSection

Acá dice:

Your own configurations can go in /etc/X11/xorg.conf.d/

Variantes

Las variantes se pueden mostrar con:

localectl list-x11-keymap-variants us
localectl list-x11-keymap-variants es

Ahi aparece mi variante de us llamada intl_nico, que tiene las letras griegas y eso. Tambien la variante nodeadkeys que estoy usando ahora del layout es.

Para el modelo, acá aparece pc102:

localectl list-x11-keymap-models

Segun la documentacion, la sintaxis completa es set-x11-keymap LAYOUT [MODEL [VARIANT [OPTIONS]]].

sudo localectl set-x11-keymap es pc102 nodeadkeys

Y para el de la laptop:

sudo localectl set-x11-keymap us pc102

No parece tener efecto en KDE y Konsole, pero tiene efecto inmediato en otra TTY fuera de X.

Ademas podria poner alguna opcion, como para la compose key. Esas opciones se pueden ver con localectl list-x11-keymap-options. Pero como los tildes se componen por defecto en el layout es, no es necesario.