Comment désactiver le verrouillage majuscule (le verrou, pas la clé) en ligne de commande?

92

Pour une raison quelconque, mon ordinateur portable est bloqué dans le verrouillage majuscule. J'ai Caps Lockmappé la clé xmodmapsur hyper_l, je n'ai donc pas de caps_lockclé pour la désactiver. Y a-t-il un moyen de le désactiver en ligne de commande? Ce serait bien si je pouvais réinitialiser l'état de verrouillage 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.

Échogène
la source
[echo -e "$ (dumpkeys | grep ^ keymaps) \ nkeycode 58 = Escape" | sudo loadkeys] [1] [L'ajout de la ligne suivante à .profile ou .bash_profile devrait désactiver le verrouillage des majuscules:] [2] [xmodmap -e "remove lock = Caps_Lock"] [3] [1]: askubuntu.com/questions/ 43986 /… [2]: askubuntu.com/questions/43986/… [3]: askubuntu.com/questions/43986/…
One Zero
setxkbmap -option majuscules: aucune
Pavlos Theodorou
@PavlosTheodorou, qui désactivera la touche CAPS, il ne basculera pas son statut en tant que condition requise pour l'OP.
user.dz
il y a un bug là-bas. il n'y a actuellement aucune commande pour le faire. vous pouvez utiliser setleds + caps ou -caps mais cela ne fonctionne pas. la seule chose que vous pouvez faire est déjà répondu. vous pouvez remapper les casquettes
Pavlos Theodorou

Réponses:

130

Je ne connais aucun outil de ligne de commande pour cela dans Ubuntu. (Pour Num Lock, il existe numlockx Installer 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 la bibliothèque ctypes Python pour appeler directement les fonctions C à partir de la bibliothèque X. La fonction modifie l'état des verrous du clavier sur le clavier principal ( = 0x0100), ce qui a une incidence sur le verrouillage des majuscules (2) en le réglant sur 0 (désactivé).XkbLockModifiersXkbUseCoreKbd

#!/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écuter xmodmap -pmpour 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. Compiler avec gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11, avec les packages build-essentialset libx11-devinstallé.

#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, Caps Lock sera définitivement désactivé jusqu'à ce que vous le réactiviez xkbset nullify -lock.

Gilles
la source
J'essaierai quand je serai à côté de mon ordinateur portable. Je suis sur mon bureau pour l'instant.
Echogene
Hmm, la méthode python fonctionnait pour moi, mais après la mise à niveau vers Yakkety, elle ne fonctionne plus. Le bug qui bloque le verrouillage des majuscules persiste bien sûr!
Gringo Suave
@GringoSuave Je ne sais pas pourquoi cela pourrait être. S'il vous plaît installer xtraceet exécuter xtrace python -c 'from ctypes import *; X11 = cdll.LoadLibrary("libX11.so.6"); buf = (c_char*16)(); display = X11.XOpenDisplay(None); X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0)); X11.XkbGetState(display, 0x0100, buf); X11.XCloseDisplay(display)'et poster les dernières lignes, en commençant par celle qui contient QueryExtension name='XKEYBOARD'. Je ne prétends pas que je vais comprendre le résultat, mais je vais essayer.
Gilles
3
Je reçois une erreur de segmentation: terminée par le signal SIGSEGV (Erreur de limite d'adresse) Erreur de segmentation…
Gringo Suave
1
J'ai eu un segfault sur python (2) mais cela a fonctionné sur python3
gtrak
60

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

Remarque:
pour la première utilisation, cette solution nécessite que vous enregistriez le mot de passe correct pour installer le nouvel outil, si votre CAPS est actuellement actif:

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

Si toutes les options précédentes ne sont pas possibles ou ne fonctionnent pas, utilisez le script de réponse / python de Gilles . Il n'a pas besoin d'installer un outil supplémentaire, il utilise uniquement pythonet libX11lib partagé qui sont pré-installés.

En utilisant 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:

utilisateur.dz
la source
Et si ça ne marche pas?
quant_dev
2
C'est le seul qui a fonctionné pour moi. annuler et les autres ne fonctionnaient pas.
lnostdal
12
IMPOSSIBLE D'INSTALLER, MOT DE PASSE NON ACCEPTÉ. :(
Gringo Suave
2
Vous pouvez utiliser les touches Maj pour saisir des lettres minuscules lorsque le verrouillage des majuscules est activé.
chris544
1
Si vous utilisez un clavier externe, une autre option pourrait être de le rebrancher; Le modificateur Caps Lock peut être réinitialisé, vous pouvez donc entrer des lettres minuscules.
chris544
15

En ce qui concerne la version de Gilles python 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 )

les moqueurs
la source
Cela fonctionne vraiment bien, est un sauveur de vie
Garret Gang
8

Si vous ne pouvez pas accéder à CAPS parce que 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.

Benjamin
la source
1
Changer n’a pas vraiment fonctionné, mais j’ai pu me permettre d’appuyer sur la touche majuscule pour que tout se passe bien.
labyrinthe
2

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.

jogi
la source