Como desativo o Caps Lock (a fechadura, não a chave) pela linha de comando?

91

Por alguma razão, meu laptop está preso no Caps Lock. Eu tenho a Caps Lockchave mapeada xmodmappara hyper_l, então não tenho uma caps_lockchave para desativá-la. Existe uma maneira de desativá-lo pela linha de comando? Seria bom se eu pudesse redefinir o estado de bloqueio sem reiniciar o computador, especialmente para referência futura. Isso já aconteceu antes, mas agora eu gostaria de saber como fazê-lo corretamente.

Echogene
fonte
[echo -e "$ (dumpkeys | grep ^ keymaps) \ nkeycode 58 = Escape" | sudo loadkeys] [1] [A adição da seguinte linha ao .profile ou .bash_profile deve desativar o caps lock:] [2] [xmodmap -e "remove lock = Caps_Lock"] [3] [1]: askubuntu.com/questions/ 43986 /… [2]: askubuntu.com/questions/43986/… [3]: askubuntu.com/questions/43986/…
One Zero
tampas -option setxkbmap: nenhum
Pavlos Theodorou
@PavlosTheodorou, que desativará a chave CAPS, não alternará seu status como requisito de OP.
user.dz
há um bug lá. atualmente não há nenhum comando para fazer isso. você pode usar setleds + caps ou -caps, mas não está funcionando. a única coisa que você pode fazer já está respondida. você pode remapear tampas
Pavlos Theodorou

Respostas:

129

Não conheço nenhuma ferramenta de linha de comando para isso no Ubuntu. (Para Num Lock, existe o numlockx Instalar numlockx .) Aqui está uma lista que você pode copiar e colar em uma janela do terminal:

python -c 'from ctypes import *; X11 = cdll.LoadLibrary("libX11.so.6"); display = X11.XOpenDisplay(None); X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0)); X11.XCloseDisplay(display)'

Aqui está novamente de uma forma mais expandida. Usamos a biblioteca ctypes do Python para chamar diretamente as funções C da biblioteca X. A função altera o estado dos bloqueios do teclado, no teclado principal ( = 0x0100), afetando o Caps Lock (2), configurando-o para 0 (desativado).XkbLockModifiersXkbUseCoreKbd

#!/usr/bin/env python
from ctypes import *
X11 = cdll.LoadLibrary("libX11.so.6")
display = X11.XOpenDisplay(None)
X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0))
X11.XCloseDisplay(display)

Se você tiver um modificador bloqueado, altere 2 para a máscara dos modificadores que deseja desativar. Os modificadores são 1 = Shift, 2 = Bloqueio (Caps Lock), 4 = Controle, 8 = Mod1, 16 = Mod2, 32 = Mod3, 64 = Mod4, 128 = Mod5. Execute xmodmap -pmpara ver a que Mod1 a Mod5 correspondem. Por exemplo, para desativar todos os modificadores, chame X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(255), c_uint(0)). Para ativar o Num Lock, que está no Mod2, e ao mesmo tempo desativar o Caps Lock, ligue X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16)).


Aqui está uma versão em C se você quiser criar um pequeno binário em vez de chamar o Python. Compile com gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11, com os pacotes build-essentialse libx11-devinstalado.

#include <stdio.h>
#include <X11/X.h>
#include <X11/XKBlib.h>
int main()
{
    Display *display = XOpenDisplay(NULL);
    if (display == NULL) {
        fprintf(stderr, "Couldn't open display\n");
        return 2;
    }
    Bool sent = XkbLockModifiers(display, XkbUseCoreKbd, LockMask, 0);
    if (!sent) {
        fprintf(stderr, "Couldn't send LatchLockState\n");
        return 1;
    }
#ifdef REPORT_STATE
    XkbStateRec xkb_state;
    Status status = XkbGetState(display, XkbUseCoreKbd, &xkb_state);
    if (status) {
        fprintf(stderr, "XkbGetState returned %d\n", status);
        return 1;
    }
    printf("state.group=%02x\n", xkb_state.group);
    printf("state.locked_group=%02x\n", xkb_state.locked_group);
    printf("state.base_group=%02x\n", xkb_state.base_group);
    printf("state.latched_group=%02x\n", xkb_state.latched_group);
    printf("state.mods=%02x\n", xkb_state.mods);
    printf("state.base_mods=%02x\n", xkb_state.base_mods);
    printf("state.latched_mods=%02x\n", xkb_state.latched_mods);
    printf("state.locked_mods=%02x\n", xkb_state.locked_mods);
    printf("state.compat_state=%02x\n", xkb_state.compat_state);
    printf("state.grab_mods=%02x\n", xkb_state.grab_mods);
    printf("state.compat_grab_mods=%02x\n", xkb_state.compat_grab_mods);
    printf("state.lookup_mods=%02x\n", xkb_state.lookup_mods);
    printf("state.compat_lookup_mods=%02x\n", xkb_state.compat_lookup_mods);
    printf("state.ptr_buttons=%02x\n", xkb_state.ptr_buttons);
#endif
    int err = XCloseDisplay(display);
    if (err) {
        fprintf(stderr, "XCloseDisplay returned %d\n", err);
        return 1;
    }
    return 0;
}

