Come faccio a disattivare BLOC MAIUSC (il blocco, non il tasto) dalla riga di comando?

75

Per qualche motivo il mio laptop è bloccato in Caps Lock. Ho il tasto Bloc Maiusc mappato da xmodmap a hyper_l , quindi non ho una chiave caps_lock per disattivarlo. C'è un modo per spegnerlo dalla riga di comando? Sarebbe bello se potessi ripristinare lo stato di blocco senza reimpostare il mio computer, soprattutto per riferimento futuro. Questo è successo prima, ma vorrei sapere ora come farlo correttamente questa volta.

    
posta Echogene 17.11.2011 - 18:51

4 risposte

116

Non conosco alcuno strumento da riga di comando per questo in Ubuntu. (Per Num Lock, c'è numlockx .) Ecco un one-liner che puoi copiare e incollare in una finestra di terminale:

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)'

Eccolo di nuovo in una forma più espansa. Utilizziamo Python libreria ctypes per chiamare direttamente le funzioni C dalla biblioteca X . La funzione XkbLockModifiers modifica lo stato delle serrature della tastiera , sulla tastiera principale ( XkbUseCoreKbd = 0x0100), che interessa Caps Lock (2), impostandolo su 0 (disattivato).

#!/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 hai un modificatore bloccato, modifica 2 con la maschera dei modificatori che vuoi disattivare. I modificatori sono 1 = Shift, 2 = Lock (Caps Lock), 4 = Control, 8 = Mod1, 16 = Mod2, 32 = Mod3, 64 = Mod4, 128 = Mod5. Esegui xmodmap -pm per vedere a che cosa corrispondono Mod1 e Mod5. Ad esempio, per disattivare tutti i modificatori, chiama X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(255), c_uint(0)) . Per attivare Bloc Num su Mod2 e allo stesso tempo disattivare Bloc Maiusc, chiama X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16)) .

Ecco una versione C se vuoi fare un piccolo binario invece di invocare Python. Compilare con gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11 , con i pacchetti build-essentials e libx11-dev installati.

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

Potrebbe anche interessarti un modo per ignorare temporaneamente il Blocco maiuscole:

xkbset nullify lock

Dopodiché, Caps Lock sarà definitivamente disattivato, finché non lo riattivi con xkbset nullify -lock .

    
risposta data Gilles 17.11.2011 - 23:26
41

Gli strumenti di automazione X potrebbero essere utilizzati per inviare gli eventi chiave richiesti.

  

Nota:
  Questa soluzione ti richiede di registrare la password corretta, se la tua   CAPS è attualmente attivo: scrittore open office, password di scrittura lì,   cambia il case letter, copialo, quindi incollalo nella finestra di dialogo password.

     

Se il passaggio precedente non è possibile o non funziona, vai con risposta di Gilles / script python . Non ha bisogno di installare alcun strumento aggiuntivo, usa solo python & amp; libX11 di lib condivise preinstallate.

Utilizzo di xdotool

  1. Install it

    sudo apt-get install xdotool
    
  2. Invia un evento CAPS down / up

    xdotool key Caps_Lock
    

Un altro strumento è xte

  1. Install it

    sudo apt-get install xautomation
    
  2. Invia un evento di lock down / up CAPS

    xte "key Caps_Lock"
    

References:

risposta data user.dz 11.04.2015 - 10:41
5

Come per la versione di Gilles Python che non funziona in Ubuntu più recente, l'impostazione del ritorno corretto per lo schermo aperto sembra fare il trucco:

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

(Codice adattato da link )

    
risposta data diegogs 30.07.2017 - 17:37
3

Se non riesci ad accedere a CAPS perché lo hai rimappato in .bashrc, come ho fatto io, allora semplicemente passando a un terminale virtuale (alt + ctl + fN) e poi tornando indietro ha funzionato per me.

    
risposta data Benjamin 27.06.2017 - 08:01

Leggi altre domande sui tag