GetDeb.net も PlayDeb.net も死んでるようです。。。
roadtoalinuxmintuser

theming

roundup
Linux Mint 18.3 : Conky の Lua スクリプトの書き方 Part3 01:02
アイキャッチ

描画に必要な計算と if 文


インジケーターバーを表示できたので、自分の命名規則に従ってそれぞれの変数の前に「bar_」を付け加えて、変数をすべて上部に移動させました:
--SETTINGS FOR CPU INDICATOR BAR
bar_bottom_left_x= 50
bar_bottom_left_y= 200
bar_width= 30
bar_height= 100
bar_value=tonumber(conky_parse("${cpu}"))
bar_max_value=100
--set bar background colors, 1,0,0,1 = fully opaque red
bar_bg_red=1
bar_bg_green=0
bar_bg_blue=0
bar_bg_alpha=1
--set indicator colors, 1,1,1,1 = fully opaque white
bar_in_red=1
bar_in_green=1
bar_in_blue=1
bar_in_alpha=1
--END OF SETTINGS

--DRAW BAR INDICATOR
--draw background
cairo_set_source_rgba (cr,bar_bg_red,bar_bg_green,bar_bg_blue,bar_bg_alpha)
cairo_rectangle (cr,bar_bottom_left_x,bar_bottom_left_y,bar_width,-bar_height)
cairo_fill (cr)
--draw indicator
cairo_set_source_rgba (cr,bar_in_red,bar_in_green,bar_in_blue,bar_in_alpha)--set indicator color
scale=bar_height/bar_max_value
indicator_height=scale*bar_value
cairo_rectangle (cr,bar_bottom_left_x,bar_bottom_left_y,bar_width,-indicator_height)
cairo_fill (cr)

範囲を選択_035
しかし、もう少し機能を盛り込んだり飾り付けしたりしたいです:
  • インジケーターの周りのボーダーを描画する機能がほしいです。
    • ボーダーは任意にします。
    • ボーダーの色や太さをセットする機能がほしいです。
  • バーに「警告値」をセットしたいです。
    • バーがある値にまで達したら違う色で表示するようにしたいです。

ボーダーを追加します。まずは設定を変数に格納します:
bar_border=1 --set 1 for border or 0 for no border
--set border color rgba
border_red=0
border_green=1
border_blue=1
border_alpha=1
--set border thickness
border_width=10

今回はボーダーの表示/非表示の切り替えに数字を選んでいます。1 = yes, 0 = no という意味で使っていますが、もちろん bar_border="yes" のように文字を使っても構いません。欠点は Yes と yes を比較する際、違うものと認識されることです。これは組み込みの string.upper() や string.lower() 関数で解決することが出来ますが、別の話なので今回はこの辺にして、1 または 0 を指標として使います。

ボーダーはインジケーターにちょうど重なってはいけません。これを実現する方法は思いつくだけでいくつか有ります。インジケーターの背景の矩形に塗りつぶした矩形を描画できます。そうなるとボーダーの矩形はインジケーターの矩形よりも大きくする必要があるでしょう。インジケーターの周囲に背景の矩形がはみ出る感じです。別の方法としては cairo_stroke で矩形を描画することで単に周りのボーダーだけを描くのもありです。四本の直線をそれぞれ描くこともできるでしょう。

これらの方法にはそれぞれ利点と欠点が有りますが cairo_stroke で四角形を描くことにします。四角形を描くとき line_width の適応のされ方が少しトリッキーです。これら 3 つのすべての四角形の幅は 60、高さは 40 にセットされています。見てわかる違いは線の太さがそれぞれ 1, 10, 20 であることです。

bar_bottom_left_x や bar_bottom_left_y とは相対的にボーダーの x と y 座標をセットする必要が有ります。これはバーの位置を変えたい時に単純に bar_bottom_left_x と bar_bottom_left_y の値を変更すればいいだけにしたり、他の変数もこの値に関連して自動で変更したりするすようにしたいからです:
border_bottom_left_x=bar_bottom_left_x-(border_width/2)--we subtract because we are going to the left
border_bottom_left_y=bar_bottom_left_y+(border_width/2)--we add because we are going down

これはボーダーとなる矩形をより左下からスタートし、インジケーターとなる矩形よりも広く大きくしなくてはいけません:
brec_width=bar_width+border_width
brec_height=bar_height+border_width

上記のコードを書いている時に、インジケーターの矩形の変数名に bar_width と bar_height というように width と height を使っているため、ボーダーとなる矩形も border_width と border_height という風に名づけようとしました。しかし、ボーダーの line_width の値を格納する変数名にすでに使っているので border_width が使えません。何か別の変数名を思いつく必要が有ります(ここでは brec_)。

