Como obtenho um xmodmap válido enquanto uso o xcape

2

Eu admito no início que o mapeamento de teclas do X é um pouco de uma arte-preta para mim, que envolve principalmente copiar e colar exemplos de lugares como SO e SU e ver se funciona. No entanto, neste caso, preciso entender melhor o que aconteceu para que o xcape e o i3lock funcionem bem juntos.

Estou usando o utilitário xcape para manipular o mapeamento da minha chave de retorno para um controle alternativo quando pressionado por um longo período e ainda me comportar como uma tecla pressionada quando pressionado e liberado. A configuração para isso se parece com:

if [ -e ${XCAPE} ]; then
    killall xcape 2> /dev/null
    ${XMODMAP} -e 'keycode 36 = 0x1234'
    ${XMODMAP} -e 'add control = 0x1234'
    ${XMODMAP} -e 'keycode any = Return'
    ${XCAPE} -e '0x1234=Return'
    KEYMAPS="${KEYMAPS} StRet->Ctrl"
fi

Pelo que entendi, ele remapeia a chave de retorno (36) para uma chave falsa (0x1234). Em seguida, ele modifica o mapa para que o controle também seja mapeado em (0x1234). O xcape então faz "mágica" para garantir que o código de tecla correto seja enviado, dependendo da pressão longa.

Isso tudo funciona bem, no entanto, ele quebra meu programa de bloqueio de tela (i3lock), que faz alguma manipulação do mapa do teclado X antes de iniciar. Ele falha com a seguinte mensagem:

Error:    (unknown file):1092:13: syntax error
Error:    Failed to parse input xkb file
[i3lock] xkb_keymap_new_from_file failed
i3lock: Could not load keymap

Adicionando alguma depuração para despejar o mapa de teclado que eu imaginei, foi a seguinte linha que causou confusão.

xkb_symbols "pc_gb_inet(evdev)_ctrl(nocaps)" {

    name[group1]="English (UK)";
    key     <> {         [          Return ] };
    key  <ESC> {         [          Escape ] };
    key <AE01> {
    ...

Então, o que aconteceu para atrapalhar as coisas? São os dois fundamentalmente incompatíveis? Precisarei restaurar parcialmente o mapa de teclado antes de executar o i3lock?

    
por stsquad 22.11.2013 / 11:09

1 resposta

0

Assim, depois de muito cavar, o primeiro 'keycode any = Return' configura o keycode 8, que confunde o processamento do mapa de teclas do i3lock. Além disso, você precisa garantir que o código-chave 36 gere um retorno para que você possa inserir sua senha.

Eu envolvi a chamada para o i3lock em um script, então na minha configuração do i3:

# background, screensaver and locking
exec xautolock -time 10 -locker '/home/alex/.config/i3/lock_screen.sh'
bindsym $mod+l exec /home/alex/.config/i3/lock_screen.sh

Com o script da tela de bloqueio simples:

# The initial key-sequence chosen by xcape does confuse i3lock so we reset it
xmodmap -e "keycode 8 = "
# Ensure the return key does work as intended
xmodmap -e 'keycode 36 = Return'
i3lock -c 334433
    
por 21.02.2014 / 12:27