Por que minhas ligações xmodmap envolvendo AltGr funcionam apenas em algumas chaves?

12

Quero remapear meu AltGR + Right_Windows, mas não consigo descobrir como. Não importa o que eu tente, pressionar a tecla direita do Windows emite o nome do teclado quando alt direito é pressionado ou não.

Este é o conteúdo do arquivo xmodmap que estou testando agora. No meu teclado, 38 é o código de tecla para "a", 48 é o código de tecla para apóstrofo / aspas duplas e 134 é o código de tecla para a tecla direita do Windows.

keycode  38 = 1 2 3 4 5 6 7 8
keycode  48 = 1 2 3 4 5 6 7 8
keycode 134 = 1 2 3 4 5 6 7 8

Quando pressiono Right_Alt + apóstrofo, ele gera 5, mas Right_Alt + ae Right_Alt + Right_Windows fornecem 1 (tanto quando a tecla alt direita é pressionada como quando não é), o que não era o que eu queria.

Meu layout de teclado atual é us(alt-intl)e o alt certo está aparentemente configurado para funcionar como AltGr / Iso_Level3_Shift. A saída de xmodmap -pmé a seguinte:

xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x42)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)
hugomg
fonte
Não faço idéia exatamente do que está acontecendo, mas se você ainda não o fez, convém executar xeve pressionar as várias combinações de teclas para ver se o hardware e o nível do Xwindows estão recebendo pressionamentos de tecla distinguíveis para começar.
Joe
Estou com o mesmo problema. Eu queria modificar vírgula e ponto para também oferecer suporte à impressão de aspas duplas em tcheco e inglês („/“ / ”) que eu tenho que escrever usando a tecla de composição caso contrário. Estou usando o us(cz_sk_de)layout do teclado e o xmodmap.
Pavel Šimerda
E agora? Não é prático desperdiçar outra recompensa nem iniciar uma nova pergunta quando esta bem descreve o problema. Parece um bug no xorg, mas não encontrei nenhuma referência. A resposta existente está claramente errada, apesar de ser concedida automaticamente.
Pavel Šimerda
Acabei desistindo e usar diferentes keybinds que eu sei que trabalho: / Eu concordo que este se parece com um bug, mas eu não sei o que o sistema a sua relacionado e onde para denunciá-lo ...
hugomg
Eu encontrei algumas informações aqui ... blog.azundris.com/archives/193-X-treme-pain-XKB-vs-XModMap.html
Pavel Šimerda

Respostas:

7

Usando xmodmap para configurar mapeamentos de teclas individuais

É hora de anotar os resultados de minha própria pesquisa.

Eu pensei que devia ter perdido alguma coisa no xmodmap e que ela simplesmente não está muito bem documentada e as pessoas estão confusas. Mas o design do X.Org sobre o XKB e o xmodmap é simplesmente estúpido.

Falha épica: xmodmap

Você pode usar o xmodmap para redefinir os mapeamentos existentes, desde que esses mapeamentos realmente existam no layout original do teclado. No caso descrito na pergunta, você não pode estender o comportamento de nenhuma chave para usar o AltGr. Você só pode alterar os principais atalhos do AltGr para códigos que já estão usando o AltGr.

Consulte também: http://blog.azundris.com/archives/193-X-treme-pain-XKB-vs-XModMap.html

Solução alternativa: Mode_switch

Esta solução alternativa é descrita na resposta por @ Ned64. Você pode remapear AltGrde ISO_Level3_Shiftpara Mode_switch.

Usei com sucesso a seguinte linha de comando para remapear AltGr.

xmodmap -e 'keycode 108 = Mode_switch'

A desvantagem é que isso interromperá o layout atual do teclado, mas você pode recriar todos os mapeamentos um por um usando xmodmapcomo @ Ned64 já mencionado.

Solução alternativa: layout de teclado modificado

Estou usando us(cz_sk_de)como meu layout de teclado e tentei modificá-lo adicionando a configuração das teclas que desejava estender.

key <AB08>  { [ comma, less, doublelowquotemark, leftdoublequotemark ] };
key <AB09>  { [ period, greater, ellipsis, rightdoublequotemark ] };

(Na seção xkb_symbols "cz_sk_de"de /usr/share/X11/xkb/symbols/us)

Basta redefinir o layout do teclado para usar a versão modificada.

setxkbmap 'us(cz_sk_de)'

Agora você pode (1) tipo Checa e Inglês aspas e elipses usando combinações de ,, ., Shifte AltGrteclas e / ou (2) remapear essas chaves usando xmodmapagora que eles são definidos.

A principal desvantagem é que setxkbmapparece não oferecer suporte a locais arbitrários para layouts de teclado e, portanto, você precisa gravar na configuração do sistema em vez do diretório inicial.

Conclusão

Este parece ser um exemplo de design incorreto e com excesso de engenharia do X.Org, onde até mesmo algo trivial como mapear um código-chave e uma combinação de modificadores em um símbolo acaba sendo um problema. As ferramentas não parecem fornecer uma maneira razoável de alterar apenas os mapeamentos de teclas individuais na configuração do usuário, sem efeitos colaterais.

Pavel Šimerda
fonte
"você não pode estender o comportamento de nenhuma tecla para usar o AltGr" - parece que esse era o problema o tempo todo! Obrigado.
Hugomg
5

