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

21

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

Assim, o que o X11 faz para um pressionamento de tecla caps-lock, ele ainda deve ser obtido (sem desabilitar a tecla ou remapear para outra tecla), mas sem nada traduzir o pressionamento de tecla em uma tecla de alternância (que pode estar no nível do kernel?).

Eu tentei alterar o scancode, mas isso apenas remapeava a chave. Também removi a entrada de capslock com xmodmap , mas isso também desativou limites.

Como posso dizer ao kernel para ignorar o caps-key (wrt sua funcionalidade regular), mas ainda passar a mensagem para X?

Só para adicionar mais 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 quasimode". Quando não há erro, eu posso usar o enso com tampas, mas o sofar ainda não descobriu como desabilitar a funcionalidade do caps enquanto o enso ainda é capaz de obtê-lo.

    
por Chris2048 12.05.2013 / 01:24

3 respostas

27

Acho que tenho uma técnica para desabilitar a alternância da tecla Capslock , mas não desabilitar completamente a chave, ou remapeando-a para outra tecla no teclado.

Se você usar o comando:

setxkbmap -option caps:none

O teclado não será mais alternado. Eu confirmei isso no meu laptop rodando o Fedora 14, o LED não está mais aceso, e a funcionalidade normal Capslock sumiu.

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 que estão sendo pressionados continuam intactos para que outros aplicativos os identifiquem.

setxkbmap

O arquivo /usr/share/X11/xkb/rules/xorg.lst contém a lista completa das opções que você pode dar a setxkbmap .

Grepping através deste arquivo para "cap" notei esta linha:

caps:none            CapsLock is disabled

Existem outros valores neste arquivo, portanto, se você não quiser, talvez um desses valores alternativos seja incluído.

$ 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

por 12.05.2013 / 07:26
1

Se você não quer que a tecla Caps Lock tenha seu efeito usual, você pode desligar o modificador Lock , enquanto retém o Caps_Lock keysym.

xmodmap -e 'clear Lock'
    
por 13.05.2013 / 02:58
0

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

partial modifier_keys
xkb_symbols "capsoff" {
    key <CAPS> {
        type[Group1] = "ONE_LEVEL",
        symbols[Group1] = [ Caps_Lock ],
        actions[Group1] = [ NoAction() ]
    };
};
    
por 10.05.2014 / 09:19