web-dev-qa-db-fra.com

Comment désactiver le verrouillage des majuscules (le verrou, pas la clé) par ligne de commande?

Pour une raison quelconque, mon ordinateur portable est bloqué dans le verrouillage majuscule. J'ai le Caps Lock clé mappée par xmodmap à hyper_l, je n'ai donc pas de clé caps_lock pour l'éteindre. Y a-t-il un moyen de le désactiver 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 future. Cela s'est déjà produit auparavant, mais j'aimerais savoir comment le faire correctement cette fois-ci.

91
Echogene

Je ne connais aucun outil de ligne de commande pour cela dans Ubuntu. (Pour Num Lock, il y a numlockxInstall numlockx .) Voici une ligne 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)'

Le voici à nouveau sous une forme plus développée. Nous utilisons le Pythonbibliothèque de types == pour appeler des fonctions C à partir du X bibliothèque directement. La fonction XkbLockModifiers modifie l'état des verrous du clavier principal (XkbUseCoreKbd = 0x0100), ce qui affecte le verrouillage majuscule (2) et le définit 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 = Maj, 2 = Verrouillage (Verrouillage Majuscule), 4 = Contrôle, 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 qui est sur Mod2 et en même temps désactiver le verrouillage majuscule, appelez X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2 | 16), c_uint(16)).


Voici une version C si vous voulez faire 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 moyen d’ignorer temporairement le verrouillage des majuscules est peut-être également intéressant:

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.

129
Gilles

X outils d'automatisation peuvent être utilisés pour envoyer les événements de clé requis.

Remarque:
Pour la première utilisation, cette solution nécessite l’enregistrement du mot de passe correct pour installer le nouvel outil, si votre CAPS est actuellement actif:

  • Utilisation SHIFT touche pour taper des lettres minuscules.
  • Activer l'accessibilité, superposer le clavier virtuel.
  • Rebranchez un clavier externe. (Merci à chris455 )
  • Ouvrez Office writer, écrivez le mot de passe ici, changez la casse des lettres, copiez-le, puis collez-le dans la boîte de dialogue du mot de passe.

Si toutes les options précédentes ne sont pas possibles ou ne fonctionnent pas, optez pour script de réponse/python de Gilles . Il n’est nécessaire d’installer aucun outil supplémentaire, il utilise uniquement les bibliothèques partagées python & libX11 qui sont pré-installées.

Utilisation de xdotool

  1. Installez-le

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

    xdotool key Caps_Lock
    

Un autre outil est xte

  1. Installez-le

    Sudo apt-get install xautomation
    
  2. Envoyer un événement CAPS Lock Down/Up

    xte "key Caps_Lock"
    

Références:

57
user.dz

Quant à Gilles python version ne fonctionnant pas dans Ubuntus plus récent, définir le 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 https://stackoverflow.com/questions/29638210/how-can-i-use-python-xlib-to-generate-a-single-keypress )

12
diegogs

Si vous ne pouvez pas accéder à CAPS car vous l'avez remappé dans .bashrc, comme je l'ai fait, basculer simplement vers un terminal virtuel (alt + ctl + fN), puis revenir en arrière ont fonctionné pour moi.

8
Benjamin

J'ai eu ce problème et j'ai pu le résoudre en utilisant le clavier OnBoard (dans Ubuntu Mate, sous Universal Access).

Une fois allumé, vous devriez voir que la touche CapsLock est rouge, ou d'une manière ou d'une autre indiquer qu'elle est verrouillée. Ensuite, vous pouvez appuyer sur pour désactiver.

1
jogi