web-dev-qa-db-fra.com

Utiliser Zenity pour gérer le fichier de configuration

Je dois installer un fichier de configuration dans Bash et croire que Zenity est la meilleure méthode, mais je ne parviens pas à trouver un lien à l'aide de Google avec un exemple approprié.

Jusqu'à présent, mon code ressemble à ceci:

#!/bin/bash

zenity --forms --title="Laptop Adaptive Brightness" --text="Set Configuration" \
   --add-entry="/sys/class/backlight/??????/brightness" \
   --add-entry="Night time (min) value" \
   --add-entry="Day time (max) value" \
   --add-entry="Minutes after sunrise to max" \
   --add-entry="Minutes before sunset to min"

exit

et l'écran qui en résulte ressemble à ceci:

Adaptive Brightness Config

Si les valeurs ne peuvent pas être prédéfinies aux variables Zenity, je pourrais alors mettre la valeur actuelle dans l'étiquette du champ, par exemple:

   --add-entry="Night time (min) value (Current: $min)", \

Et l'utilisateur peut laisser le champ vide pour rester le même ou entrer une nouvelle valeur.

Il me manque encore le meilleur moyen d'extraire les champs Zenity en bash des variables et de les écrire dans le fichier de configuration. De plus, il me manque le code pour lire le fichier de configuration dans les variables bash.

J'apprécierais un lien vers un exemple de Zenity ou une réponse complète serait encore mieux. Je vous remercie.

PS Lorsque j'exécute le script ci-dessus, une erreur est signalée à la fin:

$ adaptive-brightness-configGtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
||||

Cela me laisse un peu perplexe et si vous pouviez indiquer ce que je faisais mal, nous l'apprécierions également.

4
WinEunuuchs2Unix

Zenity ne peut afficher la valeur précédente que s'il existe un seul champ de saisie. En tant que tel, le code ci-dessous place les valeurs précédentes dans les champs d'étiquette et demande à l'utilisateur de saisir une nouvelle valeur dans les champs d'entrée ou de le laisser vide pour conserver la valeur existante.

Le code Bash

#!/bin/bash

# Read configuration file with entries separated by " " into array
IFS=' ' read -ra CfgArr < ~/bin/adaptive-brightness-configuration-file

# Zenity form with current values in entry label
# because initializing multiple entry data fields not supported
output=$(zenity --forms --title="Laptop Adaptive Brightness Configuration" \
        --text="Enter new settings or leave entries blank to keep (existing) settings" \
   --add-entry="/sys/class/backlight/??????/brightness driver : (${CfgArr[0]})" \
   --add-entry="Day time maximum display brightness : (${CfgArr[1]})" \
   --add-entry="Transition minutes after sunrise to maximum : (${CfgArr[2]})" \
   --add-entry="Night time minimum display brightness : (${CfgArr[3]})" \
   --add-entry="Transition minutes before sunset to minimum : (${CfgArr[4]})")

IFS='|' read -a ZenArr <<<$output # Split zenity entries separated by "|" into array elements

# Update non-blank zenity array entries into configuration array
for i in ${!ZenArr[@]}; do
    if [[ ${ZenArr[i]} != "" ]]; then CfgArr[i]=${ZenArr[i]} ; fi
done

# write configuration file using array (fields automatically separated by " ")
echo "${CfgArr[@]}" > ~/bin/adaptive-brightness-configuration-file

J'ai été surpris après des heures de recherches sur Google, des exemples de ce code n'ont pas pu être trouvés. Espérons que d'autres personnes googler le même problème peuvent trouver ce code.

L'écran

adaptive brightness 3

Dans cette réponse, la forme zenity a un ordre différent et des étiquettes développées pour les champs. Bien que 4882 soit maximal pour ce pilote intel_backlight c'est comme regarder dans le soleil et 1000 est le maximum pratique à l'intérieur.

Merci beaucoup à mur pour avoir guidé la conversion du code original au format COBOL de style ancien à l'aide de noms de champs, au format Bash moderne à l'aide de tableaux.


Utiliser yad au lieu de zenity

En 2018, j'ai réorganisé le projet et l'ai renommé en Eyesome . Maintenant, il utilise yad qui est une version fourchue super chargée de zenity. yad utilise le même style de codage que bash et ajoute plus de fonctionnalités.

Prise en charge du portable pour plusieurs onglets

En utilisant yad, vous pouvez afficher les valeurs des champs actuels et créer des formulaires au format cahier à onglets:

eyesome-edit-configuration-general.png

En écrivant cette réponse, j’ai remarqué que l’écran était périmé et indiquait 5 to 20 seconds. Je l'ai changé pour dire 1 to 20 seconds pour la prochaine publication.

