112 votes

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

Pour une raison quelconque, mon ordinateur portable est bloqué en verrouillage des majuscules. J'ai le Caps Lock clé mappée par xmodmap à hyper_l donc je n'ai pas de caps_lock pour l'éteindre. Existe-t-il un moyen de le désactiver par ligne de commande ? Ce serait bien si je pouvais réinitialiser l'état de verrouillage sans réinitialiser mon ordinateur, surtout pour une référence future. Cela s'est déjà produit auparavant, mais j'aimerais savoir maintenant comment le faire correctement cette fois-ci.

141voto

Schof Points 952

Je ne connais pas d'outil en ligne de commande pour cela dans Ubuntu. (Pour le verrouillage numérique, il y a numlockx Install 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)'

Le voici à nouveau sous une forme plus étendue. Nous utilisons le Python Bibliothèque ctypes pour appeler des fonctions C à partir de l Bibliothèque X directement. La fonction XkbLockModifiers modifie l'état des verrous du clavier, sur le clavier principal ( XkbUseCoreKbd = 0x0100), affectant le verrouillage des majuscules (2), en le réglant 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 du modificateur que vous voulez désactiver. Les modificateurs sont 1=Shift, 2=Lock (Caps Lock), 4=Control, 8=Mod1, 16=Mod2, 32=Mod3, 64=Mod4, 128=Mod5. Exécuter xmodmap -pm pour voir à quoi correspondent les 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 le Mod2 et en même temps désactiver le Verrouillage Caps, 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'invoquer Python. Compilez avec gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11 avec les paquets build-essentials y libx11-dev installé.

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

Il est également possible de trouver un moyen d'ignorer temporairement le verrouillage des majuscules :

xkbset nullify lock

Après cela, le verrouillage des majuscules sera désactivé de manière permanente, jusqu'à ce que vous le réactiviez à l'aide de la fonction xkbset nullify -lock .

80voto

user.dz Points 45060

Utilisation de l'automatisation d'Xorg

Les outils d'automatisation d'Xorg pourraient être utilisés pour envoyer les événements clés requis.

Nota:

Lors de la première utilisation, cette solution nécessite que vous enregistriez le mot de passe correct pour installer le nouvel outil, si votre ordinateur n'est pas en mesure de le faire. CAPS est actuellement actif :

  • Utilisez SHIFT pour taper des lettres minuscules.
  • Activer l'accessibilité, superposer le clavier virtuel.
  • Rebranchez un clavier externe. (Merci à chris455 )
  • Ouvrez Office Writer, écrivez-y le mot de passe, 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, allez avec Réponse de Gilles / Python script . Il ne nécessite pas l'installation d'un outil supplémentaire, il utilise seulement python & libX11 shared lib qui sont pré-installés.

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 de verrouillage/ouverture CAPS

    xte "key Caps_Lock"

Références :

19voto

diegogs Points 291

En ce qui concerne la version Python de Gilles qui ne fonctionne pas dans les Ubuntus plus récents, le fait de définir le retour correct pour l'affichage ouvert semble faire l'affaire :

#!/usr/bin/env python

from ctypes import *

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 )

10voto

Benjamin Points 101

Si vous ne pouvez pas accéder aux CAPS parce que vous les avez remappés dans le fichier .bashrc, comme je l'ai fait, il suffit de passer à un terminal virtuel (alt+ctl+fN) et de revenir en arrière.

5voto

jogi Points 151

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

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X