Trocando esc e caps lock de uma maneira que persiste com teclados externos

8

Eu tenho um arquivo chamado ~ / .speedswapper que contém o seguinte:

! Swap caps lock and escape
remove Lock = Caps_Lock
keysym Escape = Caps_Lock
keysym Caps_Lock = Escape
add Lock = Caps_Lock

... quando eu executo xmodmap ~/.speedswapper , isto muda as chaves esc e Caps Lock . Eu tenho essa linha no meu ~ / .profile, para que sempre que eu fizer login essas chaves sejam trocadas.

No entanto , se eu conectar um teclado USB externo, esta configuração não parece persistir. O teclado do meu laptop funciona perfeitamente, mas tenho que executar o comando novamente para que o teclado externo troque as duas teclas. Felizmente, isso não parece afetar o teclado do meu laptop - eles parecem sincronizar.

Uma solução seria encontrar alguma forma de executar o comando xmodmap sempre que um teclado externo estivesse conectado, mas eu estaria aberto a outra solução de troca de chaves, se fosse mais robusto. OS é o Ubuntu 13.04.

Dado o comentário do justbrowsing, parece que isso pode ser conseguido escrevendo uma regra do udev - eu acho que tenho que usar a opção RUN, e que ela deve ser acionada em / dev / hidraw0 ou / dev / hidraw1, que são os dispositivos que aparecem quando eu conecto meu teclado ... mas eu ainda estou tentando entender o conceito, então eu gostaria de receber ajuda de alguém que saiba o que está fazendo com o udev.

    
por evilsoup 29.08.2013 / 20:59

1 resposta

3

Já que você tem este comando no seu ~/.profile , ele só será executado uma vez, quando você fizer o login. Uma solução não muito elegante seria colocar o comando no seu ~/.bashrc para que ele seja executado toda vez que você abre um terminal.

Uma solução melhor seria definir uma regra udev que executará xmodmap quando o teclado USB for inserido (estou usando os valores retornados para o meu teclado USB, você precisará editar essa solução para ajustá-la à sua) :

  1. Obtenha os detalhes do seu teclado USB. Execute este comando com o teclado conectado:

    $ /lib/udev/findkeyboards | grep USB
    USB keyboard: input/event6
    
  2. Para escrever regras udev , você precisa saber com o que elas devem corresponder. Você pode obter isso pesquisando a saída de udevadm info --export-db para a entrada event6 ou apenas analisá-la diretamente da seguinte forma:

    udevadm info --export-db | perl -ne 'BEGIN{$/="\n\n"}print if /event6/'
    

    Isso retorna várias linhas de texto, incluindo as que usaremos:

    E: ID_MODEL_ID=0002
    [...]
    E: ID_VENDOR_ID=1c4f
    
  3. udev se torna complicado ao usar programas X como xmodmap , eu nem consegui fazer isso funcionar ao exportar $DISPLAY e $XAUTHORITY . De qualquer forma, eu não consegui fazer isso funcionar com o seu método, então minha solução usa keymap . Primeiro, você precisará descobrir os códigos-chave para Esc e Caps Lock , você pode fazer isso executando

    sudo /lib/udev/keymap -i input/event6
    

    e, em seguida, pressionando as teclas relevantes. No meu sistema, isso retorna:

    scan code: 0x70029   key code: esc
    scan code: 0x70039   key code: capslock
    
  4. Crie uma nova regra de keymap contendo estas linhas:

    0x70029 capslock
    0x70039 esc
    

    e salve-o como /lib/udev/keymaps/speedswap .

  5. Defina uma nova regra udev . Crie um arquivo chamado /etc/udev/rules.d/95-speedswap.rules e adicione essas linhas a ele:

    ACTION=="add", 
    SUBSYSTEM=="input", 
    ATTRS{idVendor}=="1c4f", 
    ATTRS{idProduct}=="0002", 
    RUN+="keymap $name speedswap"
    

Isso deve ser feito, pelo menos no meu sistema, conectando minhas causas USB Esc para agir como Caps Lock e vice-versa .

    
por 30.08.2013 / 04:02