¿Cómo apago Caps Lock (el candado, no la tecla) por línea de comando?

75

Por algún motivo, mi portátil está bloqueado con Caps Lock. Tengo la tecla Bloq Mayús asignada por xmodmap a hyper_l , por lo que no tengo una clave caps_lock para desactivarla. ¿Hay alguna manera de desactivarlo por línea de comando? Sería bueno si pudiera restablecer el estado de bloqueo sin reiniciar mi computadora, especialmente para referencia futura. Esto ha sucedido antes, pero me gustaría saber ahora cómo hacerlo correctamente esta vez.

    
pregunta Echogene 17.11.2011 - 17:51

4 respuestas

117

No conozco ninguna herramienta de línea de comandos para eso en Ubuntu. (Para Num Lock, hay 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á de nuevo en una forma más expandida. Usamos el Python biblioteca ctypes para llamar directamente a las funciones C de la biblioteca X . La función XkbLockModifiers cambia el estado de las cerraduras del teclado , en el teclado central ( XkbUseCoreKbd = 0x0100), afectando el Bloqueo de mayúsculas (2), configurándolo en 0 (apagado).

#!/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 bloqueado, cambie 2 a la máscara de los modificadores que desea desactivar. Los modificadores son 1 = Shift, 2 = Bloqueo (Bloq Mayús), 4 = Control, 8 = Mod1, 16 = Mod2, 32 = Mod3, 64 = Mod4, 128 = Mod5. Ejecute xmodmap -pm para ver a qué se corresponden Mod1 a Mod5. Por ejemplo, para desactivar todos los modificadores, llame a 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 a X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16)) .

Aquí hay una versión C si quiere hacer un pequeño binario en lugar de invocar Python. Compile con gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11 , con los paquetes build-essentials y libx11-dev instalados.

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

También posiblemente de interés es una forma de ignorar temporalmente el Bloqueo de mayúsculas:

xkbset nullify lock

Después de esto, Caps Lock estará permanentemente desactivado, hasta que vuelva a habilitarlo con xkbset nullify -lock .

    
respondido por el Gilles 17.11.2011 - 22:26
42
Las herramientas de

automatización X se podrían usar para enviar los eventos de clave requeridos.

  

Nota:
  Esta solución necesita que grabe la contraseña correcta, si su   CAPS está actualmente activo: escritor de oficina abierta, escriba la contraseña allí,   cambie el caso de la letra, cópielo y péguelo en el cuadro de diálogo de contraseña.

     

Si el paso anterior no es posible o no funciona, ve con la secuencia de comandos de respuesta / python de Gilles . No necesita instalar ninguna herramienta adicional, solo usa python & amp; libX11 lib compartido preinstalados.

Uso de xdotool

  1. Instálalo

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

    xdotool key Caps_Lock
    

Otra herramienta es xte

  1. Instálalo

    sudo apt-get install xautomation
    
  2. Enviar un evento de bloqueo / desconexión de CAPS

    xte "key Caps_Lock"
    

Referencias:

respondido por el user.dz 11.04.2015 - 08:41
6

En cuanto a la versión de Gilles python que no funciona en el ubuntus más nuevo, establecer el retorno correcto para la pantalla abierta parece ser el truco:

#! /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 enlace )

    
respondido por el diegogs 30.07.2017 - 15:37
3

Si no puedes acceder a CAPS porque lo has reasignado en .bashrc, como hice yo, simplemente cambiar a una terminal virtual (alt + ctl + fN) y luego volver a funcionar me funcionó.

    
respondido por el Benjamin 27.06.2017 - 06:01

Lea otras preguntas en las etiquetas