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

3

Eu estou jogando com o xkeyboard-config. Atualmente, estou tentando entender os arquivos de regras.

Eu usei xkbcomp para obter o mapa de teclado atual do servidor X e gravá-lo em um arquivo. Esse mapa de teclas é o mapa de teclas padrão, que é carregado sem erros quando setxkbmap é executado sem nenhum argumento. Eu, então, puxei os componentes individuais para seus próprios arquivos e coloquei os arquivos em uma estrutura de diretórios semelhante à estrutura de diretórios xkb.

Parece assim:

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 eu aponto setxkbmap neste 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 opção -print a setxkbmap e canalizando o resultado para xkbcomp , o mapa de teclado será compilado e carregado sem erros.

Como as únicas coisas que mudaram substancialmente de como o servidor X carrega o mapa de teclado para como eu carrego o mapa de teclado são os arquivos de regras sendo usados e a organização dos componentes, estou presumindo que a origem do erro reside 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, o conteúdo dos arquivos de regras segue.

xkb / rules / current

! 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>
    
por Zistack 03.11.2015 / 21:14

1 resposta

3

Seu formato está desativado. Veja a seção 4.3 deste documento antigo ou a seção desta nova versão . O Guia não confiável de Doug Palmer é um pouco datado, 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 tipo único de arquivo - somente um {{strong> códigos de teclas, tipos, compat, símbolos, geometria } é permitido. Nas outras linhas, o lado direito é um único argumento que significa:

  • um único arquivo encontrado no subdiretório tipo ( test1 )
  • uma sub-rotina definida em tal arquivo ( test1(foo) )
  • uma adição a uma correspondência anterior ( +test2 ou +test2(bar) )
  • vários arquivos / sub-rotinas unidos ( test1+test1(foo)+test2(bar)+test3(baz) )

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

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 jogar com setxkbmap -print para 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" };
};

Esse é o básico de como as regras funcionam, mas é claro que pode ficar muito mais complicado.

  • %l e %v são variáveis com o l ayout e v ariant ( %m também pode ser usado para o odel m )
  • %(v) quebra a expansão entre parênteses, então %l%(v) rende layout(variant)
  • se vários layouts / variantes forem definidos, eles estarão acessíveis como uma matriz e você precisará adicionar um índice: %l[1] ( %l não funcionará)
  • se vários layouts / variantes estiverem definidos, adicione :2 (ou :3 ou :4 ) para restringir os arquivos carregados ao segundo (ou terceiro ou quarto) layout

Aqui está uma seção de regras muito básicas que incluirá 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 em setxkbmap e ver se 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" };
};
    
por 02.04.2017 / 12:29

Tags