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.
Réponses
Trop de publicités?Je ne connais pas d'outil en ligne de commande pour cela dans Ubuntu. (Pour le verrouillage numérique, il y a 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
.
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
-
Installez-le
sudo apt-get install xdotool
-
Envoyer un événement CAPS down/up
xdotool key Caps_Lock
Un autre outil est xte
-
Installez-le
sudo apt-get install xautomation
-
Envoyer un événement de verrouillage/ouverture CAPS
xte "key Caps_Lock"
Références :
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 )
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.