web-dev-qa-db-ja.com

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フィールドを抽出して変数をbashし、構成ファイルに書き込むための最良の方法がまだありません。また、構成ファイルからbash変数に読み取るコードがありません。

Zenityの例へのリンクまたは完全な答えがさらに良いと思います。ありがとうございました。

PS上記のスクリプトを実行すると、完了時にエラーが報告されます。

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

私はこれに少し混乱しており、あなたが私が間違っていることを指摘できるなら、それも高く評価されるでしょう。

4

Zenityは、入力フィールドが1つしかない場合にのみ前の値を表示できます。そのため、以下のコードは以前の値をラベルフィールドに入力し、ユーザーに新しい値を入力フィールドに入力するか、空白のままにして既存の値を保持するように指示します。

バッシュコード

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

数時間のグーグル検索の後、このコードの例が見つかりませんでした。同じコードを探している他の人がこのコードを見つけられることを願っています。

スクリーン

adaptive brightness 3

この回答では、zenityフォームの順序が異なり、フィールドのラベルが拡張されています。 4882はこのintel_backlightドライバーの最大値ですが、これは太陽を見つめるようなもので、1000は屋内での実用的な最大値です。

mur に感謝します。元のコードをフィールド名を使用する古いスタイルのCOBOL形式から、配列を使用する最新のBash形式に変換するガイダンスを提供してくれました。


yadの代わりにzenityを使用する

2018年にプロジェクトを改良し、名前を Eyesome に変更しました。現在、yadのスーパーチャージされた分岐バージョンであるzenityを使用しています。 yadは、bashで同じコーディングスタイルを使用し、機能を追加します。

複数のタブに対するノートブックのサポート

yadを使用すると、現在のフィールド値を表示し、タブ付きノートブック形式でフォームを作成できます。

eyesome-edit-configuration-general.png

この答えを書いている間、画面が古く、5 to 20 secondsと表示されていることに気付きました。次の出版物のために1 to 20 secondsと言うように変更しました。

タブリストからのモニター3

以下は、タブリストからのモニター3の外観です。

eyesome-edit-configuration-monitor-3.png

この画面を生成するためのサンプルコードは、次のセクションにリストされています。

サンプルコード

3つのモニターは、コードの大部分を構築する共通の機能を共有します。モニター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ページにアクセスして、すべてのbashコードをここからダウンロードします。

3

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
Julio N