Também possivelmente interessante é uma maneira de ignorar temporariamente o Caps Lock:

xkbset nullify lock

Depois disso, o Caps Lock será desativado permanentemente, até que você o reative xkbset nullify -lock.

Gilles
fonte
Vou tentar quando for o próximo no meu laptop. Estou na minha área de trabalho por enquanto.
Echogene
Hmm, o método python costumava funcionar para mim, mas após a atualização para o Yakkety, isso não acontece. O erro em que o caps lock fica preso persiste, é claro!
Gringo Suave
@GringoSuave Não tenho idéia do porquê disso. Instale, xtraceexecute xtrace python -c 'from ctypes import *; X11 = cdll.LoadLibrary("libX11.so.6"); buf = (c_char*16)(); display = X11.XOpenDisplay(None); X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0)); X11.XkbGetState(display, 0x0100, buf); X11.XCloseDisplay(display)'e publique as últimas linhas, começando pela que contém QueryExtension name='XKEYBOARD'. Não afirmo que vou entender a saída, mas vou tentar.
Gilles
2
Eu recebo um segfault: terminado por SIGSEGV sinal (Endereço erro limite) Falha de segmentação ...
Gringo Suave
000: <: 0005: 20: solicitação (98): nome do QueryExtension = 'XKEYBOARD' 000:>: 0005: 32: resposta ao QueryExtension: presente = true (0x01) major-opcode = 135 first-event = 85 first-error = 137 000: <: 0006: 8: XKEYBOARD-Request (135,0): UseExtension major = 1 menor = 0 000:>: 0006: 32: Responder ao UseExtension: major = 1 menor = 0
Gringo Suave
60

As ferramentas de automação X podem ser usadas para enviar os principais eventos necessários.

Nota:
Para o primeiro uso, esta solução precisa que você grave a senha correta para instalar a nova ferramenta, se o CAPS estiver ativo no momento:

  • Use a SHIFTtecla para digitar letras minúsculas.
  • Habilite a acessibilidade, sobreponha o teclado virtual.
  • Reconecte um teclado externo. (Obrigado a chris455 )
  • Abra o gravador de escritório, escreva a senha, altere a caixa das letras, copie-a e cole-a na caixa de diálogo de senha.

Se todas as opções anteriores não forem possíveis ou não funcionarem, vá com o script answer / python do Gilles . Ele não precisa instalar nenhuma ferramenta adicional, ele usa apenas a lib compartilhada pythone libX11pré-instalada.

Usando xdotool

  1. Instale-o

    sudo apt-get install xdotool
    
  2. Enviar um evento para baixo / para cima do CAPS

    xdotool key Caps_Lock
    

Outra ferramenta é xte

  1. Instale-o

    sudo apt-get install xautomation
    
  2. Enviar um evento de bloqueio / ativação do CAPS

    xte "key Caps_Lock"
    

Referências:

user.dz
fonte
E se isso não funcionar?
Quant_dev 16/06/2015
2
Este é o único que funcionou para mim. anular e outros não funcionaram.
Lnostdal 8/07
12
NÃO PODE INSTALAR, SENHA NÃO ACEITA. :(
Gringo Suave
2
Você pode usar as teclas Shift para inserir letras minúsculas enquanto o Caps Lock está ativado.
Chris544
1
Se você usar um teclado externo, outra opção poderá ser conectada novamente; O modificador Caps Lock pode ser redefinido, para que você possa inserir letras minúsculas.
Chris544
14

Quanto à versão python do Gilles não funcionar em ubuntus mais recente, definir o retorno correto para a exibição aberta parece fazer o truque:

#! /usr/bin/env python

from ctypes import *
import subprocess

class Display(Structure):
    """ opaque struct """

X11 = cdll.LoadLibrary("libX11.so.6")
X11.XOpenDisplay.restype = POINTER(Display)

display = X11.XOpenDisplay(c_int(0))
X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0))
X11.XCloseDisplay(display)

(Código adaptado de https://stackoverflow.com/questions/29638210/how-can-i-use-python-xlib-to-generate-a-single-keypress )

diegogs
fonte
Isso funciona muito bem, é um salvador da vida
Garret Gang
8

Se você não pode acessar o CAPS porque o remapeava em .bashrc, como eu fiz, basta alternar para um terminal virtual (alt + ctl + fN) e, em seguida, voltar a funcionar para mim.

Benjamin
fonte
1
A troca não foi bem assim, mas me levou a um ponto em que eu podia pressionar caps lock para acertar as coisas.
labyrinth
1

Eu tive esse problema e consegui corrigi-lo usando o teclado OnBoard (no Ubuntu Mate, sob Universal Access).

Uma vez ativada, você verá que a tecla CapsLock está vermelha ou de alguma forma indica que está bloqueada. Em seguida, você pode pressionar para desativar.

jogi
fonte