Sous Ubuntu, quand on change le volume au clavier, (en général, c'est Fn-Haut ou Bas), on a le droit à une notification via notify-osd. C'est assez joli à mon goût. Donc j'ai cherché à retrouver ce comportement sous Openbox, et ma méthode doit fonctionner avec d'autres WM.
C'est un script python. L'idée, c'est de lancer une sorte de démon (pyvolumedaemon) qui tourne en tâche de fond (il faut le mettre dans le autostart.sh). Il surveille les modification du fichier ~/.volume. Dès que celui-ci est modifié, il change le volume et affiche la notification correspondante à ce qui est indiqué dans le fichier.
Ensuite, à chaque fois qu'on veut changer le volume, on lance une commande qui se charge d'écrire ce qu'il faut dans ~/.volume : pyvolume up|down|toggle. C'est la commande qu'il faut mettre dans le rc.xml à l'appui sur les touches qui nous intéressent.
J'ai recollé des bouts de scripts trouvés sur le net, dont un bout (celui qui balance la notification) sur le site de Cannonical. J'ai choisi de faire une tache de fond, car si on relance un processus pour chaque notification, les notifications s'accumulent et ne remplacent pas les précédentes.
Voilà donc les scripts :
pyvolumedaemon :
Code : Tout sélectionner
#!/usr/bin/python2
import sys
import time
import os
import pynotify
import commands
import pyinotify
def pushNotification (icon, value):
n = pynotify.Notification ("Volume", "", icon);
n.set_hint_int32 ("value", value);
n.set_hint_string ("x-canonical-private-synchronous", "");
n.show ()
def changer_volume(action):
volref = int(commands.getoutput('amixer sset Master 0%- | grep -m 1 "%]" | cut -d "[" -f2|cut -d "%" -f1'))
if (action == 'toggle'):
os.system('amixer -q set Master toggle')
elif (action == 'plus'):
os.system('amixer -q set Master 5%+ unmute')
elif (action == 'moins'):
os.system('amixer -q set Master 5%- unmute')
off = commands.getoutput("amixer get Master | grep off")
if off == "":
vol = int(commands.getoutput('amixer sset Master unmute | grep -m 1 "%]" | cut -d "[" -f2|cut -d "%" -f1'))
if vol == 0:
etat = 'notification-audio-volume-off'
elif vol < 34:
etat = 'notification-audio-volume-low'
elif vol > 66:
etat = 'notification-audio-volume-high'
else:
etat = 'notification-audio-volume-medium'
else:
etat = 'notification-audio-volume-muted'
vol = volref
if (action != 'toggle'):
if (vol == volref):
if (vol == 100):
vol = 101
elif (vol == 0):
vol = -1
#print vol
if not pynotify.init ("icon-value"):
sys.exit (1)
pushNotification (etat, vol);
wm = pyinotify.WatchManager() # Watch Manager
mask = pyinotify.IN_MODIFY # watched events
class HandleEvents(pyinotify.ProcessEvent):
def process_IN_MODIFY(self, event):
f = open('/home/clement/.volume', 'r')
contenu = f.readline()
#print contenu, ' contenu'
if (contenu != ''):
contenu = contenu[0]
#print contenu, ' contenu[0]'
if (contenu == 'p'):
changer_volume('plus')
os.system('echo "" > /home/clement/.volume')
elif (contenu == 't'):
changer_volume('toggle')
os.system('echo "" > /home/clement/.volume')
elif (contenu == 'm'):
changer_volume('moins')
os.system('echo "" > /home/clement/.volume')
f.close()
p = HandleEvents()
notifier = pyinotify.Notifier(wm, p)
wdd = wm.add_watch('/home/clement/.volume', mask, rec=True)
notifier.loop()
Code : Tout sélectionner
#!/bin/bash
command=$1
if [ "$command" = "" ]; then
echo "usage: $0 {up|down|toggle}"
exit 0;
fi
if [ "$command" = "up" ]; then
echo "p" > /home/clement/.volume
fi
if [ "$command" = "down" ]; then
echo "m" > /home/clement/.volume
fi
if [ "$command" = "toggle" ]; then
echo "t" > /home/clement/.volume
fi
exit 1
Il faut les rendre exécutables et les mettre dans /usr/bin ou un dossier de ce genre.
Alors, qu'en dites vous ? Si vous avez des suggestions d'améliorations, je suis preneur !