web-dev-qa-db-fra.com

Gardez NumLock toujours sur

J'ai déjà retiré physiquement le capuchon de la touche Verrouillage numérique afin d'éviter d'appuyer accidentellement dessus (j'utilise un clavier très compact). Mais je comprends qu'il y a n bogue dans xorg qui bascule Num Lock en off lorsque je change de disposition du clavier.

J'ai donc besoin de quelque chose qui empêche le verrouillage numérique de "désactiver", ou encore (peut-être plus facile?) Surveille l'état de la Verrouillage numérique et l'allume "dès qu'il s'aperçoit qu'il est" désactivé ".

Here est une réponse Unix qui semble résoudre ce problème, mais pour LXDE. Que devrais-je faire pour que cette idée fonctionne dans Ubuntu 15.04 et Unity?

Je ne sais pas comment surveiller ou interroger l'état de verrouillage numérique, ni comment modifier l'état de verrouillage numérique par programmation, mais here est une solution qui utilise un script simple qui s'exécute en permanence. On dirait que cela fonctionnerait, mais je ne suis pas sûr qu'il soit judicieux de le laisser fonctionner tout le temps?

8

Le plus propre consisterait bien sûr à corriger le bogue, mais comme solution de contournement, le script d'arrière-plan ci-dessous fera l'affaire:

#!/usr/bin/env python3
import subprocess
import time

key = "org.gnome.settings-daemon.peripherals.keyboard numlock-state"
while True:
    time.sleep(1)
    state = subprocess.check_output([
        "/bin/bash", "-c", "gsettings get "+key]).decode("utf-8").strip()
    if state != "'on'":
        subprocess.Popen([
            "/bin/bash", "-c", "gsettings set "+key+" 'on'"])

Comment utiliser

  • Copiez le script ci-dessus dans un fichier vide, enregistrez-le sous le nom NM_on.py
  • Testez-le en arrière-plan avec la commande:

    python3 /path/to/NM_on.py
    
  • Si tout fonctionne correctement, ajoutez-le à Applications de démarrage: Dash> Applications de démarrage> Ajouter, ajoutez la commande suivante:

    /bin/bash -c "sleep 10 && python3 /path/to/NM_on.py"
    

Explication

Nous pouvons obtenir l'état actuel Num Lock de plusieurs manières:

  • lancer la commande:

    xset q
    

    qui donnera un résultat comme:

    Keyboard Control:
      auto repeat:  on    key click percent:  0    LED mask:  00000000
      XKB indicators:
        00: Caps Lock:   off    01: Num Lock:    off    02: Scroll Lock: off
        03: Compose:     off    04: Kana:        off    05: Sleep:       off
        06: Suspend:     off    07: Mute:        off    08: Misc:        off
        09: Mail:        off    10: Charging:    off    11: Shift Lock:  off
        12: Group 2:     off    13: Mouse Keys:  off
      auto repeat delay:  500    repeat rate:  33
    .....
    

    ou avec la commande:

    gsettings get org.gnome.settings-daemon.peripherals.keyboard numlock-state
    

    ce qui retourne simplement 'on', 'off' ou 'unknown'.

    Comme ce dernier est extrêmement léger, nous pouvons très bien l’utiliser dans un script d’arrière-plan pour vérifier une fois par seconde et définir la valeur sur 'on', si nécessaire, avec la commande:

    gsettings set org.gnome.settings-daemon.peripherals.keyboard numlock-state 'on'
    

et c'est ainsi ...


Modifier

Pour une raison quelconque, j'ai raté votre dernier paragraphe, dans lequel vous avez fait référence à une autre réponse proposant une solution similaire.

Théoriquement, j'ai toujours un problème avec les scripts qui aveuglément (re) appliquent les paramètres sans vérifier l'état actuel. Il pourrait être un argument pour le faire, si la commande

gsettings get org.gnome.settings-daemon.peripherals.keyboard numlock-state

pour obtenir la valeur actuelle, serait plus exigeant que de simplement exécuter

numlockx on

pour (re -) définir numlockx on.
En regardant l'heure à laquelle les deux commandes doivent se terminer (ce qui est au moins une indication), c'est cependant l'inverse. la commande

gsettings get org.gnome.settings-daemon.peripherals.keyboard numlock-state

semble être plus "léger".

Exécuter un script en arrière-plan est-il une mauvaise idée?

Bien sûr, si vous n'avez aucune raison d'exécuter un script en arrière-plan, ne le faites pas. Dans le même temps, si un script en arrière-plan est bien écrit, soigneusement testé, les procédures sont optimisées de manière intelligente et si cela n'ajoute aucun effet notable sur l'occupation du processeur, il serait idiot de ne pas utiliser cette solution de contournement si cela ajoute une fonctionnalité importante ou un gain de temps important.

J'ai constamment au moins 4 à 8 scripts d'arrière-plan en cours d'exécution. La plupart d'entre eux pendant semaines sans redémarrage. Jamais remarqué aucun effet sur mes systèmes âgés. Gardez à l'esprit que votre système exécute de nombreuses boucles de toute façon.

9
Jacob Vlijm