Moniteur 3 de la liste des onglets

Voici à quoi ressemble Monitor 3 dans la liste des onglets:

eyesome-edit-configuration-monitor-3.png

Un exemple de code permettant de générer cet écran est présenté dans la section suivante.

Exemple de code

Les trois moniteurs partagent une fonction commune pour construire la majeure partie du code. Pour Monitor 3, nous utilisons:

# Monitor 3 notebook page
BuildMonitorPage "$CFG_MON3_NDX"
yad --plug=$KEY --tabnum=4 --form \
    "${aMonPage[@]}" > "$res4" &

La fonction BuildMonitorPage fait le gros du travail. Voici à quoi cela ressemble:

BuildMonitorPage () {
    # Move configuration array monitor 1-3 to Working Screen fields
    # $1 = CfgArr Starting Index Number

    aMonPage=()
    i="$1"
    aMonPage+=("--field=Monitor Number::RO")
    aMonPage+=("${CfgArr[$((i++))]}")

    aMonPage+=("--field=Monitor Status::CB")
    Status=("${CfgArr[$((i++))]}")
    cbStatus="Enabled!Disabled"
    cbStatus="${cbStatus/$Status/\^$Status}"
    aMonPage+=("$cbStatus")

    aMonPage+=("--field=Monitor Type::CB")
    Type=("${CfgArr[$((i++))]}")
    cbType="Hardware!Software"
    cbType="${cbType/$Type/\^$Type}"
    aMonPage+=("$cbType")

    aMonPage+=("--field=Monitor Name:")
    aMonPage+=("${CfgArr[$((i++))]}")
    aMonPage+=("--field=Internal Name:")
    aMonPage+=("${CfgArr[$((i++))]}")
    aMonPage+=("--field=Xrandr Name:")
    aMonPage+=("${CfgArr[$((i++))]}")
    aMonPage+=("--field=Daytime Brightness::NUM")
    aMonPage+=("${CfgArr[$((i++))]}"!0.1..9999!.01!2)
    aMonPage+=("--field=Daytime Red::NUM")
    aMonPage+=("${CfgArr[$((i++))]}"!0.1..2.0!.01!2)
    aMonPage+=("--field=Daytime Green::NUM")
    aMonPage+=("${CfgArr[$((i++))]}"!0.1..2.0!.01!2)
    aMonPage+=("--field=Daytime Blue::NUM")
    aMonPage+=("${CfgArr[$((i++))]}"!0.1..2.0!.01!2)
    aMonPage+=("--field=Nighttime Brightness::NUM")
    aMonPage+=("${CfgArr[$((i++))]}"!0.1..9999!.01!2)
    aMonPage+=("--field=Nighttime Red::NUM")
    aMonPage+=("${CfgArr[$((i++))]}"!0.1..2.0!.01!2)
    aMonPage+=("--field=Nighttime Green::NUM")
    aMonPage+=("${CfgArr[$((i++))]}"!0.1..2.0!.01!2)
    aMonPage+=("--field=Nighttime Blue::NUM")
    aMonPage+=("${CfgArr[$((i++))]}"!0.1..2.0!.01!2)
    aMonPage+=("--field=Current Brightness::RO")
    aMonPage+=("${CfgArr[$((i++))]}")
    aMonPage+=("--field=Current Gamma::RO")
    aMonPage+=("${CfgArr[$((i++))]}")

} # BuildMonitorPage

Yad stockera les numéros en interne avec 6 décimales par défaut. Pendant la présentation à l'utilisateur, vous pouvez remplacer le nombre de décimales utilisées. Dans le code ci-dessus, vous voyez:

    aMonPage+=("--field=Nighttime Brightness::NUM")
    aMonPage+=("${CfgArr[$((i++))]}"!0.1..9999!.01!2)

La dernière ligne contient la valeur actuelle du tableau de configuration (CfgArr) suivie de:

  • 0.1 valeur minimale autorisée
  • 9999 valeur maximale autorisée
  • .01 valeur de pas si l'utilisateur appuie sur la flèche vers le haut ou vers le bas pour changer
  • 2 nombre de décimales affichées à l'écran

Pour voir tous les écrans et lire un aperçu voir ceci Ask Ubuntu Réponse:

Visitez la page eyesome github et téléchargez tout le code bash ici:

3
WinEunuuchs2Unix

yad fait la même chose beaucoup plus facilement

$ yad --form                                                  \
   --field "/sys/class/backlight/??????/brightness driver" 10 \
   --field "Day time maximum display brightness" 20           \
   --field "Transition minutes after sunrise to maximum" 30   # And so go on

enter image description here

1
Julio N