Antes, eu simplesmente tentava atribuir o Pointer_Left
keysym a alguma chave e Pointer_EnableKeys
a rolagem do bloqueio. No entanto, isso não moveu o ponteiro do mouse para a esquerda. Em vez disso, não fez nada.
Acontece que simplesmente atribuir um keysym a uma chave não é suficiente. O keysym precisa ser interpretado também. Isso é feito em um arquivo "compat". No meu sistema, eles estão localizados em / usr / share / X11 / xkb / compat.
Eu fiz meu próprio layout de teclado seguindo este excelente guia: link . Isso significa que eu tenho um arquivo "teck.xkb" (eu chamo meu layout "teck"). Esse arquivo contém a seguinte linha:
xkb_compat { include "complete" };
Observar / usr / share / X11 / xkb / compat / complete revela que esse arquivo inclui um arquivo chamado "mousekeys" na mesma pasta. Bingo.
O arquivo mousekeys contém interpretações de keyyms para controlar o mouse. Ele contém a interpretação necessária de Pointer_EnableKeys
mencionada em um dos links da minha pergunta . No entanto, ele não contém interpretações para Pointer_Left
(e Pointer_Right
e assim por diante). É por isso que não funcionou para mim antes. Em vez disso, muitos KP_*
keysyms são interpretados. Afinal, o padrão é colocar as teclas do mouse no teclado.
Felizmente, no final do arquivo mousekeys há algum código para configurar um indicador para as teclas do mouse. Perfeito!
Então eu copiei o arquivo mousekeys para uma nova pasta chamada "compat" ao lado do meu arquivo teck.xkb, e mudei o nome para "teck_mousekeys". Eu atualizei meu arquivo teck.xkb de acordo:
xkb_compat { include "teck_mousekeys+complete" };
Depois comecei a editar o arquivo teck_mousekeys. Em vez de usar KP_*
keysyms, usei os que eu queria (as teclas ao redor da linha da direita). Aqui está o resultado:
default partial xkb_compatibility "mousekeys" {
interpret.repeat= True;
interpret m {
action = MovePtr(x=-1,y=+1);
};
interpret comma {
action = MovePtr(x=+0,y=+1);
};
interpret period {
action = MovePtr(x=+1,y=+1);
};
interpret j {
action = MovePtr(x=-1,y=+0);
};
interpret l {
action = MovePtr(x=+1,y=+0);
};
interpret u {
action = MovePtr(x=-1,y=-1);
};
interpret i {
action = MovePtr(x=+0,y=-1);
};
interpret o {
action = MovePtr(x=+1,y=-1);
};
interpret k {
action = PointerButton(button=default);
};
interpret semicolon {
action = PointerButton(button=3);
};
interpret space {
action = PointerButton(button=default,count=2);
};
interpret y {
action = SetPtrDflt(affect=defaultButton,button=3);
};
interpret h {
action = SetPtrDflt(affect=defaultButton,button=2);
};
interpret n {
action = SetPtrDflt(affect=defaultButton,button=1);
};
interpret p {
action = LockPointerButton(button=default,affect=lock);
};
interpret apostrophe {
action = LockPointerButton(button=default,affect=unlock);
};
indicator "Scroll Lock" {
indicatorDrivesKeyboard;
controls= MouseKeys;
};
};
(O acima assume um layout QWERTY.)
No meu layout de teclado personalizado, defino o bloqueio de rolagem para alternar as teclas do mouse:
key <SCLK> {[Pointer_EnableKeys]};