Pages : 1
#1 Le 02/01/2011, à 20:33
- Totor
Barre de progression avec Zenity
Bonsoir (et meilleurs voeux à tou[te]s),
Zenity offre une barre de progression mais elle se présente sous forme de "popup". En conséquence, la progression peut être masquée par d'autres fenêtres.
J'ai donc regardé du côté de la fonctionnalité "notification" de zenity pour avoir une icone dynamique.
Il n'y a rien d'indiqué dans la documentation de zenity et après lecture du code source, j'ai pu constaté des options le permettant.
Reste à générer l'icone de progression dynamiquement.
Voici donc un petit script qui :
- génère un fichier png avec une barre de progression
- fourni à zenity le nom de l'icon à afficher et le texte du label
Le fichier png est décomposé de 2 parties :
- la barre de progression
- une zone de texte (limitée - Le label de l'icone permettant un complément d'info)
Par défaut, la zone de texte et le label correspondent à "<pct> %" mais il est tout à fait possible de mettre autre chose.
Exemple : Dans le cadre d'un script d'encodage de plusieurs fichiers
- la zone de texte peut comporter l'information "quel est le pourcentage d'encodage du fichier en cours de traitement"
- la barre de progression donne l'information "quel est le pourcentage d'encodage total".
- et pour le label, l'information "Nom du fichier en cours d'encodage"
Le script :
#!/bin/bash
imgXSize=160
imgYSize=100
font="${HOME}/.fonts/NEUROPOL.ttf"
resultat=.$$_icon.png
gesHelp()
{
[ $# -ne 0 ] && echo -e "$@"
myName=${0##*/}
cat <<EOF
Usage : ${myName} [ -h | [-W <value>] [-H <value>] [ -f <name> ] ]
Options:
-h : print this help
-W : Width of the icon
-H : Height of the icon
-f : font name or file's font name
EOF
[ $# -ne 0 ] && return 1
return 0
}
gesHelpFunction()
{
[ $# -ne 0 ] && echo -e "$@"
cat <<EOF
Usage : makeIcon [-t <value>] [-p <value>] [ -l <notification label> ]
Options:
-t : texte into icon
default value = "pct %"
-p : percent of progress (integer)
default value=0
-l : label of the notification
EOF
[ $# -ne 0 ] && return 1
return 0
}
makeIcon()
{
unset pct texte label
OPTIND=0
while getopts :t:p:l: option
do
case "${option}" in
:) gesHelpFunction "Invalid value for option '${OPTARG}'"
return 1;;
"?") gesHelpFunction "Unknown option : ${OPTARG}."
return 1;;
t) texte="${OPTARG}";;
l) label="${OPTARG}";;
p) pct="${OPTARG}";
[ "${pct//[0-9]}" ] &&{ gesHelpFunction "Invalid value for option 'p'"; return 1; }
((pct < 0 || pct >100 )) && { gesHelpFunction "Invalid value for option 'p'"; return 1; }
;;
esac
done
[ ! "${pct}" ] && pct=0
[ ! "${texte}" ] && texte="${pct} %"
[ ! "${label}" ] && label="${pct} %"
max=$((fillXmin+2*fillwc+(pct*barlength)/100))
convert -size ${imgXSize}x${imgYSize} \( xc:none -stroke ${borderColor} \
-tile gradient:${cylindreEmptyColor} \
-draw "roundrectangle ${progressXmin},${progressYmin},${progressXmax},${progressYmax} ${wc},${hc}" \
-stroke none \
-tile gradient:${cylindreFullColor} \
-draw "roundrectangle ${fillXmin},${fillYmin},${max},${fillYmax} ${fillwc},${fillhc}" \
-tile gradient:${cylindreFullColor2} \
-draw "roundrectangle $((max-2*fillwc)),${fillYmin},${max},${fillYmax} ${fillwc},${fillhc}" \
\) \
\( xc:none -stroke none \
-tile gradient:${cylindreFullColor} \
-draw "roundrectangle ${fillXmin},${fillYmin},${max},${fillYmax} ${fillwc},${fillhc}" \
-tile gradient:${cylindreOutColor} \
-draw "roundrectangle $((max-2*fillwc)),${fillYmin},${max},${fillYmax} ${fillwc},${fillhc}" \
\( xc:none \
-stroke ${borderColor} \
-tile gradient:${cylindreEmptyColor} \
-draw "roundrectangle $((progressXmax-2*wc)),${progressYmin},${progressXmax},${progressYmax} ${wc},${hc}" \
-tile gradient:${cylindreInsideColor} \
-draw "roundrectangle $((fillXmax-2*fillwc)),${fillYmin},${fillXmax},${fillYmax} ${fillwc},${fillhc}" \) \
-compose DstAtop -composite \) \
-compose over -composite \
-fill none -stroke ${borderColor} -draw "roundrectangle ${progressXmin},${progressYmin},${progressXmax},${progressYmax} ${wc},${hc}" \
\( xc:none -fill none -stroke ${borderColor} \
-draw "roundrectangle $((fillXmax-2*fillwc)),${fillYmin},${fillXmax},${fillYmax} ${fillwc},${fillhc}" \
-draw "roundrectangle $((progressXmax-2*wc)),${progressYmin},${progressXmax},${progressYmax} ${wc},${hc}" \
\) \
-background none -layers merge \
\( -font "${font}" \
-stroke ${fontShadow} -fill red label:"${texte}" -trim +repage \
\( +clone -background ${fontShadow} -shadow 80x3+3+3 \
\) +swap -background none -layers merge \) \
-insert 0 -gravity center -append \
-background none -gravity center -extent ${imgXSize}x${imgYSizeOrigin} \
"${resultat}"
printf "icon:%s\ntooltip:%s\n" "${resultat}" "${label}"
}
OPTIND=0
while getopts :hH:W:f: option
do
case "${option}" in
h) gesHelp
exit 0;;
:) gesHelp "Invalid value for option '${OPTARG}'"
exit 1;;
"?") gesHelp "Unknown option : ${OPTARG}."
exit 1;;
H) imgYSize=${OPTARG};;
W) imgXSize=${OPTARG};;
f) font="${OPTARG}";;
esac
done
borderColor=silver
cylindreEmptyColor=AliceBlue-DimGray
cylindreInsideColor=AliceBlue-darkgray
cylindreFullColor=green3-DarkGreen
cylindreFullColor2=green2-DarkGreen
cylindreOutColor=lime-Green4
texteColor=red
progressYmax=$(((imgYSize*95)/100))
progressYmin=$(((imgYSize*55)/100))
progressXmin=$(((imgXSize*5)/100))
progressXmax=$((imgXSize-progressXmin))
wc=$(((progressYmax-progressYmin)/4))
hc=$(((progressYmax-progressYmin)/2))
fontShadow=firebrick3
imgYSizeOrigin=${imgYSize}
epaisseur=$(((imgYSize*5)/100))
((progressYmin=epaisseur/2))
imgYSize=$((imgYSize*45/100))
((progressYmax=imgYSize-progressYmin))
fillYmin=$((progressYmin+epaisseur))
fillYmax=$((progressYmax-epaisseur))
fillwc=$(((fillYmax-fillYmin)/4))
fillhc=$(((fillYmax-fillYmin)/2))
fillXmin=$((progressXmin+epaisseur))
fillXmax=$((progressXmax-wc+fillwc))
barlength=$((fillXmax-2*fillwc-fillXmin))
Exemple d'utilisation :
#!/bin/bash
# chargement du script en précisant la taille de l'icon et la font à utiliser
# par défaut, la taille est de 120x100
# note : plus la taille est grande et plus la durée de création de l'icon est longue
. ~/bin/makeIcon.sh -W 120 -H 100 -f ~/.fonts/DS-DIGI.TTF
{
for((x=0;x<=100;x+=5))
do
makeIcon -p ${x} -l "Traitement à ${x} %" -t "${x}/100"
sleep 0.5
done
read -n1
rm -f "${resultat}"
} | zenity --notification --listen
La font utilisée est disponible ici
Au passage, le nom de l'icone est indiquée dans la variable "resultat" et n'est volontairement pas supprimée
enjoy....
PS : La génération du png s'effectue grace à imagemagick. A ce propos, je remercie Anthony pour son aide...
Dernière modification par Totor (Le 17/01/2011, à 15:02)
-- Lucid Lynx --
Hors ligne
#2 Le 30/01/2011, à 12:04
- Zakhar
Re : Barre de progression avec Zenity
Superbe ça !
Et merci d'avoir lu le code de Zenity car la documentation manque cruellement de détails.
Je me demandais comment on pouvait faire en sorte de changer l'icone très moche qui s'affiche lorsqu'on fait une notification...
Et donc tu donnes la réponse, on fait
zenity --notification --listen
--listen n'est même pas mentionné dans la documentation en ligne !
Il est juste mentionné dans le man, et si on fait :
$ zenity --help-notification
Utilisation :
zenity [OPTION...]
Options de l'icône de notification
--notification Affiche une notification
--text=TEXTE Définit le texte de notification
--listen Écoute les commandes issues de stdin
Seulement, on lit bien "ecoute les commandes issues de stdin", mais lesdites commandes ne sont pas décrites !..
Donc de ta découverte du code, on pourrait rajouter :
Commandes :
icon:path_of_the_icon # Chemin de l'icône à afficher
tooltip:text_of_tooltip # Texte de l'infobulle
Merci, je vais faire mumuse avec ça !
D'autres "commandes" intéressantes ?
P.S.: question subsidiaire... que devient Zenity avec la 10.10 puisque exit Gnome ?...
Dernière modification par Zakhar (Le 30/01/2011, à 12:04)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#3 Le 14/03/2011, à 13:56
- Totor
Re : Barre de progression avec Zenity
Salut,
Désolé, je n'avais pas vu ta demande. Oui, il y a d'autres options.
- message (pour afficher via libnotify)
- visible
-- Lucid Lynx --
Hors ligne