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


Pour une raison quelconque, mon ordinateur portable est bloqué dans Caps Lock. J'ai le verrouillage des majuscules clé mappée par xmodmap à hyper_ldonc je n'ai pas de caps_lock touche pour l'éteindre. 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.


75
2017-11-17 17:51


origine


[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 caps: none - Pavlos Theodorou
@PavlosTheodorou, qui désactivera la clé CAPS, ne changera pas son statut en tant qu’exigence OP. - user.dz
il y a un bug là-bas. il n'y a pas de commande pour le faire actuellement. 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 chapeaux - Pavlos Theodorou


Réponses:


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

Ici, c'est encore sous une forme plus étendue. Nous utilisons le Python  bibliothèque de types appeler les fonctions C à partir du Bibliothèque X directement. La fonction XkbLockModifiers change l’état des verrous du clavier, sur le clavier principal (XkbUseCoreKbd = 0x0100), affectant le verrouillage des majuscules (2), le mettant à 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. Courir 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. Compiler avec gcc -O -Wall -o caps_lock_off caps_lock_off.c -lX11, avec les forfaits build-essentials et libx11-dev installée.

#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 Caps Lock:

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.


118
2017-11-17 22:26



Je vais essayer quand je suis sur mon portable. Je suis sur mon bureau pour le moment. - Echogene
Hmm, la méthode python fonctionnait pour moi, mais après la mise à niveau vers Yakkety, ce n'est pas le cas. Le bug où le verrouillage des majuscules reste bloqué persiste bien sûr! - Gringo Suave
@GringoSuave Je ne sais pas pourquoi cela pourrait être. Se il vous plaît installer xtrace et courir 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 afficher les dernières lignes, en commençant par celle contenant QueryExtension name='XKEYBOARD'. Je ne prétends pas comprendre le résultat, mais je vais essayer. - Gilles
J'ai un segfault: terminé par le signal SIGSEGV (erreur de limite d'adresse) Erreur de segmentation… - Gringo Suave
000: <: 0005: 20: Request (98): QueryExtension name = 'XKEYBOARD' 000:>: 0005: 32: Répondre à QueryExtension: present = true (0x01) major-opcode = 135 first-event = 85 first-error = 137 000: <: 0006: 8: XKEYBOARD-Request (135,0): UseExtension major = 1 mineur = 0 000:>: 0006: 32: réponse à UseExtension: major = 1 mineur = 0 - Gringo Suave


Automatisation X Les outils 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 n'est pas possible ou ne fonctionne pas, allez avec Réponse de Gilles / script python. Il n'a pas besoin d'installer d'outil supplémentaire, il utilise uniquement python Et libX11 lib partagée qui sont pré-installés.

En utilisant xdotool

  1. Installez-le

    sudo apt-get install xdotool
    
  2. Envoyer un événement CAP / down

    xdotool key Caps_Lock
    

Un autre outil est xte

  1. Installez-le

    sudo apt-get install xautomation
    
  2. Envoyer un événement de verrouillage / arrêt de CAPS

    xte "key Caps_Lock"
    

Les références:


42
2018-04-11 08:41



Et si ça ne marche pas? - quant_dev
C'est le seul qui a fonctionné pour moi. annuler et d'autres n'ont pas fonctionné. - lnostdal
Impossible d'installer, mot de passe non accepté. :( - Gringo Suave
Oui, merci, py script a travaillé. ;) - Gringo Suave
Si vous utilisez un clavier externe, une autre option pourrait être de le rebrancher. Le modificateur de majuscule peut être réinitialisé pour que vous puissiez saisir des lettres minuscules. - chris544


En ce qui concerne la version de Gilles Python qui ne fonctionne pas dans les nouveaux ubuntus, définir le bon retour 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)


6
2017-07-30 15:37





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.


3
2018-06-27 06:01



Le changement ne l'a pas vraiment fait, mais cela m'a amené à appuyer sur le verrouillage des majuscules pour bien faire les choses. - labyrinth