Используя Zenity для поддержания конфигурационного файла

Я должен установить конфигурационный файл в Bash и полагать, что Zenity является лучшим методом, но имеет проблемы при нахождении использования ссылки Google с подходящим примером.

До сих пор мой код похож на это:

#!/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

и получающийся экран похож на это:

Adaptive Brightness Config

Если значения не могут быть предписаны к переменным Zenity затем, я мог бы поместить текущее значение в полевую маркировку т.е.:

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

И пользователь может покинуть поле пробел, чтобы остаться тем же или ввести новое значение.

Я все еще пропускаю лучший способ извлечь поля Zenity, чтобы колотить переменные и писать им в конфигурационный файл. Также я пропускаю код для чтения из конфигурационного файла для избиения переменных.

Я ценил бы ссылку на пример Zenity, или полный ответ будет еще лучше.Спасибо.

О PS, Когда я запускаю вышеупомянутый скрипт ошибка, сообщают, когда это завершается:

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

Я немного смущен этим и если можно указать на то, что я делаю неправильно, который ценился бы также.

4
задан 27 February 2017 в 03:17

2 ответа

Zenity может только отобразить предыдущее значение, когда существует только одно поле записи. Как таковой код ниже помещает предыдущие значения в поля маркировки и дает пользователю команду вводить новое значение в поля записи или оставлять его незаполненный для хранения существующего значения.

Код 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

Я был удивлен после того, как часы поиска с помощью Google, примеры этого кода не могли быть найдены. Надо надеяться, другие, гуглящие ту же проблему, могут найти этот код.

Экран

adaptive brightness 3

В этом ответе zenity форма имеет другой порядок и расширенные маркировки для полей. Хотя 4882 максимально для этого intel_backlight драйвер это похоже пристально на солнце и 1000, является практическим максимумом в закрытом помещении.

Большое спасибо muru для руководства, преобразовывающего исходный код из формата КОБОЛа старого стиля с помощью имен полей, к современным массивам использования формата Bash.


Используя yad вместо zenity

В 2018 я обновил проект и переименовал его к Привлекательному. Теперь это использует yad который является перегруженной разветвленной версией zenity. yad использует тот же стиль кодирования в ударе и добавляет больше функциональности.

Поддержка ноутбука нескольких вкладок

Используя yad можно отобразиться, текущие значения полей плюс создают формы в формате ноутбука с вкладками:

eyesome-edit-configuration-general.png

При записи этого ответа я заметил, что экран устарел и говорит 5 to 20 seconds. Я изменил его для высказывания 1 to 20 seconds для следующей публикации.

Контролируйте 3 из списка вкладки

Вот то, на что Монитор 3 похож из списка вкладки:

eyesome-edit-configuration-monitor-3.png

Пример кода для генерации этого экрана перечислен в следующем разделе.

Пример кода

Три монитора совместно используют общую функцию для создания объема кода. Для Монитора 3 мы используем:

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

BuildMonitorPage функция делает тяжелый подъем все же. Вот то, на что это похоже:

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 сохранит числа внутренне к 6 десятичным разрядам по умолчанию. Во время презентации пользователю можно переопределить количество используемых десятичных разрядов. В коде выше Вас см.:

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

Последняя строка содержит текущее значение от массива конфигурации (CfgArr) сопровождаемый:

  • 0.1 минимальное позволенное значение
  • 9999 максимальное позволенное значение
  • .01 ступите значение, если пользователь нажимает стрелку вверх или стрелку вниз для изменения
  • 2 количество десятичных разрядов отображено на экране

Чтобы видеть все экраны и прочитать обзор, посмотрите, что это Спрашивает Ответ Ubuntu:

Посетите eyesome страница GitHub и загрузка весь код удара здесь:

3
ответ дан 1 December 2019 в 09:45

yad делает намного легче то же

$ 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
ответ дан 1 December 2019 в 09:45

Другие вопросы по тегам:

Похожие вопросы: