O que há de errado com esses arquivos de regras XKB?

O que há de errado com esses arquivos de regras XKB?

Estou brincando com xkeyboard-config. Atualmente, estou tentando entender os arquivos de regras.

Eu costumava xkbcompobter o mapa de teclado atual do servidor X e gravá-lo em um arquivo. Este mapa de teclado é o mapa de teclado padrão, que carrega sem erros quando setxkbmapé executado sem nenhum argumento. Em seguida, coloquei os componentes individuais em seus próprios arquivos e coloquei os arquivos em uma estrutura de diretórios semelhante à estrutura de diretórios de configuração xkb.

Se parece com isso:

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

Eu mesmo criei os arquivos no subdiretório de regras na tentativa de criar um conjunto mínimo de arquivos de regras capazes de carregar um único layout.

Quando aponto setxkbmappara este diretório e tento carregar o mapa de teclado, recebo um erro, apesar de não ter alterado o conteúdo dos 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

Se eu carregar o mapa de teclado adicionando a -printopção setxkbmape canalizando o resultado para xkbcomp, o mapa de teclado será compilado e carregado sem erros.

Como as únicas coisas que mudaram substancialmente, desde a forma como o servidor X carrega o mapa de teclado até como eu carrego o mapa de teclado, são os arquivos de regras usados ​​​​e a organização dos componentes, presumo que a origem do erro resida lá. O que há de errado com a configuração que criei? Por que recebo um erro quando tento recarregar o mapa de teclado usando setxkbmap?

Para referência, segue o conteúdo dos arquivos de regras.

xkb/regras/atual

! 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>

Responder1

Seu formato está desativado. Verseção 4.3 neste documento antigoou oSeção de regras desta versão mais recente. Guia não confiável de Doug Palmeré um pouco desatualizado, mas também é um bom recurso.

Você tentou:

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

Especificamente, o lado direito do =aceita um único argumento. Na !linha, o lado direito é um único tipo de arquivo - apenas um de {códigos-chave, tipos, compatibilidade, símbolos, geometria} é permitido. Nas outras linhas, o lado direito é um único argumento que significa:

  • um único arquivo encontrado notiposubdiretório ( test1)
  • aestrofedefinido em tal arquivo ( test1(foo))
  • uma adição a uma correspondência anterior ( +test2ou +test2(bar))
  • vários arquivos/estrofes unidos ( test1+test1(foo)+test2(bar)+test3(baz))

O lado esquerdo é um filtro; você pode incluir quantos quiser.

Basicamente, as regras criam conjuntos de arquivos separados para cada um desses 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

Com essas regras definidas, você pode brincar setxkbmap -printpara ver suas regras em ação:

$ 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" };
};

Essa é a base de como as regras funcionam, mas é claro que pode ficar muito mais complicado.

  • %le %vsão variáveis ​​com oeutudo bem evariant ( %mtambém pode ser usado paraeumodelo)
  • %(v)envolve a expansão entre parênteses, então %l%(v)produzlayout(variant)
  • se vários layouts/variantes forem definidos, eles serão acessíveis como uma matriz e você precisará adicionar um índice: %l[1]( %lnão funcionará)
  • se vários layouts/variantes forem definidos, adicione :2(ou :3ou :4) para restringir os arquivos carregados ao 2º (ou 3º ou 4º) layout

Aqui está uma seção de regras muito básicas que irá extrair vários layouts corretamente:

// 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

Agora você pode carregar layouts de teste setxkbmape ver se eles estão sendo adicionados.

$ 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" };
};

informação relacionada