ボーダーを描くための変数の準備が整ったので、これらの変数を矩形を描画する関数に渡して実行してみます:
cairo_set_source_rgba (cr,border_red,border_green,border_blue,border_alpha)
cairo_set_line_width (cr,border_width)
border_bottom_left_x=bar_bottom_left_x-(border_width/2)
border_bottom_left_y=bar_bottom_left_y+(border_width/2)
brec_width=bar_width+border_width
brec_height=bar_height+border_width--remember that we need to make the value of brec_height negative at some point because we are drawing up
cairo_rectangle (cr,border_bottom_left_x,border_bottom_left_y,brec_width,-brec_height)--we will set brec_height negative in this line
cairo_stroke (cr)

範囲を選択_033
計算は正しく行っているので、ボーダーがインジケーターに干渉することはないはずです。なのでこのコードは背景を描画する前、背景を描画した後、インジケーターを描画する前、インジケーターを描画した後におけます。

これでボーダーを描くことは出来ましたが、ボーダーを描くか描かないかを指定するための変数 bar_border はまだ使っていません。if 文で実装します。

if 文


例えば:
if bar_border==1 then
--border drawing code
end

これは if 文のシンプルな構文です。bar_border に 1 を代入しておけば、ボーダーは描画されます。もっと正確に言えば、bar_border の値が 1 であれば、then から end までのコードが実行されます。0 が代入されると、then から end までのすべてのコードがスキップされ、ボーダーの描画は実行されません。

if 文には then と end は必要です。if 文の使いようによっては then が複数含まれることも有ります。また、何かと何かが等しいかどうかを比較するにはイコールを 2 回(==)続ける必要が有ります。その他の比較演算子としては:
  • A~=B AとBは等しくない
  • A<=B AはB以下
  • A<B AはBより小さい

より複雑な if 文は後ほど触れます。

警告色と複雑な if 文


インジケーターの任意の特徴の一つにボーダーを追加しました。今回はバーの色を変えていこうと思います。色を変化させるためには変数をさらに追加する必要が有ります。色で警告したい場合は、赤色が良いでしょう。バーの背景も再度色付けする必要があるでしょう。今回は red, green, blue, alpha などの変数名を短くしています:
--set alarm value, this is the value at which bar color will change
alarm_value=80
--set alarm bar color, 1,0,0,1 = red fully opaque
ar,ag,ab,aa=1,0,0,1

CPU 使用率が 80% を超えない限りベースとなる色で表示したいです。そこで、if 文をさらに追加して色が変化するようにします。取り組む方法はいくつか有りますが、まずは、自分たちがこれまで書いてきたインジケーターを描画するコードを思い出しましょう。色を変更するのはこの部分なので、ここを編集していきます:
cairo_set_source_rgba (cr,bar_in_red,bar_in_green,bar_in_blue,bar_in_alpha)--set indicator color
scale=bar_height/bar_max_value
indicator_height=scale*bar_value
cairo_rectangle (cr,bar_bottom_left_x,bar_bottom_left_y,bar_width,-indicator_height)
cairo_fill (cr)

if 文を色に適用するには次のことができます。bar_value は cpu 使用率が格納されている変数の名前で、alarm_value は 80 以上にセットしています:
if bar_value<alarm_value then
cairo_set_source_rgba (cr,bar_in_red,bar_in_green,bar_in_blue,bar_in_alpha)
else
cairo_set_source_rgba (cr,ar,ag,ab,aa)
end

ちゃんと動作していることを確認するにはどうしたら良いでしょうか。正しくコードを書いているつもりですが、実際に CPU 使用率が 80% に達さないとバーの色が白から赤には変化しません。CPU 使用率を無理やり 80% まであげることも出来ますが、変数の値を変えるほうがより簡単です。以下の行を:
bar_value=tonumber(conky_parse("${cpu}"))
このように変えます:
bar_value=80--tonumber(conky_parse("${cpu}"))

すでに書いたコードをテストするために変更するのはテストが終わった後で元に戻すが単純に大変なのであまり好きではありませんが、とりあえずテストが終わったら忘れずに元に戻すようにします。テスト用の値と -- を取れば元に戻ります。

実際、背景となる矩形も高さが可変する矩形も同じ赤色になってしまうので背景となる矩形の色は黒に変更しておきます:
    --set bar background colors, 1,0,0,1 = fully opaque red
bar_bg_red=0
bar_bg_green=0
bar_bg_blue=0
bar_bg_alpha=1

