Remapear uma tecla para Ctrl e fazer com que ela se comporte como Ctrl durante a edição de texto

5

Comprei um teclado mecânico de aparência sofisticada na Coréia. Em geral, funciona muito bem, exceto por uma coisa - mesmo que possua as teclas Alt e Ctrl do lado direito, estas teclas não geram os mesmos códigos de um " "teclado normal".

Longa história curta, Direita Alt é a tecla Hangul (mudanças entre letras latinas e coreanas) e Ctrl é Hanja (converte entre caracteres Hangul e "antigos" coreanos) . Eu queria usar múltiplos layouts - coreano e meu local (polonês) e manter o melhor dos dois mundos - isso significa fazer com que Alt emite o código de tecla para Alt enquanto digita o polonês e para o Hangul enquanto digita em coreano.

O coreano funcionou fora da caixa (já que os códigos de teclas estão corretos lá), mas o polonês precisava de ajustes. Alterei o layout ( /usr/share/X11/xkb/symbols/pl ) adicionando as seguintes linhas na seção xkb_symbols ativa:

key <HNGL>  { [ ISO_Level3_Shift ] };
key <HJCV>  { [ Control_R ] };

E eu comentei as linhas relacionadas a HNGL e HJCV no layout "inet", pois elas estavam sobrescrevendo minhas alterações.

Depois dessas mudanças eu consegui Alt funcionando perfeitamente, mas ainda havia um problema com a tecla Ctrl não funcionando corretamente. Em geral funciona, mas ao editar texto, eu deveria ser capaz de, por exemplo exclua uma palavra usando a combinação Ctrl + Backspace e não consigo fazer isso.

Eu executei xset -r 131 para desabilitar a repetição de teclas para esta tecla Ctrl / Hanja mas ela ainda não funciona como uma Ctrl real

Aqui está a saída xev do% de remapeamentoHanja:

KeyPress event, serial 34, synthetic NO, window 0x1000001,
root 0x13f, subw 0x0, time 49086462, (88,89), root:(3928,141),
state 0x10, keycode 131 (keysym 0xffe4, Control_R), same_screen YES,
XKeysymToKeycode returns keycode: 105
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False

E aqui está uma Ctrl regular (de outro teclado):

KeyPress event, serial 39, synthetic NO, window 0x1000001,
root 0x13f, subw 0x0, time 49144922, (616,377), root:(4456,429),
state 0x10, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
XLookupString gives 0 bytes: 
XmbLookupString gives 0 bytes: 
XFilterEvent returns: False

Existe alguma coisa que eu possa mudar para fazer o meu sistema tratar essa chave como uma Ctrl completa?

    
por user1234567 15.05.2018 / 15:08

1 resposta

2

Atribuir uma chave a outra é único quando a chave é um modificador.  Esta resposta tem uma boa explicação:

The action, when it is a modifier action such as this, changes the current modifier state, which (simply put) is a set of flags recorded in the operating system that record what modifiers are currently "on". [This record] influences what action further keypresses map to.

E quando você está tentando mapear sua chave, ela está sendo mapeada como uma chave normal e perdendo informações que especificam como ela se comporta quando várias teclas são pressionadas.

Para demonstrar, execute xmodmap . Observe que há duas chaves padrão (Control_L e Control_R) mapeadas para o modificador de controle. Se você executar xmodmap -e 'keycode 131 = Control_L' e, em seguida, xmodmap , o modificador de controle ainda deve ter duas chaves, portanto, sua chave não está sendo reconhecida como um modificador.

Para mapear como um modificador:

Limpar a tecla modificadora control

xmodmap -e 'clear control'

Adicione o código de tecla para a tecla Hanja

xmodmap -e 'keycode 131 = Control_L'

Por fim, adicione novamente os modificadores padrão:

xmodmap -e 'add control = Control_L'
xmodmap -e 'add control = Control_R'

Agora, se você fosse rodar o xmodmap novamente, você notaria que uma nova chave foi adicionada para o controle do modificador, e deve funcionar corretamente agora.

Aqui é um link para as instruções oficiais do Arch Linux sobre a reatribuição de modificadores às teclas do seu teclado.

edit:

para alterações persistentes, adicione a /usr/share/X11/xkb/symbols/pl :

key <HJCV> { [ Control_L ] };

modifier_map Control { Control_L, Control_R, <HJCV> };
    
por jackw11111 24.05.2018 / 04:37