Etapa 1: tornar o AltGr utilizável

Descobri que as teclas modificadas com AltGr só funcionam no meu sistema se eu também remapear a tecla AltGr para Mode_switch:

xmodmap -e "keycode 108 = Mode_switch Mode_switch Mode_switch Mode_switch"

Se você tiver um teclado diferente, poderá ser necessário substituí-lo pelo 108código, verifique digitando

xmodmap -pke | grep Alt_R

então use esse número. (A chave é normalmente chamada Alt_Rem sistemas que eu conheço.)

Como alternativa, isso também pode funcionar se Alt_R ainda não estiver atribuído a outra coisa:

xmodmap -e "keysym Alt_R = Mode_switch Mode_switch Mode_switch Mode_switch"

Seu modificador AltGr agora servirá a posição 3 (com Shift: 4) na sua lista de modificadores.

Etapa 2: Atribuir chaves conforme necessário

Você pode atribuir variantes do AltGr para qualquer tecla do teclado que desejar. Se você possui outras chaves que não correspondem ao código desejado agora, é necessário redesigná-las exatamente como as outras chaves (as que você testou).

Etapa 3: Converter isso em um script

Agora, basta tomar seus xmodmapcomandos e gravar todas as modificações (exceto apenas) no teclado padrão em um arquivo - mais rápido do que carregar um mapa de teclas completo. Inicie esse script uma vez após cada login e sempre que o mapa de teclas for redefinido por algum processo.

Eu experimentei muito isso ao longo dos anos, sob Solaris, IRIX e Linux, e que eu saiba é a única solução para fazer o AltGr funcionar - e funcionou bem para mim por mais de 20 anos.

Ned64
fonte
1
Com isso, a tecla da janela direita começou a atuar como "3" em vez de "1". No entanto, agora todos os modificadores AltGr existentes parou de funcionar (eu acho que teria de ser um "5" em vez de um "3" para que eles trabalho?)
hugomg
Obrigado por tentar isso. Poste xmodmap -pme xmodmap -pke | grep -w SOMECHANGEDKEYnesta situação, para uma chave que não funcione mais.
Ned64
(então teremos de adicionar o novo modificador usando xmodmapde acordo com sua saída)
Ned64
xmodmap -pke | grep Alt_Rnão retorna nenhum resultado no meu sistema. Meu sistema é o Lenovo ThinkPad X230 com o Gentoo estável. Eu também tentei grep -isem sucesso.
Pavel Šimerda 12/08/16
Eu tentei e o problema é que cartas acentuadas us(cz_sk_de)pararam de funcionar para mim. Portanto, esta resposta não funciona para mim e não funciona para muitas outras.
Pavel Šimerda
1

Aparentemente, o xmodmap não lê o AltGR padrão como deveria, pode estar limitado a layouts de teclado específicos, talvez sejam todos os layouts que não sejam dos EUA, de qualquer forma, o verdadeiro problema é que você pode substituir o layout do teclado, algumas pessoas podem não quero realmente fazer isso, pois eles precisam usar caracteres especiais no layout a que estão acostumados (como layouts de teclado escandinavo que possuem caracteres como ðþæöáúíóåů e assim por diante), que seria uma tarefa difícil de configurar para outros layouts de teclado.

Você pode correr

xmodmap -e "keycode 108 = Mode_switch"

Para religar o AltGR a algo que o xmodmap possa trabalhar e, de fato, a terceira atribuição de um teclado será exibida quando você pressionar o AltGR agora, no entanto, ele interromperá completamente o layout do teclado original, pois nenhuma tecla do AltGR funcionará mais com a tecla AltGR.

Eu encontrei duas soluções alternativas que não quebram o layout do teclado existente e não envolvem a troca de layouts ; uma é ligar o Mode_switch a outra tecla.

A chave ideal para isso é Super_R, que fica ao lado de AltGR, o código é 134. No entanto, nem todos os teclados os possuem e, no meu caso, em um laptop, eu também não o tenho, então decidi vinculá-lo ao último chave restante que eu praticamente nunca uso, Controle Certo.

xmodmap -e "keycode 105 = Mode_switch"

Eu tenho um layout de teclado físico americano, mas falta uma configuração de layout europeu e a tecla less / maior / bar (também conhecida como ISO_Backslash, embora isso não seja reconhecido pelo próprio xmodmap) geralmente ao lado de Z nesses teclados. Liguei isso ao Menu (135), mas poderia servir como uma alternativa ao R_Ctrl e Super_R

Esta é uma solução suja, suponho.

A segunda solução demorou um pouco mais para descobrir. Usando sxhkd (alternativa xbindkeys)

Se você adicionar isso a ~ / .config / sxhkd / sxhkdrc :

~ISO_Level3_Shift
    xdotool key Mode_switch

Seu AltGR funcionará normalmente, mas quando pressionado, o Mode_switch é alternado (como caps lock, mas para Mode_switch) e qualquer tecla xmodmap que o utilize será bloqueada no modo AltGR até você pressionar AltGR novamente para descompactá-lo. Deveria ser simples criar um script para descompactá-lo automaticamente quando a chave for liberada, mas minhas tentativas para fazê-lo foram bastante complicadas, para dizer o mínimo.

Cestarian
fonte