Comment désactiver Caps Lock (le verrou, pas la clé) par ligne de commande?

75

Pour une raison quelconque, mon ordinateur portable est bloqué dans Caps Lock. J'ai la clé Caps Lock mappée par xmodmap à hyper_l , donc je n'ai pas de clé caps_lock pour la désactiver. Est-il possible de l'éteindre en ligne de commande? Ce serait bien si je pouvais réinitialiser l’état du verrou sans réinitialiser mon ordinateur, en particulier pour référence ultérieure. Cela s'est déjà produit auparavant, mais j'aimerais savoir maintenant comment le faire correctement cette fois-ci.

    
posée Echogene 17.11.2011 - 18:51
la source

4 réponses

116

Je ne connais aucun outil en ligne de commande pour cela dans Ubuntu. (Pour le verrouillage numérique, numlockx . Voici une ligne simple que vous pouvez copier-coller dans une fenêtre 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)'

La voici de nouveau sous une forme plus étendue. Nous utilisons Python bibliothèque ctypes pour appeler directement les fonctions C depuis la bibliothèque X . La fonction XkbLockModifiers modifie l’état des verrous du clavier. , sur le clavier principal ( XkbUseCoreKbd = 0x0100), affectant le verrouillage des majuscules (2), en le définissant sur 0 (désactivé).

#!/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 vous avez un modificateur bloqué, remplacez 2 par le masque des modificateurs que vous souhaitez désactiver. Les modificateurs sont 1 = Shift, 2 = Lock (Caps Lock), 4 = Control, 8 = Mod1, 16 = Mod2, 32 = Mod3, 64 = Mod4, 128 = Mod5. Exécutez xmodmap -pm pour voir à quoi correspondent Mod1 à Mod5. Par exemple, pour désactiver tous les modificateurs, appelez X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(255), c_uint(0)) . Pour activer le verrouillage numérique sur Mod2 et désactiver simultanément le verrouillage des majuscules, appelez X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16)) .

Voici une version C si vous voulez créer un petit binaire au lieu d’appeler Python. Compilez avec gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11 , avec les packages build-essentials et libx11-dev installés.

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

Un autre moyen intéressant est d’ignorer temporairement le verrouillage des majuscules:

xkbset nullify lock

Après cela, le verrouillage des majuscules sera définitivement désactivé jusqu'à ce que vous le réactiviez avec xkbset nullify -lock .

    
réponse donnée Gilles 17.11.2011 - 23:26
la source
41
Les outils

X automation peuvent être utilisés pour envoyer les événements clés requis.

  

Remarque:
  Cette solution nécessite que vous enregistriez le mot de passe correct, si votre   CAPS est actuellement actif: rédacteur de bureau ouvert, y écrivez le mot de passe,   changez la casse des lettres, copiez-la, puis collez-la dans la boîte de dialogue du mot de passe.

     

Si cette étape précédente est impossible ou ne fonctionne pas, rendez-vous avec la réponse de Gilles / le script python . Il n'a pas besoin d'installer d'outil supplémentaire, il utilise uniquement python & amp; libX11 lib partagée qui sont pré-installés.

Utilisation de xdotool

  1. Installez-le

    sudo apt-get install xdotool
    
  2. Envoyer un événement de down / up CAPS

    xdotool key Caps_Lock
    

Un autre outil est xte

  1. Installez-le

    sudo apt-get install xautomation
    
  2. Envoyer un événement de verrouillage / déconnexion de CAPS

    xte "key Caps_Lock"
    

Références:

réponse donnée user.dz 11.04.2015 - 10:41
la source
5

Quant à la version de Gilles Python ne fonctionnant pas dans les nouveaux ubuntus, la définition du retour correct pour l’affichage ouvert semble faire l'affaire:

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

(Code adapté de lien )

    
réponse donnée diegogs 30.07.2017 - 17:37
la source
3

Si vous ne pouvez pas accéder à CAPS parce que vous l’avez remappé dans .bashrc, comme je l’ai fait, alors passer simplement à un terminal virtuel (alt + ctl + fN) et revenir en arrière a fonctionné pour moi.

    
réponse donnée Benjamin 27.06.2017 - 08:01
la source

Lire d'autres questions sur les étiquettes