¿Cómo desactivo el bloqueo de mayúsculas (la cerradura, no la llave) mediante la línea de comandos?

91

Por alguna razón, mi computadora portátil está atascada en el bloqueo de mayúsculas. Tengo la Caps Lockclave asignada por el xmodmapque hyper_l, por lo que no tienen una caps_lockclave para apagarlo. ¿Hay alguna forma de desactivarlo mediante la línea de comandos? Sería bueno si pudiera restablecer el estado de bloqueo sin restablecer mi computadora, especialmente para referencia futura. Esto ha sucedido antes, pero me gustaría saber ahora cómo hacerlo correctamente esta vez.

Echogene
fuente
[echo -e "$ (dumpkeys | grep ^ keymaps) \ nkeycode 58 = Escape" | sudo loadkeys] [1] [Agregar la siguiente línea a .profile o .bash_profile debería desactivar el bloqueo de mayúsculas:] [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
setxkbmap -option caps: none
Pavlos Theodorou
@PavlosTheodorou, que deshabilitará la tecla MAYÚSCULAS, no cambiará su estado como requisito de OP.
user.dz
Hay un error allí. No hay ningún comando actualmente para hacer eso. podría usar setleds + caps o -caps pero no funciona. lo único que puedes hacer ya está respondido. puedes remapear gorras
Pavlos Theodorou

Respuestas:

129

No conozco ninguna herramienta de línea de comandos para eso en Ubuntu. (Para Num Lock, hay numlockx Instalar numlockx ). Aquí hay una línea que puede copiar y pegar en una ventana de 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)'

Aquí está nuevamente en una forma más expandida. Usamos la biblioteca de tipos de Python para llamar a las funciones C desde la biblioteca X directamente. La función cambia el estado de los bloqueos del teclado, en el teclado central ( = 0x0100), afectando el bloqueo de mayúsculas (2), configurándolo en 0 (desactivado).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)

Si tiene un modificador atascado, cambie 2 a la máscara de los modificadores que desea desactivar. Los modificadores son 1 = Shift, 2 = Lock (Caps Lock), 4 = Control, 8 = Mod1, 16 = Mod2, 32 = Mod3, 64 = Mod4, 128 = Mod5. Ejecute xmodmap -pmpara ver a qué corresponden Mod1 a Mod5. Por ejemplo, para desactivar todos los modificadores, llame X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(255), c_uint(0)). Para activar Bloq Num que está en Mod2 y al mismo tiempo desactivar Bloq Mayús, llame X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16)).


Aquí hay una versión C si desea hacer un pequeño binario en lugar de invocar Python. Compilar con gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11, con los paquetes build-essentialse libx11-devinstalados.

#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;
}

Posiblemente, también sea interesante una forma de ignorar temporalmente el bloqueo de mayúsculas:

xkbset nullify lock

Después de esto, el Bloqueo de mayúsculas estará desactivado permanentemente, hasta que lo vuelva a habilitar xkbset nullify -lock.

Gilles
fuente
Voy a intentarlo la próxima vez en mi computadora portátil. Estoy en mi escritorio por ahora.
Echogene
Hmm, el método Python solía funcionar para mí, pero después de actualizar a Yakkety no lo hace. ¡El error donde se bloquea el bloqueo de mayúsculas persiste, por supuesto!
Gringo Suave
@GringoSuave No tengo idea de por qué podría ser eso. Instale, xtraceejecute 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)'y publique las últimas líneas, comenzando con la que contiene QueryExtension name='XKEYBOARD'. No pretendo entender la salida, pero lo intentaré.
Gilles
2
Me sale un segfault: terminado por la señal SIGSEGV (error de límite de dirección) Error de segmentación ...
Gringo Suave
000: <: 0005: 20: Solicitud (98): QueryExtension name = 'XKEYBOARD' 000:>: 0005: 32: Responde a QueryExtension: present = true (0x01) major-opcode = 135 first-event = 85 first-error = 137 000: <: 0006: 8: XKEYBOARD-Request (135,0): UseExtension major = 1 minor = 0 000:>: 0006: 32: Reply to UseExtension: major = 1 minor = 0
Gringo Suave
59

Las herramientas de automatización X podrían usarse para enviar los eventos clave requeridos.

Nota:
Para el primer uso, esta solución necesita que grabe la contraseña correcta para instalar la nueva herramienta, si su CAPS está activa actualmente:

  • Use la SHIFTtecla para escribir letras minúsculas.
  • Habilita la accesibilidad, superpone el teclado virtual.
  • Vuelva a enchufar un teclado externo. (Gracias a chris455 )
  • Abra el escritor de Office, escriba la contraseña allí, cambie la letra, copie y luego péguela en el diálogo de contraseña.

Si todas las opciones anteriores no son posibles o no funcionan, vaya con el script de respuesta / python de Gilles . No necesita instalar ninguna herramienta adicional, solo usa pythony libX11comparte lib que están preinstaladas.

Utilizando xdotool

  1. Instalarlo

    sudo apt-get install xdotool
    
  2. Enviar un evento CAPS abajo / arriba

    xdotool key Caps_Lock
    

Otra herramienta es xte

  1. Instalarlo

    sudo apt-get install xautomation
    
  2. Enviar un evento de bloqueo / bloqueo de mayúsculas

    xte "key Caps_Lock"
    

Referencias

user.dz
fuente
¿Qué pasa si esto no funciona?
quant_dev
2
Este es el único que funcionó para mí. anular y otros no funcionaron.
lnostdal
12
NO SE PUEDE INSTALAR, NO SE ACEPTA CONTRASEÑA. :(
Gringo Suave
2
Puede usar las teclas Mayús para ingresar letras minúsculas mientras Bloq Mayús está habilitado.
chris544
1
Si usa un teclado externo, otra opción podría ser volver a enchufarlo; El modificador de bloqueo de mayúsculas podría restablecerse, por lo que puede ingresar letras minúsculas.
chris544
14

En cuanto a la versión de Python de Gilles que no funciona en ubuntus más nuevos, parece que configurar el retorno correcto para la pantalla abierta:

#! /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
fuente
Esto funciona muy bien, es un salvavidas
Garret Gang
8

Si no puede acceder a CAPS porque lo reasignó en .bashrc, como lo hice yo, simplemente cambiar a un terminal virtual (alt + ctl + fN) y luego volver a trabajar funcionó para mí.

Benjamín
fuente
1
El cambio no lo hizo, pero me llevó a un punto en el que podía presionar el bloqueo de mayúsculas para hacer las cosas bien.
laberinto
1

Tuve este problema y pude solucionarlo usando el teclado integrado (en Ubuntu Mate, bajo Acceso universal).

Una vez activado, debería ver que la tecla Bloq Mayús está roja, o de alguna manera indica que está bloqueada. Luego puede presionar para desactivar.

jogi
fuente