¿Qué hay de malo en estos archivos de reglas XKB?

¿Qué hay de malo en estos archivos de reglas XKB?

Estoy jugando con xkeyboard-config. Actualmente, estoy intentando comprender los archivos de reglas.

Solía xkbcomp​​​​obtener el mapa de teclas actual del servidor X y escribirlo en un archivo. Este mapa de teclas es el mapa de teclas predeterminado, que se carga sin errores cuando setxkbmapse ejecuta sin ningún argumento. Luego, puse los componentes individuales en sus propios archivos y coloqué los archivos en una estructura de directorios que se asemeja a la estructura de directorios de configuración de xkb.

Se parece a esto:

xkb
├── compat
│   └── current
├── geometry
│   └── current
├── keycodes
│   └── current
├── rules
│   ├── current
│   ├── current.lst
│   └── current.xml
├── symbols
│   └── current
└── types
    └── current

Yo mismo he creado los archivos en el subdirectorio de reglas en un intento de crear un conjunto mínimo de archivos de reglas capaces de cargar un solo diseño.

Cuando apunto setxkbmapa este directorio e intento cargar el mapa de teclas allí, aparece un error, a pesar de no haber cambiado en absoluto el contenido de los componentes.

$ setxkbmap -Ixkb -v 10 -rules current -layout current -model current -variant current
Setting verbose level to 10
locale is C
Warning! Multiple definitions of rules file
         Using command line, ignoring X server
Warning! Multiple definitions of keyboard model
         Using command line, ignoring X server
Warning! Multiple definitions of keyboard layout
         Using command line, ignoring X server
Trying to load rules file ./rules/current...
Trying to load rules file /usr/share/X11/xkb/rules/current...
Trying to load rules file xkb/rules/current...
Success.
Applied rules from current:
rules:      current
model:      current
layout:     current
variant:    current
Trying to build keymap using the following components:
keycodes:   current
types:      current
compat:     current
symbols:    current
geometry:   current
Error loading new keyboard description

Si cargo el mapa de teclas agregando la -printopción a setxkbmapy canalizando el resultado a xkbcomp, el mapa de teclas se compila y carga sin ningún error.

Dado que las únicas cosas que han cambiado sustancialmente desde cómo el servidor X carga el mapa de teclas hasta cómo lo cargo yo son los archivos de reglas que se utilizan y la organización de los componentes, supongo que la fuente del error reside allí. ¿Qué hay de malo en la configuración que he creado? ¿Por qué aparece un error cuando intento recargar el mapa de teclas usando setxkbmap?

Como referencia, a continuación se incluye el contenido de los archivos de reglas.

xkb/reglas/actual

! model layout variant = keycodes types compat symbols geometry
  current current current = current current current current current

xkb/rules/current.lst

! layout
  current Current Layout

xkb/rules/current.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xkbConfigRegistry SYSTEM "xkb.dtd">
<xkbConfigRegistry version="1.1">
  <modelList>
    <model>
      <configItem>
        <name>current</name>
        <description>Current Model</description>
        <vendor>Zistack</vendor>
      </configItem>
    </model>
  </modelList>
  <layoutList>
    <layout>
      <configItem>
        <name>current</name>
        <description>Current Layout</description>
        <languageList>
          <iso639Id>eng</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>current</name>
            <shortDescription>current</shortDescription>
            <description>current</description>
            <languageList>
              <iso639Id>eng</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
  </layoutList>
</xkbConfigRegistry>

Respuesta1

Tu formato está desactivado. Versección 4.3 en este documento antiguoo elSección de reglas de esta nueva versión.. La guía poco confiable de Doug Palmerestá un poco anticuado pero también es un buen recurso.

Intentó:

! model layout variant = keycodes types compat symbols geometry
  current current current = current current current current current

Específicamente, el lado derecho de =toma un solo argumento. En la !línea, el lado derecho es un único tipo de archivo, sólo uno de {códigos clave, tipos, compatibilidad, símbolos, geometría} esta permitido. En el resto de líneas, el lado derecho es un único argumento que significa:

  • un solo archivo encontrado en eltiposubdirectorio ( test1)
  • aestrofadefinido en dicho archivo ( test1(foo))
  • una adición a un partido anterior ( +test2o +test2(bar))
  • varios archivos/estrofas unidos ( test1+test1(foo)+test2(bar)+test3(baz))

