Bonjour!
Vous le savez peut-être, mais à l’instar du gestionnaire de fenêtre openbox, son cousin pekwm permet lui aussi d’afficher des menus dynamiques. Il a cependant la particularité de pouvoir affichier le résultat de scripts directement dans le menu, et non dans des sous menus.
Bref, cette fonction peut être très pratique si l’on veut éxécuter certaines actions simplement via un menu, ou alors se passer de zone de notification en ayant les infos voulues dans le menu.
Je propose que dans ce topic, chacun poste son pipemenu (menu dynamique) pour pekwm, afin que cela puisse servir aux autres ensuite.
Voici ce que j’ai fait jusqu’ici :
(Vous allez sûrement penser que c’est du bidouillage : c’est vrai, mes connaissances du bash sont très limitées. C’est pourquoi je serais ravi de recevoir vos commentaires, afin de m’expliquer ce que j’ai mal fait, ce que je pourrais améliorer, ce qui n’est pas propre, ce qui rend le script lourd ou lent… merci )
Date et heure :
Rien de merveilleux, vous l’aurez sûrement fait vous même :
[code]#!/bin/sh
#pek-date.sh
#Ajoutez ceci dans le fichier ~/.pekwm/menu :
#Entry = “” { Actions = “Dynamic /path/to/the/script/pek-date.sh” }
date=$(date +%A\ %d\ %b\ %H:%M)
echo "Dynamic {"
echo " Entry = “$date” { Actions = "Exec osmo & " }"
echo "}"
exit
[/code]
Infos sur la batterie :
#!/bin/sh
#Ajoutez ceci dans le fichier ~/.pekwm/menu :
#Entry = "" { Actions = "Dynamic /path/to/the/script/pek-battery.sh" }
echo "Dynamic {"
echo " Submenu = \"Batterie : $(acpi -b | awk '{print $4}' | sed 's/,//g') \" { "
echo "Entry = \" $(acpi -b | awk '{print $5}' | sed 's/,//g') restant\" { Actions = \"Exec source /dev/null & \" }"
echo "}"
exit;
On entame maintenant plus intéressant : une gestion de mpd, le lecteur de musique:
note : il faut avoir mpc d’installé.
on affichera la liste des artistes tout d’abord, puis ensuite a liste des chansons de l’artiste en question. Si on clique sur la chanson, elle est ajoutés à la liste de lecture. Pour éviter les doublons, si on rerajoute une autre piste, la précédente est supprimée.
[code]#! /bin/sh
#pek-mpd-alpha.sh
#script pour gérer mpd dans un menu de pekwm
#Ajoutez ceci dans le fichier ~/.pekwm/menu :
Entry = “” { Actions = "Dynamic /path/to/the/script/pek-mpd-alpha.sh 1 " }
#thuban@fritalk.org
#\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\O/\o/\o/\o/\o/\o/\o/\o/\o/\o/\Q/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/#
LISTE_ARTISTE="/tmp/liste_artiste"
CHEMIN="/home/xavier/Documents/Scripts/Pekwm" # chemin du dossier où sont enregistrés les scripts
mpc list artist | sort -f > $LISTE_ARTISTE
NB_ARTISTE=cat $LISTE_ARTISTE | wc -l
N=25 # nombre d’artistes à afficher en une fois
STATUS1=mpc current
#Qu’est ce que joue mpd?
STATUS2=mpc | grep 'playing' | grep -Eo '[0-9]+:[0-9]+/[0-9]+:[0-9]+'
#temps écoulé
#fonction qui affiche les artistes par la première lettre
#la fonction qui affiche les noms d’artistes
affiche_ () {
i=$1
while [ $i -le $(expr $1 + $N) ]
do
ARTISTE=cat $LISTE_ARTISTE | sed -n ${i}p
echo "Submenu = “$ARTISTE” {"
echo "Entry “” { Actions = “Dynamic $CHEMIN/pek-mpd-artiste2.sh ‘$ARTISTE’ &” }"
echo "}"
i=$(expr $i + 1)
done
}
echo “Dynamic {”
#on affiche le status de mpd que la première fois
if [ “$1” = “1” ]; then
#mpd joue :
if [ “$STATUS1” != “” ];then
echo “Submenu = “$STATUS1 $STATUS2” {” #status
else
#mpd est arrêté
echo "Submenu = “MPD : Ne joue pas” { "
fi
Un menu d’action pour mpd
echo “Entry = “Play-Pause” { Actions = " Exec mpc toggle & " }” #play/payse
echo “Entry = “Next” { Actions = " Exec mpc next & " }” #chanson suivant
echo “Entry = “Previous” { Actions = " Exec mpc prev & " }” #chanson précédente
echo "Separator {}"
fi
affiche_ $1
#si on n’est pas à la fin, on propose un sous menu pour afficher les N artistes suivants
if [ $i -le $NB_ARTISTE ]; then
echo "Submenu = “Plus…” {"
echo "Entry “” { Actions = “Dynamic $CHEMIN/pek-mpd-alpha.sh $i &” }"
echo "}"
fi
echo “}”
exit 0;
[/code]
L’autre script qui va avec :
[code]#!/bin/sh
#pek-mpd-artiste2.sh
#script pour gérer mpd dans un menu de pekwm, va avec pek-mpd-alpha.sh
#thuban@fritalk.org
#-----------------------------------------------------------------------------
#c’est une autre façon de faire pour ajouter les pistes
#De plus, avec l’autre script, la chanson suivante était TOUJOURS la première de la playlist…
#!!!les espaces dans les noms de fichier de passent pas toujours!!!
#remplacer la ligne “mpc find artist” par “mpc search artist” si besoin
#\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\O/\o/\o/\o/\o/\o/\o/\o/\o/\o/\Q/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/#
##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##|##
##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##A##
LISTE_CHANSON="/tmp/liste_chanson" # on enregistre la liste des chansons de l’artiste dans un fichier pour ne pas avoir à éxécuter cette commande tout le temps
v=$IFS
IFS=’
'
mpc find artist “$1” > $LISTE_CHANSON # on cherche l’artiste dans la bibliotheque
NB_CHANSON=cat $LISTE_CHANSON | wc -l
# on compte combien de chansons de cet artiste existent
#La variable suivante donne le nombre de chansons différentes dans la bibliothèque
#Elle permet d’éviter d’avoir une liste de lecture avec des doublons, et qui s’agrandit à chaque éxécution du script
NB_CHANSON_LIB=mpc stats | grep "Songs" | awk '{print $2}'
NB_CHANSON_PLAYLIST=mpc playlist | wc -l
if [ $NB_CHANSON_PLAYLIST -lt $NB_CHANSON_LIB ] | [ $NB_CHANSON_PLAYLIST -gt $(expr $NB_CHANSON_LIB + 1) ] ;then
mpc clear
mpc ls | mpc add
NB_CHANSON_PLAYLIST=mpc playlist | wc -l
fi
if [ $NB_CHANSON_PLAYLIST -eq $NB_CHANSON_LIB ]; then # Si on n'a pas de doubles, on ajoute la chanson à jouer normalement
echo "Dynamic {"
i=1
while [ $i -le $NB_CHANSON ]
do
CHANSON=`cat "$LISTE_CHANSON" | sed -n ${i}p`
echo "Entry = \"$CHANSON\" { Actions = \"Exec cat $LISTE_CHANSON | sed -n ${i}p | mpc add && mpc play $((NB_CHANSON_LIB+1)) & \" }"
i=$(expr $i + 1)
done
echo "}"
else #Si on a déja ajouté une chanson à la playlist, on la supprime avant d'ajouter la nouvelle
echo "Dynamic {"
i=1
while [ $i -le $NB_CHANSON ]
do
CHANSON=`cat "$LISTE_CHANSON" | sed -n ${i}p`
echo "Entry = \"$CHANSON\" { Actions = \"Exec mpc del $NB_CHANSON_PLAYLIST && cat $LISTE_CHANSON | sed -n ${i}p | mpc add && mpc play $((NB_CHANSON_LIB+1)) & \" }"
i=$(expr $i + 1)
done
echo "}"
fi
IFS=v
exit 0;
[/code]
Enfin, une gestion des fichiers. On se déplace dans l’arborescence, et ouvre les fichiers avec le programme souhaité. Ajout d’un sous menu pour les images, si plusieurs actions peuvent être envisagées.
[code]#!/bin/sh
#!/bin/sh
#pek-file.sh
#Script pour parcourir le dossier personnel dans pekwm
#jabber : thuban@fritalk.org
#Pour l’utiliser, ajoutez ceci dans le fichier ~/.pekwm/menu :
#Submenu = “FICHIERS :” {
Entry = “” { Actions = “Dynamic /path/to/the/script/pek-file.sh” }
}
#\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\O/\o/\o/\o/\o/\o/\o/\o/\o/\o/\Q/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/\o/#
#À améliorer :
#Ajout d’icones (fait partiellement)
##Différentes variables pour simplifier les modifications
FILEMGR=“thunar” # file manager
TERM=“urxvt” # émulateur de terminal
CHEMIN="/home/xavier/Documents/Scripts/Pekwm" # chemin du dossier où sont enregistrés les scripts
on liste le contenu du répertoire courant.
liste_ () {
LISTE=ls -1 -F --sort=extension $PWD
echo “$LISTE”
}
Cette fonction permet d’afficher un menu en fonction du type de fichier
action_ () {
case $1 in
ls: ) echo “” #on n’affiche pas les erreurs retournée par ls
;;
*/ ) echo "Submenu = “$1” {"
echo "Entry “” { Actions = “Dynamic cd ‘$PWD/$1’ && $CHEMIN/pek-file.sh &” }"
echo “}”
;;
*.mov | *.avi | *.wma | *.mpg | *.mkv | *.flv | *.wmv | *.mp4 | *.AVI | *.ogm | *.ogg )
echo "Entry = \"$1\" { Icon = \"video.png\"; Actions = \"Exec mplayer '$PWD/$1' & \" }"
;;
*.odt | *.doc | *.xls | *.ods | *.ppt | *.opt )
echo "Entry = \"$1\" { Icon = \"document.png\"; Actions = \"Exec soffice '$PWD/$1' & \" }"
;;
*.abw )
echo "Entry = \"$1\" { Icon = \"document.png\"; Actions = \"Exec abiword '$PWD/$1' & \" }"
;;
*.gnumeric )
echo "Entry = \"$1\" { Icon = \"document.png\"; Actions = \"Exec gnumeric '$PWD/$1' & \" }"
;;
*.gba )
echo "Entry = \"$1\" { Actions = \"Exec gvba '$PWD/$1' & \" }"
;;
*.png | *.jpg | *.JPG | *.jpeg | *.gif | *.bmp | *.tiff )
echo "Submenu = \"$1\" {"
echo "Entry = \"Ouvrir avec gimp\" {Actions = \"Exec gimp '$PWD/$1' & \" }"
echo "Entry = \"Ouvrir avec feh\" {Actions = \"Exec feh -x '$PWD/$1' & \" }"
echo "Entry = \"Diaporama ici\" {Actions = \"Exec feh -x -r '$PWD' & \" }"
echo "Entry = \"Définir comme fond d'écran\" {Actions = \"Exec feh --bg-scale '$PWD/$1' & \" }"
echo "}"
;;
*.gp4 | *.gp3 | *.gtp )
echo "Entry = \"$1\" { Icon = \"musique.png\"; Actions = \"Exec tuxguitar '$PWD/$1' & \" }"
;;
*.txt | *.py | *.c | *.h | *.sh )
echo "Entry = \"$1\" { Icon = \"mousepad.png\"; Actions = \"Exec geany '$PWD/$1' & \" }"
;;
*.ogg | *.mp3 | *.flac | *.wma | *.wav )
echo "Entry = \"$1\" { Icon = \"musique.png\"; Actions = \"Exec smplayer -add-to-playlist '$PWD/$1' & \" }"
;;
*.pdf )
echo "Entry = \"$1\" { Icon = \"document.png\"; Actions = \"Exec evince '$PWD/$1' & \" }"
;;
esac
}
#on commence le menu
echo "Dynamic {“
v=$IFS
IFS=’
'
NB=liste_ | wc -l
i=1
while [ $i -le $NB ]
do
ELEMENT=”$(liste_ | sed -n ${i}p)"
action_ $ELEMENT
i=$(expr $i + 1)
done
echo "Separator {}"
echo "Entry = “Ouvrir dans $FILEMGR” { Actions = "Exec $FILEMGR ‘$PWD’/ & " }"
echo "Entry = “Terminal ici” { Actions = "Exec cd ‘$PWD’ && $TERM & " }"
echo "Entry = “Rechercher ici” { Actions = "Exec catfish ‘$PWD’/ & " }"
echo "}"
IFS=v
exit 0;
Voila, à vos claviers!
ps : comme le dit kna, c’est sous licence WTFPL
edit : les soucis d’espaces sont résolus. Tous les scripts sont mis à jour pour fonctionner avec sh, donc partout.