====== Switch On/Off dans le systray ======
\\
Mise à jour le : 15/05/2023
* Une icône dans le systray
* Un clic gauche bascule l'état de l'icône
* Un clic droit montre un menu : Switcher ou Quitter
* Un fichier contenant l'état actuel de l'icône (selon la version)
* Possibilité de coder les actions (on et off) dans le script (ou d'utiliser le fichier d'état pour gérer les actions selon la version)
* La version avec fichier d'état permet le pilotage du script par ce fichier en y écrivant ON ou OFF.
* Scripts à adapter (variables et/ou code pour les actions On et Off).
\\ Débutant s'abstenir\\
\\ Nécessite //yad// :\\ \\ apt install yad
La version avec fichier d'état nécessite //inotifywait// :apt install intofy-tools
===== Les scripts (2 versions) =====
Ils s'appuient sur le mode notification de //yad//.\\
Dans le chapitre "Images icônes", vous trouverez des fichiers images pour les icônes ON et OFF.
\\
== Version avec fichier d'état. ==
//(Possibilité de mettre les instructions dans le script ou de faire un script extérieur qui viendra lire le fichier d'état)//\\
#!/bin/bash
### Variables Customisables.
Icon_Off="/chemin/de/l'image/ON" # À adapter.
Icon_On="/chemin/de/l'image/OFF" # " "
Switch="$HOME/systray_switch_state" # " " Fichier d'état (contient soit ON soit OFF).
### Fonctions.
_quit ()
{
local s="inotifywait -qme close_write ${Switch//\//\\\\/}"
kill -15 "$(ps -ef | awk -vs="$s" '$0 ~ s && !/awk/{print $2}')"
}
_switch ()
{
local etat
etat=$(<"$Switch")
if [ "$etat" = "ON" ]
echo "OFF" >"$Switch"
#
# Code ICI pour les actions OFF (optionnel)
#
else
echo "ON" >"$Switch"
#
# Code ICI pour les actions ON (optionnel)
#
fi
}
_icon_set ()
{
local etat icon
while read -r
do
etat=$(<"$Switch")
[ "$etat" = "ON" ] && icon="$Icon_On" || icon="$Icon_Off"
echo "icon:$icon"
done < <(echo; inotifywait -qme close_write "$Switch")
}
### Export (Variable et Fonctions).
export Switch
export -f _quit _switch
exec 2>/dev/null # Pour éviter le message `Complété` à la fermeture de yad par la fonction `_quit`.
### Notification YAD (icône systray).
# text = affiché au survol de la souris
# menu = affichage+action(si clic) du menu sur clic droit de la souris
# command = switch direct sur clic gauche de la souris
yad --notification \
--text "Texte de la bulle au survol de la souris" \
--icon-size 64 \
--no-middle \
--menu "Switcher!bash -c '_switch'|Quitter!bash -c '_quit'" \
--command "bash -c '_switch'" \
--listen < <(_icon_set)
== Version sans fichier d'état ==
//(oblige de mettre les instructions On/Off dans ce script).//\\
#!/bin/bash
### Variables Customisables.
Icon_Off="/chemin/de/l'image/ON" # À adapter.
Icon_On="/chemin/de/l'image/OFF" # " "
### Créations des canaux de communication
mkfifo fifo fifo2
exec 8<>fifo 4>fifo 5&-
exec 9<>fifo2 6>fifo2 7&-
rm fifo fifo2
fd4="/proc/$$/fd/4"
fd5="/proc/$$/fd/5"
fd6="/proc/$$/fd/6"
### Initialisation de l'état de l'icône.
# Partie à adapter selon les actions pour ON et OFF.
# Mais quel que soit l'état de départ, il faut envoyer les bonnes informations aux bons canaux.
echo "OFF" >&4
echo "icon:$Icon_Off" >&6
### Fonctions.
_quit ()
{
exec 6>"$1"
echo "EOF" >&6
}
_switch ()
{
local etat
exec 4>"$1" 5<"$2" 6>"$3"
read -r etat <&5
if [ "$etat" = "ON" ]
then
echo "OFF" >&4
echo "icon:$Icon_Off" >&6
#
# Code ICI pour les actions OFF
#
else
echo "ON" >&4
echo "icon:$Icon_On" >&6
#
# Code ICI pour les actions ON
#
fi
}
### Export des Fonctions et Variables.
export -f _quit _switch
export Icon_On Icon_Off
### Notification YAD (icône systray).
yad --notification \
--text "Texte au survol de la souris." \
--icon-size 64 \
--no-middle \
--menu "Switcher!bash -c '_switch $fd4 $fd5 $fd6'|Quitter!bash -c '_quit $fd6'" \
--command "bash -c '_switch $fd4 $fd5 $fd6'" \
--listen < <(while read -r <&7; do [ "$REPLY" = "EOF" ] && break; echo "$REPLY"; done)
===== Images icônes =====
{{https://debian-facile.org/images/file-R477709fd6aaa5940ba2be7b06e643632|Icône ON}}\\
{{https://debian-facile.org/images/file-R9815d946627cdf57a09164453a56c84e|Icône OFF}}
===== Utilisation =====
Bah, il ne reste plus qu'à le lancer en début de session ^_^\\
Après adaptation évidemment ... :-P