Como evitar o efeito de alternância caps-lock, sem remapear ou desativá-lo?

22

Eu tenho um programa X11 que pega caps-lock e o usa. O problema é que eu quero desativar a alternância regular de caps-lock, mas isso parece desativar a chave.

Então, o que quer que o X11 obtenha para pressionar uma tecla caps-lock, ele ainda deve ser obtido (sem desativar a chave ou remapear para outra chave), mas sem que nada traduza a tecla em um caps-toggle (que pode estar no nível do kernel? )

Eu tentei mudar o scancode, mas isso apenas reformulou a chave. Também removi a entrada do capslock xmodmap, mas isso também desativou o caps.

Como posso dizer ao kernel para ignorar a tecla caps-chave (escrever sua funcionalidade regular), mas ainda assim passar a mensagem para o X?

Apenas para adicionar um pouco mais de detalhes:

O 'programa' que estou tentando executar é humanizado 'enso'. Quando não há chave, recebo o erro "CRITICAL: root: não foi possível encontrar a chave quase-modo". Quando não há erro, eu posso usar o enso com caps, mas o sofar não descobriu como desativar a funcionalidade de caps enquanto o enso ainda é capaz de chegar lá.

Chris2048
fonte
Por favor, forneça detalhes sobre o que você tentou, ou seja, as expressões exatas do xmodmap. Sem detalhes, não podemos dizer se você sabia o que fazer e fez errado, ou se fez certo, mas o código falhou por algum outro motivo. Também forneça o sistema operacional que você está usando, porque alguns possuem processamento de código de chave que ocorre abaixo do nível do servidor X.
Kyle Jones
@Kyle Tentei "remover Lock = Caps_Lock" e depois "keycode 66 =" (que foi mapeado para CapsLock). Estou executando o ubuntu 12.10 em uma máquina de 64 bits.
21313 Chris2048
Outra possibilidade é remapear para outra chave. setxkbmap -option ctrl:nocapsremaps para Control_L, por exemplo.
21413 Chris Down
Está dizendo que você ficaria bem se pudéssemos dar um jeito de remapear o caps-lock para dizer a chave de controle ou não é isso que você procura? Tal como está, essa pergunta é meio confusa, seria muito útil se você adicionasse detalhes à questão do que você tentou até agora.
slm
Só para esclarecermos também, há um recurso no Ubuntu 12.10 onde você pode tornar o caps-lock uma chave de controle adicional. É isso que você está pensando quando diz "remapeando"? Aqui está uma captura de tela da caixa de diálogo: flickr.com/photos/11708996@N00/3010939023
slm

Respostas:

28

Acho que tenho uma técnica para desabilitar a alternância da Capslocktecla, mas não desabilitá-la completamente, ou remapear para outra tecla do teclado.

Se você usar o comando:

setxkbmap -option caps:none

O teclado não irá mais alternar. Confirmei isso no meu laptop executando o Fedora 14, o LED não acende mais e a Capslockfuncionalidade normal se foi.

No entanto, o uso do xev ainda mostra que a tecla está sendo pressionada:

$ xev
...
...
KeyPress event, serial 35, synthetic NO, window 0x6800001,
    root 0xb1, subw 0x0, time 261504852, (167,-15), root:(353,268),
    state 0x10, keycode 66 (keysym 0xffffff, VoidSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 35, synthetic NO, window 0x6800001,
    root 0xb1, subw 0x0, time 261504971, (167,-15), root:(353,268),
    state 0x10, keycode 66 (keysym 0xffffff, VoidSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False
    ...

Portanto, os eventos pressionados com a tecla ainda permanecem intactos para outros aplicativos buscá-los.

setxkbmap

O arquivo /usr/share/X11/xkb/rules/xorg.lstcontém a lista completa de quais opções você pode dar setxkbmap.

Observando este arquivo para "cap", observei esta linha:

caps:none            CapsLock is disabled

Existem outros valores nesse arquivo; portanto, se não é isso que você procura, talvez um desses valores alternativos seja usado.

$ grep cap /usr/share/X11/xkb/rules/xorg.lst
  grp:caps_switch      CapsLock (while pressed), Alt+CapsLock does the original capslock action
  grp:caps_toggle      CapsLock
  grp:shift_caps_toggle Shift+CapsLock
  grp:shift_caps_switch CapsLock (to first layout), Shift+CapsLock (to last layout)
  grp:alt_caps_toggle  Alt+CapsLock
  lv3:caps_switch      CapsLock
  lv3:caps_switch_latch CapsLock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)
  ctrl:nocaps          Make CapsLock an additional Ctrl
  ctrl:swapcaps        Swap Ctrl and CapsLock
  grp_led:caps         CapsLock
  caps                 CapsLock key behavior
  caps:internal        CapsLock uses internal capitalization. Shift "pauses" CapsLock
  caps:internal_nocancel CapsLock uses internal capitalization. Shift doesn't affect CapsLock
  caps:shift           CapsLock acts as Shift with locking. Shift "pauses" CapsLock
  caps:shift_nocancel  CapsLock acts as Shift with locking. Shift doesn't affect CapsLock
  caps:capslock        CapsLock toggles normal capitalization of alphabetic characters
  caps:numlock         Make CapsLock an additional NumLock
  caps:swapescape      Swap ESC and CapsLock
  caps:escape          Make CapsLock an additional ESC
  caps:backspace       Make CapsLock an additional Backspace
  caps:super           Make CapsLock an additional Super
  caps:hyper           Make CapsLock an additional Hyper
  caps:shiftlock       CapsLock toggles Shift so all keys are affected
  caps:none            CapsLock is disabled
  compose:caps         CapsLock
  shift:breaks_caps    Shift cancels CapsLock
  shift:both_capslock  Both Shift-Keys together toggle CapsLock
  shift:both_capslock_cancel Both Shift-Keys together activate CapsLock, one Shift-Key deactivates

Referências

slm
fonte
5
Se você acidentalmente executar o comando com o capslock ativado, poderá redefinir o xkbmap executando setxkbmap -option "".
Nemo
Ele aparece no xev, mas realmente não funciona no mecanismo Valve Source 2.
quer
1

Se você não deseja que a Caps Lockchave tenha o efeito usual, pode desativar o Lockmodificador, mantendo o Caps_Locktimbre da tecla.

xmodmap -e 'clear Lock'
Gilles 'SO- parar de ser mau'
fonte
Isso não parece desativar o capslock.
Chris2048
@ Chris2048 Funciona para mim ™. Pode ser incompatível com algumas configurações de XKB ou com alguns aplicativos (os aplicativos executam seu próprio processamento de caps lock, a maioria deles usa as mesmas funções de biblioteca, mas há exceções).
Gilles 'SO- stop be evil'
0

Isso é muito semelhante à resposta que dei para outra pergunta . Este trecho de código xkb deve fazer o truque.

partial modifier_keys
xkb_symbols "capsoff" {
    key <CAPS> {
        type[Group1] = "ONE_LEVEL",
        symbols[Group1] = [ Caps_Lock ],
        actions[Group1] = [ NoAction() ]
    };
};
billyjmc
fonte
onde isso deve ir? Estive analisando esse tipo de snippets por 10 minutos sem descobrir. Ele precisa fazer parte de um arquivo mais completo ou pode ser autônomo e aplicar-se à configuração padrão?
você precisa saber é o seguinte