Fazer bloqueio de rolagem alternar as teclas do mouse na linha inicial

2

Isso é o que eu quero:

  1. Eu pressiono o Scroll Lock no meu teclado.
  2. O LED Scroll Lock no meu teclado acende.
  3. As teclas ao redor da linha da direita da casa agora controlam o ponteiro do mouse (movendo-o, clicando, clicando com o botão direito, arrastando, etc. Como as Teclas do Mouse em um teclado normal.)
  4. O resto das chaves não fazem nada, o mesmo que antes ou o que quer que seja.
  5. Eu pressiono novamente o Scroll Lock.
  6. O LED de bloqueio de rolagem é desativado.
  7. Sem teclas do mouse.

Ele precisa funcionar em Trisquel .

Eu usei xkb antes de remapear algumas chaves, então pensei que talvez o xkb pudesse fazer isso. E parece que pode:

  • Há muitos keyyms relacionados ao mouse que podem ser usados: Pointer_Left , Pointer_DownRight , Pointer_Button_Dflt , Pointer_Drag_Dflt , etc.
  • Existem chaves de bloqueio, como ISO_Level5_Lock .
  • Existem algumas coisas específicas para configurar para ativar as teclas do mouse: link
  • Parece ser possível controlar indicadores: link . (Procure por "indicador" nessa página; é mencionado várias vezes.)

No entanto, sou novo no Linux e no xkb. Eu consegui fazer remakes de teclas muito simples com o xkb, mas infelizmente não consigo descobrir como juntar todos os itens acima e em quais arquivos colocá-lo. Soluções que não envolvem xkb também são OK, assim como soluções parciais.

    
por lydell 31.12.2013 / 13:58

2 respostas

6

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]};
    
por 18.01.2014 / 19:08
0

Eu não sei muito sobre o xkb, mas eu fiz algo baseado nas fontes xevdevserver , um programa que lê o Linux evdev eventos de um dispositivo / dev / input / eventX e os injeta em um servidor X usando a extensão XTEST. Você pode encontrar o código aqui:

link

A principal desvantagem é que você precisará executar algo usando sudo , o que pode não ser o caso.

    
por 01.01.2014 / 15:13