Bidouillage : des leds pour capslock et numlock en bash

Les leds capslock et numlock sur ma machine sont ridiculement petits et mal placés. Dans la plupart des environnement de bureau (KDE, Gnome, XFCE, Cinnmon, Mate, Unity...) il y a des applets pour les remplacer, mais comme je n'utilise en lieu et place que d'un simple gestionnaire de fenêtre (OpenBox), je me suis trouvé assez dépourvu. J'ai cherché sur le web une application qui se loge dans le systray, mais sans succès.

D'où l'idée d'en faire une à ma sauce, mais comme je renvoie toujours au surlendemain l'apprentissage de Python  j'ai encore eu recours à un infâme bidouillage en bash. Enfin, ça fonctionne, et même plutôt bien, alors...

Les dépendances :
  • xterm pour exécuter le script dans une fenêtre facile à gérer
  • alltray pour envoyer la fenêtre dans le systray
  • xset pour connaître l'état du clavier (capslock et numlock)
  • xseticon (AUR) pour changer son icône à chaque changement d'état.
  • aplay, installé par alsa donc en principe présent

le principe :

Le script est lancé dans xterm via alltray pour ce loger dans le systray. Il boucle pour vérifier l'état du clavier avec xset. En cas de changement il joue un son avec aplay puis modifie sa propre icône avec xseticon.

Le lancement :

idéalement dans un autostart, mais en fait n'importe où. Voici ma formule

alltray -H -- xterm -fa "BitStream Vera Sans Mono" -fs 10 -cr "rgb:ff/ff/fe" -geometry 80x12-10+40 -hold -e lockkeys > /dev/null 2>&1 &

  • l'option -H de alltray permet à xterm de se minimiser immédiatement dans le systray
  • le séparateur -- est important pour indiquer à alltray que les options suivantes correspondent au programme à lancer (voir man alltray).
  • les options -fa "BitStream Vera Sans Mono" -fs 10 établissent la police et sa taille
  • l'option -fs 10 -cr "rgb:ff/ff/fe" rend le curseur invisible
  • l'option -geometry 80x12-10+40 demande à xterm de s'ouvrir dans une fenêtre de 80 caractères x 12 lignes à 40 pixels du haut et à 10 pixels de le droite de l'écran.
  • l'option -hold demande à xterm de ne pas fermer sa fenêtre sitôt la fin du script. Utile en cas de planté et / ou de déboggage.
  • -e lockkeys c'est le script lui-même qui doit être dans votre PATH (/usr/local/bin me paraît bien).
  • > /dev/null 2>&1 & permet de ne pas polluer un terminal avec des messages hors de saison. À supprimer en cas de débogage

Les icônes et le son :

Les icônes sont faites à la rache. Si un graphiste passe par là et veux me faire quelque-chose de bien je lui en serai éternellement reconnaissant.

le son, pop.wav, est piqué dans un paquet quelconque (kdebase-workspace je crois). 

Tout ceci est attendu par le script dans /usr/local/share/lockkeys

le code :

#!/bin/bash
# dépendances : xorg-xset, xterm, alltray, xseticon (AUR)
echo "Ceci est un infâme bricolage en bash pour servir de leds à capslock et numlock"
echo
echo -e "\\033[1mlancement de la commande (par exemple dans un autostart) :\\033[0m"
echo 'alltray -H -- xterm -e lockkeys > /dev/null 2>&1 &'
echo
echo -e "\\033[1moptions complémentaires pour xterm (à placer avant -e lockkeys)\\033[0m"
echo '-fa "BitStream Vera Sans Mono" -fs 10 (choisir sa police et sa taille)'
echo '-cr "rgb:ff/ff/fe" (pour rendre le curseur invisible)'
echo '-geometry 80x10-10+40 (pour positioner la fenêtre)'
echo
echo -e "\\033[1;34;01mvgay@vintherine.org\\033[0m"
#vérifier les dépendances
# xterm et alltray se vérifient d'eux-mêmes
if ! command -v xset >/dev/null; then
echo
echo "Dépendance xset du paquet xorg-xset non trouvée"
exit 1
fi
if ! command -v xseticon >/dev/null; then
echo
echo "Dépendance xseticon (AUR) non trouvée"
exit 1
fi
#chemin des icônes et du son
ShareDir="/usr/local/share/lockkeys/"
icone[0]=$ShareDir"lockkeys-0.png"
icone[1]=$ShareDir"lockkeys-1.png"
icone[2]=$ShareDir"lockkeys-2.png"
icone[3]=$ShareDir"lockkeys-3.png"
GetLed ()
{
LedMask=$(xset q | grep "LED mask" | sed -r "s/.*LED mask:\\s+[0-9a-fA-F]+([0-9a-fA-F]).*/\\1/")
NewCapsLock=$(( 0x$LedMask & 0x1 ))
NewNumLock=$(( 0x$LedMask & 0x2 ))
let mask=$NewCapsLock+$NewNumLock
}
GetLed
CapsLock=$NewCapsLock
NumLock=$NewNumLock
xseticon -id $WINDOWID ${icone[mask]}
while :
do
GetLed
if [ $CapsLock != $NewCapsLock  ] || [ $NumLock != $NewNumLock ]; then
CapsLock=$NewCapsLock
NumLock=$NewNumLock
aplay $ShareDir"pop.wav" >/dev/null 2>&1
xseticon -id $WINDOWID ${icone[mask]}
fi
done
Vus : 1033
Publié par Vincent Gay : 38