Como não gosto de pular entre o teclado principal e as teclas de movimento, adicionei o seguinte ao meu arquivo de layout xkb.
hidden partial xkb_symbols "movement"
{
key <AD08> { [ NoSymbol, NoSymbol, Up, Up ] };
key <AC08> { [ NoSymbol, NoSymbol, Down, Down ] };
key <AC07> { [ NoSymbol, NoSymbol, Left, Left ] };
key <AC09> { [ NoSymbol, NoSymbol, Right, Right ] };
key <AD09> { [ NoSymbol, NoSymbol, Prior, Prior ] };
key <AB09> { [ NoSymbol, NoSymbol, Next, Next ] };
key <AB07> { [ NoSymbol, NoSymbol, Home, Home ] };
key <AB08> { [ NoSymbol, NoSymbol, End, End ] };
key <AC06> { [ NoSymbol, NoSymbol, Delete, Delete ] };
}
Em seguida, incluo-os no layout posteriormente no arquivo. Agora eu deveria ter as teclas de cursor acessíveis por AltGr + j, k, l, i (ou h, t, n, c, como estou usando o dvorak) etc. Isso funciona em muitos casos (como Firefox, urxvt, Eclipse, principal área de texto do LyX), mas alguns programas não fazem nada quando tento, por exemplo, mover o cursor usando esses "atalhos" (como as caixas de diálogo NetBeans e LyX).
Então, existe uma maneira de fazer esses outros programas também respeitarem meus desejos? E por que eles não estão trabalhando em primeiro lugar? Eu não estou usando um DE; somente o WM impressionante.
Editar:
- Aqui está um arquivo de layout de teclado completo, mas simplificado. Eu tenho isso
/usr/share/X11/xkb/symbols/nonpop
e carrego-osetxkbmap nonpop
. - Percebi que, no MonoDevelop, mover-se funciona, mas selecionar não. Ou seja, se eu pressionar Shift + Direita, o texto será selecionado como de costume, mas se eu pressionar AltGr + Shift + n, o cursor se moverá sem selecionar. Por exemplo, no Firefox, os dois modos podem ser usados para a seleção.
- Aqui, no final, eles falam sobre sobreposições que parecem algo que talvez possa ser uma solução, mas ainda não descobri como usá-las.
fonte
Respostas:
Por que eles não estão trabalhando?
De acordo com o artigo do ArchWiki que você mencionou:
O servidor X obtém códigos de chave do dispositivo de entrada e os converte em estado e código de chave .
state é a máscara de bit dos modificadores X (Ctrl / Shift / etc).
keysym é (de acordo com
/usr/include/X11/keysymdef.h
) o número inteiro queCada personagem de impressão tem a sua própria keysym, como
plus
,a
,A
, ouCyrillic_a
, mas outras teclas também gerar os seus keysyms, comoShift_L
,Left
ouF1
.O aplicativo nos principais eventos de imprensa / liberação obtém todas essas informações.
Alguns aplicativos rastreiam academias de teclas como
Control_L
eles mesmos, outros apenas procuram os bits modificadores no estado .Então, o que acontece, quando você pressiona AltGr+ j:
Você pressiona AltGr. O aplicativo obtém o evento KeyPressed com o código de chave 108 (
<RALT>
) e o código de chave 0xfe03 (ISO_Level3_Shift
), o estado é 0.Você pressiona j(que mapeia para "h" no dvorak sem modificadores). O aplicativo obtém o evento KeyPressed com o código de chave 44 (
<AC07>
), keysym 0xff51 (Left
) e o estado 0x80 (o modificador Mod5 está ativado).Você solta j. O aplicativo obtém o evento KeyRelease da chave
<AC07>
/Left
com os mesmos parâmetros.Em seguida, libere AltGr- evento KeyRelease para AltGr. (A propósito, o estado aqui ainda é 0x80, mas isso não importa.)
Isso pode ser visto se você executar o
xev
utilitário.Portanto, isso significa que, embora o aplicativo obtenha o mesmo código
Left
de chave de chave ( ) da chave normal<LEFT>
, ele também obtém o código de chave de chave e o estado modificador do AltGr. Provavelmente, aqueles programas que não funcionam, assistem aos modificadores e não querem trabalhar quando alguns estão ativos.Como fazê-los funcionar
Aparentemente, não podemos mudar todos os programas para não procurar modificadores. Então, a única opção para escapar dessa situação é não gerar as classes de teclas e os bits de estado dos modificadores.
1. Grupo separado
O único método que vem à cabeça é: definir teclas de movimento do cursor num grupo e comutador separado, com uma prensa de chave separada, para que o grupo antes de pressionar as teclas j, k, l, i(
h
,t
,n
,c
) (grupo de bloqueio é o método preferido por uma mudança de grupo de tempo, como eu entendo).Por exemplo:
Agora, se você pressionar primeiro AltGre depois (separadamente) uma das teclas de movimento, isso funcionará.
No entanto, isso não é muito útil, seria mais apropriado, em
LockGroup
vez de travar, e pressionar AltGr antes e depois da troca de grupo. Ainda melhorSetGroup
: AltGr selecionaria esse grupo apenas enquanto pressionado, mas isso revela aos aplicativos o keyym do AltGr (ISO_Group_Shift
/ISO_Group_Latch
/ o que for definido) (mas o estado do modificador permanece limpo).Mas ... existe também a possibilidade de o aplicativo também ler códigos de chave (os códigos das chaves reais). Então ele notará as teclas do cursor "falsas".
2. Sobreposição
A solução mais "de baixo nível" seria a sobreposição (como o mesmo artigo descreve).
Overlay significa simplesmente que alguma tecla (teclado real) retorna o código de outra tecla. O servidor X altera o código de chave de uma chave e calcula o estado do modificador e o código de chave desse novo código de chave, para que o aplicativo não note a alteração.
Mas as sobreposições são muito limitadas:
Quanto ao resto, a implementação é bastante semelhante ao método com um grupo separado:
SetControls
significa mudar o bit de controle enquanto a tecla é pressionada e restaurá-lo na liberação da tecla. Deve haver função semelhanteLatchControls
, masxkbcomp
me dána compilação de mapas de teclado.
(A propósito, eu também uso o dvorak e também remapeei algumas academias de teclas de movimento para altos níveis de teclas alfabéticas. E também deparei com algumas funcionalidades quebradas (seleção nas notas do Xfce e alternância na área de trabalho por Ctrl-Alt-Esquerda / Direita). sua pergunta e esta resposta, agora eu sei o que é uma sobreposição :).)
fonte
Overlay1_Enable
. Eu tenho o mesmo sintoma que aqui: github.com/GalliumOS/galliumos-distro/issues/362Eu tenho o mesmo problema. Isso é tão doloroso.
Portanto, o título é "Como fazer com que todos os aplicativos respeitem meu layout xkb modificado?". Bem, acho que a única maneira é consertar todos os programas que fazem isso incorretamente. Vamos fazer isso!
Bem, depois de relatar esse bug no NetBeans ( atualização: tentei a versão mais recente e funciona agora! ), Pensei em continuar relatando esse bug para todos os aplicativos. O próximo aplicativo da lista foi o Speedcrunch .
No entanto, depois de procurar relatórios de erros semelhantes, encontrei esse problema . Outra pessoa está tendo o mesmo problema, ótimo!
Depois de ler os comentários, você entenderá que esse bug deve estar presente em todos os aplicativos QT. Aqui está um relatório de bug do QT . Não resolvido, mas parece que o problema foi resolvido no Qt5 .
No entanto, se você olhar para os comentários, há uma solução alternativa! Aqui está como isso funciona. Se você estava fazendo isso:
Então você pode mudar para isso:
E isso realmente resolverá o problema de algumas das aplicações! Por exemplo, o Speedcrunch agora funciona para mim! Yay!
Sumário
No momento, qualquer aplicativo deve funcionar corretamente. Caso contrário, você precisará usar
type[Group1]="ONE_LEVEL"
. Se você já o possui, é necessário atualizar seu software. Se ainda assim não funcionar, é específico do aplicativo e você deve enviar um relatório de erro.ATUALIZAÇÃO (23-09-2017)
Atualmente, todos os aplicativos respeitam meu layout de teclado. Todos, exceto um.
Sério, o manuseio do teclado no Chromium é lixo . Existem vários problemas com isso:
foo
,bar
e alguns tecla faz Backspace emfoo
, então ele vai continuar trabalhando como Backspace nobar
mesmo que seja redefinido lá.Durante anos, eu ignorei esses problemas simplesmente não usando cromo. No entanto, hoje em dia as coisas tendem a usar o Electron , que infelizmente é construído no Chromium.
A maneira correta de resolver isso seria enviar um relatório de erro no Chromium e esperar o melhor. Não sei quanto tempo levará para resolver um problema que está afetando apenas alguns usuários ... mas essa parece ser a única saída. O problema é que o cromo realmente funciona bem com o
neo(de)
layout. O layout neo tem teclas de seta no nível 5, mas não consigo que ele funcione no meu layout personalizado.Relatórios de bugs ainda abertos:
fonte
Como fazê-los funcionar - Solução 3
Usando níveis adicionais e ação RedirectKey
A solução a seguir usa a tecla Alt esquerda para fornecer as teclas de cursor em jkli, Home / End / PageUp / PageDown no uopö e um Delete no Backspace.
A tecla Alt esquerda permanece utilizável para outros fins em todas as outras teclas (como no menu do aplicativo). O Alt esquerdo (Mod1) é removido do estado do modificador quando o bloco do cursor é usado para que os aplicativos não possam vê-lo.
fonte