El lado izquierdo es un filtro; puedes incluir tantos como quieras de estos.

Básicamente, las reglas crean conjuntos de archivos separados para cada uno de esos tipos.

// KEYCODES SECTION
// load keycodes based on model specified
! model = keycodes
  test1  = test1
// ^^^^^^^^^^^^^^ 
//        "if model=test1, 
//         load the default in the file keycodes/test1"

// load keycodes based on layout specified
! layout = keycodes
  test1  = +test1(us)
// ^^^^^^^^^^^^^^
//        "if layout=test1, 
//         also load stanza "us" in the file keycodes/test1"


// all at once
! model layout variant option = keycodes
  test2 test2  test2   test2  = test1+test1(de)+test1(var2)+test1(opt2)
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//        "if model=test2 and layout=test2 and... ,
//         load the default stanza in file keycodes/test1,
//         then load stanza "de" in file keycodes/test1, ...


////////////////
// GEOMETRY SECTION
// load geometry based on model specified
! model = geometry
  test1 = test1
  *     = test3  // any other model

Con estas reglas definidas, puedes jugar setxkbmap -printpara verlas en acción:

$ setxkbmap -I/path/to/my/xkb -rules test1 -model test1 -print
xkb_keymap {
        xkb_keycodes  { include "test1" };
        xkb_geometry  { include "test1" };
};
// no xkb_symbols or other sections of the map with only the rules above

$ setxkbmap -I/path/to/my/xkb -rules test2 -model test1 -layout test1 -print
xkb_keymap {
        xkb_keycodes  { include "test1+test1(us)"       };
        xkb_geometry  { include "test1" };
};

$ setxkbmap -I/path/to/my/xkb -rules test2 -model test2 -layout test2 -variant test2 -option test2 -print
xkb_keymap {
        xkb_keycodes  { include "test1+test1(us)+test1(var1)+test1(opt2)" };
        xkb_geometry  { include "test3" };
};

Estos son los conceptos básicos de cómo funcionan las reglas, pero, por supuesto, puede volverse mucho más complicado.

  • %ly %vson variables con elyotodo yvariant ( %mtambién se puede utilizar para elmetromodelo)
  • %(v)envuelve la expansión entre paréntesis, por lo que %l%(v)producelayout(variant)
  • Si se definen varios diseños/variantes, se podrá acceder a ellos como una matriz y deberá agregar un índice: %l[1]( %lno funcionará)
  • si se definen varios diseños/variantes, agregue :2(o :3o :4) para restringir los archivos cargados al segundo (o tercero o cuarto) diseño

Aquí hay una sección de reglas muy básica que incluirá múltiples diseños correctamente:

// setxkbmap -layout foo -variant foo1
! model    layout      =   symbols                                                                                                                                         
   *       *           =   %l%(v)                                                                                                                                                   

// setxkbmap -layout foo,bar -variant foo1,bar1                                                                                                                                                                                     
! model   layout[1]    =   symbols                                                                                                                                         
   *       *           =   %l[1]%(v[1])                                                                                                                                             

// setxkbmap -layout foo,bar -variant foo1,bar1                                                                                                                                                                                     
! model   layout[2]    =   symbols                                                                                                                                                 
   *       *           =   +%l[2]%(v[2]):2                                                                                                                                             

// setxkbmap -layout foo,bar,baz -variant foo1,bar1,baz1                                                                                                                                                                                     
! model   layout[3]    =   symbols                                                                                                                                                 
   *       *           =   +%l[3]%(v[3]):3                                                                                                                                             

// setxkbmap -layout foo,bar,baz,bat -variant foo1,bar1,baz1,bat1                                                                                                                                                                                     
 ! model   layout[4]   =   symbols                                                                                                                                             
   *       *           =   +%l[4]%(v[4]):4

Ahora puede cargar diseños de prueba setxkbmapy ver que se están agregando.

$ setxkbmap -I/path/to/my/xkb -rules test -model test1 \
            -layout test1,test2,test3                  \
            -variant test1,testA,testB -print
xkb_keymap {
        xkb_keycodes  { include "test1+test1(us)" };
        xkb_symbols   { include "test1(test1)+test2(testA):2+test3(testB):3" };
        xkb_geometry  { include "test1" };
};

información relacionada