範囲を選択_037
さて、もう少し欲張って、別の色を追加したいと思います。例えば、CPU 使用率 50% までは緑色で表示するといった具合です。50〜80% までは黄色で表示し、最後に 80% に達すると赤色になるといった感じです。そこで、変数の設定に戻ります。すでに警告(80% 以上)するときの値と色はセット済です:
--set value for first color change, low cpu usage to mid cpu usage
mid_value=50
--set "low" cpu usage color and alpha, ie bar color below 50% - 0,1,0,1=fully opaque green
lr,lg,lb,la=0,1,0,1
--set "mid" cpu usage color, between 50 and 79 - 1,1,0,1=fully opaque yellow
mr,mg,mb,ma=1,1,0,1

ベースとなるバーの色の変数を再利用します。数字を変更して緑や黄色にセットします:
bar_in_red=1
bar_in_green=1
bar_in_blue=1
bar_in_alpha=1

色の表示の仕方に重要な変更を加えようとしているので、新しい値と警告値に置き換えます。私は私なりの命名規則に従っていますが、もちろん自由に変数名をつけてください。CPU の使用率が 0〜49% のときに緑色に、50〜79% のときに黄色にし、80% 以上であれば赤色にする if 文を書く方法について考える必要があります。実際に書いてみましょう:
if bar_value>=mid_value then --ie if value is greater or equal to 50
cairo_set_source_rgba (cr,mr,mg,mb,ma)--yellow (mid color)
elseif bar_value>=alarm_value then --ie if bar_value is greater or equal to 80
cairo_set_source_rgba (cr,ar,ag,ab,aa)--red (alarm color)
else
cairo_set_source_rgba (cr,lr,lg,lb,la)--green (low color)
end

必要な条件分岐は 3 だけです。bar_value の値を 49 などにし、このコードを試してみましょう。バーが緑色に表示されるはずです。bar_value=50 にすればバーが黄色になるはずです。しかし、bar_value=80 でも黄色で、100 でさえも黄色のままです。このコードは完璧に論理的に書かれているように思えますが、これはつまずくかもしれない落とし穴です。if 文がどう実行されるか考える必要が有ります。ヒントは比較の順序にあります:
if bar_value>=mid_value then --ie if value is greater or equal to 50
cairo_set_source_rgba (cr,mr,mg,mb,ma)--yellow (mid color)

最初のコードは 50 から 100 までのどの数字にマッチします。なので CPU 使用率が 50 から 100 までだった場合、黄色く表示されるのです。スクリプトが実行されると bar_value の値が mid_value の値と等しいか大きい場合に、対応するコードが実行されそこで if 文から抜けます。

bar_value の値が 50 より小さい場合に最初の比較で false が返され、次の比較に移ります。しかし、この比較も false を返すので、最後の else に対応するコードが実行されます。この間違いを正す方法はたくさんありますが、比較の順番を変えることで対処することにします:
if bar_value>=alarm_value then --ie if value is greater or equal to 80
cairo_set_source_rgba (cr,ar,ag,ab,aa)--red (alarm color)
elseif bar_value>=mid_value then --ie if bar_value is greater or equal to 50
cairo_set_source_rgba (cr,mr,mg,mb,ma)--yellow (mid color)
else
cairo_set_source_rgba (cr,lr,lg,lb,la)--green (low color)
end

例えば、90 という値を bar_value に代入してみましょう。まず、90 は 80 以上か? -> はい。最初の比較が通り、対応するコードが実行され、赤く表示されます:
範囲を選択_040
次に、60 を代入してみましょう。まず、60 は 80 以上か? -> いいえ。最初の比較に失敗し、次の比較にうつります。60 は 50 以上か? -> はい。対応するコードが実行され、黄色く表示されます:
範囲を選択_041
最後に、48 を代入してみます。48 は 80 以上か? -> いいえ。最初の比較に失敗し、次の比較にうつります。48 は 50 以上か? -> いいえ。2 番目の比較に失敗し、上2つの条件にマッチしなかったため、else が実行され、緑色に表示されます:
範囲を選択_042
ところで、Conky ウィンドウが常に前面に表示され、邪魔な感じを抱いているでしょう。そこで、.conkyrc の own_window_type を desktop に変更してください:
own_window_type = 'desktop'

このように変更すると Conky ウィンドウの枠まで消えるので、分かりづらいと思い dock に設定していました。

参考元: Using Lua scripts in conky (Part 06), (Part 07)
| Linux |
<< NEW | TOP | OLD>>
スポンサーサイト 01:02
| - |

Show some apps list:


miku

Follow on your feed reader:


About this blog:

Linux Mint-centric chronicle.
Since 2009.
Info 更新日は不定期です。

roadtoapython

roadtorubyist

git